From 6456aba73f0ef3f2fa7fd2b2a69cfdf8624afe23 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 24 May 2020 15:46:26 +0200 Subject: [PATCH] Replacement for Minimal Development Test (PR) (#9450) --- games/minimal/LICENSE.txt | 4 + games/minimal/README.md | 52 + games/minimal/game.conf | 2 +- games/minimal/menu/background.png | Bin 392 -> 152 bytes games/minimal/menu/header.png | Bin 0 -> 210 bytes games/minimal/menu/icon.png | Bin 218 -> 217 bytes games/minimal/mods/basenodes/init.lua | 334 +++ games/minimal/mods/basenodes/mod.conf | 2 + .../basenodes_dirt_with_grass_bottom.png | Bin 0 -> 187 bytes .../textures/basenodes_dirt_with_snow.png | Bin 0 -> 166 bytes .../basenodes_dirt_with_snow_bottom.png | Bin 0 -> 177 bytes .../textures/basenodes_snow_sheet.png | Bin 0 -> 166 bytes .../mods/basenodes/textures/default_apple.png | Bin 0 -> 102 bytes .../basenodes/textures/default_cobble.png | Bin 0 -> 340 bytes .../textures/default_desert_sand.png | Bin 0 -> 293 bytes .../textures/default_desert_stone.png | Bin 0 -> 584 bytes .../mods/basenodes/textures/default_dirt.png | Bin 0 -> 790 bytes .../mods/basenodes/textures/default_grass.png | Bin 0 -> 697 bytes .../basenodes/textures/default_grass_side.png | Bin 0 -> 796 bytes .../basenodes/textures/default_gravel.png | Bin 0 -> 171 bytes .../mods/basenodes/textures/default_ice.png | Bin 0 -> 369 bytes .../textures/default_junglegrass.png | Bin 0 -> 201 bytes .../textures/default_jungleleaves.png | Bin 0 -> 399 bytes .../basenodes/textures/default_jungletree.png | Bin 0 -> 730 bytes .../textures/default_jungletree_top.png | Bin 0 -> 714 bytes .../textures/default_lava.png | Bin .../textures/default_lava_flowing.png | Bin 0 -> 91 bytes .../basenodes/textures/default_leaves.png | Bin 0 -> 883 bytes .../textures/default_mossycobble.png | Bin 0 -> 574 bytes .../textures/default_pine_needles.png | Bin 0 -> 648 bytes .../basenodes/textures/default_pine_tree.png | Bin 0 -> 604 bytes .../textures/default_pine_tree_top.png | Bin 0 -> 174 bytes .../textures/default_river_water.png | Bin 0 -> 496 bytes .../textures/default_river_water_flowing.png | Bin 0 -> 99 bytes .../mods/basenodes/textures/default_sand.png | Bin 0 -> 554 bytes .../mods/basenodes/textures/default_snow.png | Bin 0 -> 166 bytes .../basenodes/textures/default_snow_side.png | Bin 0 -> 152 bytes .../mods/basenodes/textures/default_stone.png | Bin 0 -> 313 bytes .../mods/basenodes/textures/default_tree.png | Bin 0 -> 659 bytes .../basenodes/textures/default_tree_top.png | Bin 0 -> 175 bytes .../textures/default_water.png | Bin .../textures/default_water_flowing.png | Bin 0 -> 115 bytes games/minimal/mods/basetools/init.lua | 295 +++ games/minimal/mods/basetools/mod.conf | 2 + .../basetools/textures/basetools_dirtpick.png | Bin 0 -> 307 bytes .../textures/basetools_firesword.png | Bin 0 -> 190 bytes .../basetools/textures/basetools_icesword.png | Bin 0 -> 190 bytes .../textures/basetools_mesepick.png} | Bin .../basetools/textures/basetools_steelaxe.png | Bin 0 -> 131 bytes .../textures/basetools_steeldagger.png | Bin 0 -> 154 bytes .../textures/basetools_steelpick.png | Bin 0 -> 159 bytes .../textures/basetools_steelpick_l1.png | Bin 0 -> 190 bytes .../textures/basetools_steelpick_l2.png | Bin 0 -> 177 bytes .../textures/basetools_steelshears.png | Bin 0 -> 208 bytes .../textures/basetools_steelshovel.png | Bin 0 -> 140 bytes .../textures/basetools_steelsword.png | Bin 0 -> 163 bytes .../basetools/textures/basetools_stoneaxe.png | Bin 0 -> 130 bytes .../textures/basetools_stonepick.png} | Bin .../textures/basetools_stoneshears.png | Bin 0 -> 224 bytes .../textures/basetools_stoneshovel.png | Bin 0 -> 134 bytes .../textures/basetools_stonesword.png | Bin 0 -> 159 bytes .../basetools/textures/basetools_woodaxe.png | Bin 0 -> 121 bytes .../textures/basetools_woodpick.png} | Bin .../textures/basetools_woodshears.png | Bin 0 -> 212 bytes .../textures/basetools_woodshovel.png | Bin 0 -> 133 bytes .../textures/basetools_woodsword.png | Bin 0 -> 139 bytes games/minimal/mods/bucket/init.lua | 93 +- games/minimal/mods/bucket/mod.conf | 3 +- games/minimal/mods/bucket/textures/bucket.png | Bin 182 -> 163 bytes .../mods/bucket/textures/bucket_lava.png | Bin 183 -> 168 bytes .../mods/bucket/textures/bucket_water.png | Bin 180 -> 168 bytes games/minimal/mods/chest/init.lua | 27 + games/minimal/mods/chest/mod.conf | 2 + .../mods/chest/textures/chest_chest.png | Bin 0 -> 163 bytes .../minimal/mods/chest_of_everything/init.lua | 135 ++ .../minimal/mods/chest_of_everything/mod.conf | 2 + .../textures/chest_of_everything_chest.png | Bin 0 -> 210 bytes games/minimal/mods/default/init.lua | 1837 ----------------- games/minimal/mods/default/mapgen.lua | 137 -- games/minimal/mods/default/mod.conf | 2 - .../sounds/default_grass_footstep.1.ogg | Bin 7014 -> 0 bytes .../mods/default/textures/default_apple.png | Bin 109 -> 0 bytes .../mods/default/textures/default_book.png | Bin 157 -> 0 bytes .../default/textures/default_bookshelf.png | Bin 515 -> 0 bytes .../mods/default/textures/default_brick.png | Bin 457 -> 0 bytes .../default/textures/default_cactus_side.png | Bin 144 -> 0 bytes .../default/textures/default_cactus_top.png | Bin 121 -> 0 bytes .../mods/default/textures/default_chest.png | Bin 263 -> 0 bytes .../mods/default/textures/default_clay.png | Bin 318 -> 0 bytes .../default/textures/default_clay_brick.png | Bin 173 -> 0 bytes .../default/textures/default_clay_lump.png | Bin 140 -> 0 bytes .../mods/default/textures/default_cloud.png | Bin 83 -> 0 bytes .../default/textures/default_coal_lump.png | Bin 138 -> 0 bytes .../mods/default/textures/default_cobble.png | Bin 374 -> 0 bytes .../mods/default/textures/default_dirt.png | Bin 1586 -> 0 bytes .../mods/default/textures/default_fence.png | Bin 480 -> 0 bytes .../textures/default_furnace_fire_bg.png | Bin 220 -> 0 bytes .../textures/default_furnace_fire_fg.png | Bin 719 -> 0 bytes .../textures/default_furnace_front.png | Bin 159 -> 0 bytes .../textures/default_furnace_front_active.png | Bin 283 -> 0 bytes .../default/textures/default_furnace_side.png | Bin 125 -> 0 bytes .../mods/default/textures/default_glass.png | Bin 210 -> 0 bytes .../mods/default/textures/default_grass.png | Bin 782 -> 0 bytes .../textures/default_grass_footsteps.png | Bin 771 -> 0 bytes .../default/textures/default_grass_side.png | Bin 878 -> 0 bytes .../mods/default/textures/default_gravel.png | Bin 172 -> 0 bytes .../default/textures/default_iron_lump.png | Bin 140 -> 0 bytes .../default/textures/default_junglegrass.png | Bin 237 -> 0 bytes .../mods/default/textures/default_ladder.png | Bin 368 -> 0 bytes .../default_lava_flowing_animated.png | Bin 7818 -> 0 bytes .../textures/default_lava_source_animated.png | Bin 3145 -> 0 bytes .../mods/default/textures/default_leaves.png | Bin 1683 -> 0 bytes .../mods/default/textures/default_mese.png | Bin 129 -> 0 bytes .../default/textures/default_mineral_coal.png | Bin 142 -> 0 bytes .../default/textures/default_mineral_iron.png | Bin 922 -> 0 bytes .../default/textures/default_mossycobble.png | Bin 603 -> 0 bytes .../mods/default/textures/default_nc_back.png | Bin 186 -> 0 bytes .../default/textures/default_nc_front.png | Bin 204 -> 0 bytes .../mods/default/textures/default_nc_rb.png | Bin 137 -> 0 bytes .../mods/default/textures/default_nc_side.png | Bin 148 -> 0 bytes .../mods/default/textures/default_paper.png | Bin 139 -> 0 bytes .../mods/default/textures/default_papyrus.png | Bin 165 -> 0 bytes .../mods/default/textures/default_rail.png | Bin 437 -> 0 bytes .../textures/default_rail_crossing.png | Bin 388 -> 0 bytes .../default/textures/default_rail_curved.png | Bin 375 -> 0 bytes .../textures/default_rail_t_junction.png | Bin 374 -> 0 bytes .../default/textures/default_river_water.png | Bin 716 -> 0 bytes .../mods/default/textures/default_sand.png | Bin 762 -> 0 bytes .../default/textures/default_sandstone.png | Bin 744 -> 0 bytes .../mods/default/textures/default_sapling.png | Bin 328 -> 0 bytes .../textures/default_scorched_stuff.png | Bin 164 -> 0 bytes .../default/textures/default_sign_wall.png | Bin 416 -> 0 bytes .../default/textures/default_steel_block.png | Bin 128 -> 0 bytes .../default/textures/default_steel_ingot.png | Bin 144 -> 0 bytes .../mods/default/textures/default_stick.png | Bin 120 -> 0 bytes .../mods/default/textures/default_stone.png | Bin 389 -> 0 bytes .../default/textures/default_tnt_bottom.png | Bin 98 -> 0 bytes .../default/textures/default_tnt_side.png | Bin 129 -> 0 bytes .../mods/default/textures/default_tnt_top.png | Bin 146 -> 0 bytes .../textures/default_tool_steelaxe.png | Bin 140 -> 0 bytes .../textures/default_tool_steelpick.png | Bin 163 -> 0 bytes .../textures/default_tool_steelshovel.png | Bin 144 -> 0 bytes .../textures/default_tool_steelsword.png | Bin 169 -> 0 bytes .../textures/default_tool_stoneaxe.png | Bin 141 -> 0 bytes .../textures/default_tool_stoneshovel.png | Bin 144 -> 0 bytes .../textures/default_tool_stonesword.png | Bin 168 -> 0 bytes .../default/textures/default_tool_woodaxe.png | Bin 134 -> 0 bytes .../textures/default_tool_woodshovel.png | Bin 135 -> 0 bytes .../textures/default_tool_woodsword.png | Bin 147 -> 0 bytes .../mods/default/textures/default_torch.png | Bin 146 -> 0 bytes .../textures/default_torch_on_ceiling.png | Bin 137 -> 0 bytes .../textures/default_torch_on_floor.png | Bin 138 -> 0 bytes .../mods/default/textures/default_tree.png | Bin 1445 -> 0 bytes .../default/textures/default_tree_top.png | Bin 177 -> 0 bytes .../mods/default/textures/default_wood.png | Bin 1400 -> 0 bytes .../mods/default/textures/treeprop.png | Bin 757 -> 0 bytes games/minimal/mods/dignodes/init.lua | 37 + games/minimal/mods/dignodes/mod.conf | 2 + .../dignodes/textures/dignodes_choppy.png | Bin 0 -> 187 bytes .../dignodes/textures/dignodes_cracky.png | Bin 0 -> 193 bytes .../dignodes/textures/dignodes_crumbly.png | Bin 0 -> 172 bytes .../textures/dignodes_dig_immediate.png | Bin 0 -> 170 bytes .../mods/dignodes/textures/dignodes_none.png | Bin 0 -> 201 bytes .../dignodes/textures/dignodes_rating1.png | Bin 0 -> 94 bytes .../dignodes/textures/dignodes_rating2.png | Bin 0 -> 92 bytes .../dignodes/textures/dignodes_rating3.png | Bin 0 -> 93 bytes games/minimal/mods/experimental/commands.lua | 215 ++ games/minimal/mods/experimental/detached.lua | 29 + games/minimal/mods/experimental/init.lua | 817 +------- games/minimal/mods/experimental/items.lua | 103 + games/minimal/mods/experimental/mod.conf | 3 +- .../minimal/mods/experimental/modchannels.lua | 16 - .../textures/experimental_callback_node.png | Bin 0 -> 139 bytes .../textures/experimental_dummyball.png | Bin 399 -> 0 bytes .../textures/experimental_particle_sheet.png | Bin 0 -> 208 bytes .../experimental_particle_vertical.png | Bin 0 -> 308 bytes .../textures/experimental_tester_tool_1.png | Bin 160 -> 138 bytes .../textures/experimental_tiled.png | Bin 1041 -> 0 bytes .../minimal/mods/give_initial_stuff/init.lua | 47 +- .../minimal/mods/give_initial_stuff/mod.conf | 2 +- games/minimal/mods/initial_message/init.lua | 9 + games/minimal/mods/initial_message/mod.conf | 2 + games/minimal/mods/legacy/init.lua | 128 -- games/minimal/mods/legacy/mod.conf | 3 - .../mods/legacy/textures/apple_iron.png | Bin 119 -> 0 bytes .../mods/legacy/textures/cooked_rat.png | Bin 145 -> 0 bytes .../mods/legacy/textures/dungeon_master.png | Bin 3007 -> 0 bytes .../minimal/mods/legacy/textures/fireball.png | Bin 279 -> 0 bytes .../minimal/mods/legacy/textures/firefly.png | Bin 99 -> 0 bytes .../minimal/mods/legacy/textures/oerkki1.png | Bin 165 -> 0 bytes .../mods/legacy/textures/oerkki1_damaged.png | Bin 210 -> 0 bytes games/minimal/mods/legacy/textures/rat.png | Bin 141 -> 0 bytes games/minimal/mods/mapgen/init.lua | 81 + games/minimal/mods/mapgen/mod.conf | 3 + games/minimal/mods/modchannels/init.lua | 14 + games/minimal/mods/modchannels/mod.conf | 2 + games/minimal/mods/soundstuff/init.lua | 170 ++ games/minimal/mods/soundstuff/mod.conf | 2 + .../soundstuff/sounds/soundstuff_mono.ogg | Bin 0 -> 4362 bytes .../soundstuff/textures/soundstuff_eat.png | Bin 0 -> 113 bytes .../textures/soundstuff_node_blank.png | Bin 0 -> 83 bytes .../textures/soundstuff_node_climbable.png | Bin 0 -> 189 bytes .../textures/soundstuff_node_dig.png | Bin 0 -> 126 bytes .../textures/soundstuff_node_dug.png | Bin 0 -> 132 bytes .../textures/soundstuff_node_fall.png | Bin 0 -> 100 bytes .../textures/soundstuff_node_footstep.png | Bin 0 -> 120 bytes .../textures/soundstuff_node_place.png | Bin 0 -> 115 bytes .../textures/soundstuff_node_place_failed.png | Bin 0 -> 143 bytes .../textures/soundstuff_node_sound.png | Bin 0 -> 116 bytes games/minimal/mods/stairs/init.lua | 52 +- games/minimal/mods/stairs/mod.conf | 2 +- games/minimal/mods/test/crafting.lua | 71 - games/minimal/mods/test/formspec.lua | 298 --- games/minimal/mods/test/init.lua | 15 - games/minimal/mods/test/mod.conf | 3 - .../mods/test/textures/test_animation.png | Bin 3161 -> 0 bytes games/minimal/mods/test/textures/test_bg.png | Bin 972 -> 0 bytes .../mods/test/textures/test_bg_9slice.png | Bin 1017 -> 0 bytes .../test/textures/test_bg_9slice_hovered.png | Bin 1016 -> 0 bytes .../test/textures/test_bg_9slice_pressed.png | Bin 1016 -> 0 bytes .../mods/test/textures/test_bg_hovered.png | Bin 972 -> 0 bytes .../mods/test/textures/test_bg_pressed.png | Bin 971 -> 0 bytes games/minimal/mods/testentities/armor.lua | 41 + games/minimal/mods/testentities/callbacks.lua | 75 + games/minimal/mods/testentities/init.lua | 3 + games/minimal/mods/testentities/mod.conf | 2 + .../textures/testentities_armorball.png | Bin 0 -> 561 bytes .../textures/testentities_callback.png | Bin 0 -> 156 bytes .../textures/testentities_callback_step.png | Bin 0 -> 166 bytes .../textures/testentities_cube1.png | Bin 0 -> 130 bytes .../textures/testentities_cube2.png | Bin 0 -> 128 bytes .../textures/testentities_cube3.png | Bin 0 -> 124 bytes .../textures/testentities_cube4.png | Bin 0 -> 126 bytes .../textures/testentities_cube5.png | Bin 0 -> 126 bytes .../textures/testentities_cube6.png | Bin 0 -> 126 bytes .../textures/testentities_dungeon_master.png | Bin 0 -> 2855 bytes .../textures/testentities_sprite.png | Bin 0 -> 120 bytes .../textures/testentities_upright_sprite1.png | Bin 0 -> 114 bytes .../textures/testentities_upright_sprite2.png | Bin 0 -> 119 bytes games/minimal/mods/testentities/visuals.lua | 74 + games/minimal/mods/testfood/init.lua | 24 + games/minimal/mods/testfood/mod.conf | 2 + .../mods/testfood/textures/testfood_bad.png | Bin 0 -> 126 bytes .../mods/testfood/textures/testfood_bad2.png | Bin 0 -> 133 bytes .../mods/testfood/textures/testfood_good.png | Bin 0 -> 129 bytes .../mods/testfood/textures/testfood_good2.png | Bin 0 -> 145 bytes games/minimal/mods/testformspec/callbacks.lua | 51 + .../minimal/mods/testformspec/dummy_items.lua | 14 + games/minimal/mods/testformspec/formspec.lua | 381 ++++ games/minimal/mods/testformspec/init.lua | 3 + games/minimal/mods/testformspec/mod.conf | 2 + .../textures/testformspec_animation.jpg} | Bin .../textures/testformspec_animation.png | Bin 0 -> 214 bytes .../testformspec/textures/testformspec_bg.png | Bin 0 -> 92 bytes .../textures/testformspec_bg_9slice.png | Bin 0 -> 146 bytes .../testformspec_bg_9slice_hovered.png | Bin 0 -> 146 bytes .../testformspec_bg_9slice_pressed.png | Bin 0 -> 146 bytes .../textures/testformspec_bg_hovered.png | Bin 0 -> 92 bytes .../textures/testformspec_bg_pressed.png | Bin 0 -> 91 bytes .../textures/testformspec_button_image.png | Bin 0 -> 146 bytes .../textures/testformspec_hovered.png | Bin 0 -> 195 bytes .../textures/testformspec_item.png | Bin 0 -> 182 bytes .../textures/testformspec_node.png | Bin 0 -> 113 bytes .../textures/testformspec_pressed.png | Bin 0 -> 165 bytes games/minimal/mods/testnodes/README.md | 11 + games/minimal/mods/testnodes/drawtypes.lua | 517 +++++ games/minimal/mods/testnodes/init.lua | 10 + games/minimal/mods/testnodes/light.lua | 48 + games/minimal/mods/testnodes/liquids.lua | 91 + games/minimal/mods/testnodes/meshes.lua | 145 ++ games/minimal/mods/testnodes/mod.conf | 2 + .../testnodes/models/testnodes_ocorner.obj | 23 + .../testnodes/models/testnodes_pyramid.obj | 24 + games/minimal/mods/testnodes/nodeboxes.lua | 80 + games/minimal/mods/testnodes/param2.lua | 168 ++ games/minimal/mods/testnodes/properties.lua | 270 +++ games/minimal/mods/testnodes/settingtypes.txt | 4 + games/minimal/mods/testnodes/textures.lua | 67 + .../mods/testnodes/textures/testnodes_1.png | Bin 0 -> 107 bytes .../mods/testnodes/textures/testnodes_1g.png | Bin 0 -> 104 bytes .../mods/testnodes/textures/testnodes_1w.png | Bin 0 -> 121 bytes .../mods/testnodes/textures/testnodes_1wg.png | Bin 0 -> 122 bytes .../mods/testnodes/textures/testnodes_2.png | Bin 0 -> 112 bytes .../mods/testnodes/textures/testnodes_2g.png | Bin 0 -> 110 bytes .../mods/testnodes/textures/testnodes_2w.png | Bin 0 -> 134 bytes .../mods/testnodes/textures/testnodes_2wg.png | Bin 0 -> 135 bytes .../mods/testnodes/textures/testnodes_3.png | Bin 0 -> 105 bytes .../mods/testnodes/textures/testnodes_3g.png | Bin 0 -> 103 bytes .../mods/testnodes/textures/testnodes_3w.png | Bin 0 -> 112 bytes .../mods/testnodes/textures/testnodes_3wg.png | Bin 0 -> 112 bytes .../mods/testnodes/textures/testnodes_4.png | Bin 0 -> 97 bytes .../mods/testnodes/textures/testnodes_4g.png | Bin 0 -> 95 bytes .../mods/testnodes/textures/testnodes_4w.png | Bin 0 -> 128 bytes .../mods/testnodes/textures/testnodes_4wg.png | Bin 0 -> 128 bytes .../mods/testnodes/textures/testnodes_5.png | Bin 0 -> 98 bytes .../mods/testnodes/textures/testnodes_5g.png | Bin 0 -> 98 bytes .../mods/testnodes/textures/testnodes_5w.png | Bin 0 -> 117 bytes .../mods/testnodes/textures/testnodes_5wg.png | Bin 0 -> 117 bytes .../mods/testnodes/textures/testnodes_6.png | Bin 0 -> 100 bytes .../mods/testnodes/textures/testnodes_6g.png | Bin 0 -> 98 bytes .../mods/testnodes/textures/testnodes_6w.png | Bin 0 -> 117 bytes .../mods/testnodes/textures/testnodes_6wg.png | Bin 0 -> 117 bytes .../testnodes/textures/testnodes_airlike.png | Bin 0 -> 92 bytes .../testnodes/textures/testnodes_allfaces.png | Bin 0 -> 150 bytes .../textures/testnodes_allfaces_optional.png | Bin 0 -> 150 bytes .../testnodes/textures/testnodes_alpha.png | Bin 0 -> 96 bytes .../testnodes/textures/testnodes_alpha128.png | Bin 0 -> 136 bytes .../testnodes/textures/testnodes_alpha191.png | Bin 0 -> 132 bytes .../testnodes/textures/testnodes_alpha64.png | Bin 0 -> 134 bytes .../testnodes/textures/testnodes_anim.png | Bin 0 -> 274 bytes .../textures/testnodes_attached_bottom.png | Bin 0 -> 86 bytes .../textures/testnodes_attached_side.png | Bin 0 -> 98 bytes .../textures/testnodes_attached_top.png | Bin 0 -> 87 bytes .../textures/testnodes_attachedw_bottom.png | Bin 0 -> 130 bytes .../textures/testnodes_attachedw_side.png | Bin 0 -> 122 bytes .../textures/testnodes_attachedw_top.png | Bin 0 -> 109 bytes .../testnodes/textures/testnodes_bouncy.png | Bin 0 -> 106 bytes .../textures/testnodes_buildable_to.png | Bin 0 -> 89 bytes .../testnodes_climbable_nojump_side.png | Bin 0 -> 164 bytes .../textures/testnodes_climbable_side.png | Bin 0 -> 150 bytes .../testnodes/textures/testnodes_damage.png | Bin 0 -> 108 bytes .../textures/testnodes_damage_neg.png | Bin 0 -> 121 bytes .../testnodes/textures/testnodes_drowning.png | Bin 0 -> 127 bytes .../textures/testnodes_fall_damage_minus.png | Bin 0 -> 116 bytes .../textures/testnodes_fall_damage_plus.png | Bin 0 -> 117 bytes .../textures/testnodes_fencelike.png | Bin 0 -> 90 bytes .../testnodes/textures/testnodes_firelike.png | Bin 0 -> 149 bytes .../textures/testnodes_glasslike.png | Bin 0 -> 117 bytes .../textures/testnodes_glasslike_detail.png | Bin 0 -> 167 bytes .../textures/testnodes_glasslike_framed.png | Bin 0 -> 88 bytes .../textures/testnodes_glasslike_framed2.png | Bin 0 -> 118 bytes .../testnodes_glasslike_framed_optional.png | Bin 0 -> 128 bytes .../textures/testnodes_glasslikeliquid.png | Bin 0 -> 122 bytes .../testnodes/textures/testnodes_light.png | Bin 0 -> 117 bytes .../testnodes/textures/testnodes_light_1.png | Bin 0 -> 158 bytes .../testnodes/textures/testnodes_light_10.png | Bin 0 -> 147 bytes .../testnodes/textures/testnodes_light_11.png | Bin 0 -> 149 bytes .../testnodes/textures/testnodes_light_12.png | Bin 0 -> 138 bytes .../testnodes/textures/testnodes_light_13.png | Bin 0 -> 137 bytes .../testnodes/textures/testnodes_light_14.png | Bin 0 -> 132 bytes .../testnodes/textures/testnodes_light_2.png | Bin 0 -> 152 bytes .../testnodes/textures/testnodes_light_3.png | Bin 0 -> 150 bytes .../testnodes/textures/testnodes_light_4.png | Bin 0 -> 157 bytes .../testnodes/textures/testnodes_light_5.png | Bin 0 -> 150 bytes .../testnodes/textures/testnodes_light_6.png | Bin 0 -> 154 bytes .../testnodes/textures/testnodes_light_7.png | Bin 0 -> 146 bytes .../testnodes/textures/testnodes_light_8.png | Bin 0 -> 139 bytes .../testnodes/textures/testnodes_light_9.png | Bin 0 -> 149 bytes .../textures/testnodes_line_crossing.png | Bin 0 -> 130 bytes .../textures/testnodes_line_curved.png | Bin 0 -> 123 bytes .../textures/testnodes_line_straight.png | Bin 0 -> 115 bytes .../textures/testnodes_line_t_junction.png | Bin 0 -> 128 bytes .../testnodes/textures/testnodes_liquid.png | Bin 0 -> 95 bytes .../textures/testnodes_liquidflowing.png | Bin 0 -> 132 bytes .../textures/testnodes_liquidflowing_r0.png | Bin 0 -> 162 bytes .../textures/testnodes_liquidflowing_r1.png | Bin 0 -> 160 bytes .../textures/testnodes_liquidflowing_r2.png | Bin 0 -> 154 bytes .../textures/testnodes_liquidflowing_r3.png | Bin 0 -> 155 bytes .../textures/testnodes_liquidflowing_r4.png | Bin 0 -> 154 bytes .../textures/testnodes_liquidflowing_r5.png | Bin 0 -> 155 bytes .../textures/testnodes_liquidflowing_r6.png | Bin 0 -> 155 bytes .../textures/testnodes_liquidflowing_r7.png | Bin 0 -> 157 bytes .../textures/testnodes_liquidflowing_r8.png | Bin 0 -> 152 bytes .../textures/testnodes_liquidsource.png | Bin 0 -> 128 bytes .../textures/testnodes_liquidsource_r0.png | Bin 0 -> 149 bytes .../textures/testnodes_liquidsource_r1.png | Bin 0 -> 152 bytes .../textures/testnodes_liquidsource_r2.png | Bin 0 -> 152 bytes .../textures/testnodes_liquidsource_r3.png | Bin 0 -> 152 bytes .../textures/testnodes_liquidsource_r4.png | Bin 0 -> 155 bytes .../textures/testnodes_liquidsource_r5.png | Bin 0 -> 150 bytes .../textures/testnodes_liquidsource_r6.png | Bin 0 -> 148 bytes .../textures/testnodes_liquidsource_r7.png | Bin 0 -> 154 bytes .../textures/testnodes_liquidsource_r8.png | Bin 0 -> 148 bytes .../textures/testnodes_mesh_stripes.png | Bin 0 -> 150 bytes .../textures/testnodes_mesh_stripes2.png | Bin 0 -> 144 bytes .../textures/testnodes_mesh_stripes3.png | Bin 0 -> 85 bytes .../textures/testnodes_mesh_stripes4.png | Bin 0 -> 93 bytes .../testnodes/textures/testnodes_node.png | Bin 0 -> 89 bytes .../textures/testnodes_node_falling.png | Bin 0 -> 112 bytes .../testnodes/textures/testnodes_nodebox.png | Bin 0 -> 112 bytes .../textures/testnodes_nojump_side.png | Bin 0 -> 94 bytes .../textures/testnodes_nojump_top.png | Bin 0 -> 121 bytes .../testnodes/textures/testnodes_normal.png | Bin 0 -> 92 bytes .../testnodes/textures/testnodes_normal1.png | Bin 0 -> 114 bytes .../testnodes/textures/testnodes_normal2.png | Bin 0 -> 122 bytes .../testnodes/textures/testnodes_normal3.png | Bin 0 -> 114 bytes .../testnodes/textures/testnodes_normal4.png | Bin 0 -> 106 bytes .../testnodes/textures/testnodes_normal5.png | Bin 0 -> 109 bytes .../testnodes/textures/testnodes_normal6.png | Bin 0 -> 111 bytes .../textures/testnodes_palette_facedir.png | Bin 0 -> 87 bytes .../textures/testnodes_palette_full.png | Bin 0 -> 568 bytes .../testnodes_palette_wallmounted.png | Bin 0 -> 136 bytes .../textures/testnodes_plantlike.png | Bin 0 -> 183 bytes .../testnodes_plantlike_degrotate.png | Bin 0 -> 176 bytes .../textures/testnodes_plantlike_leveled.png | Bin 0 -> 163 bytes .../testnodes_plantlike_meshoptions.png | Bin 0 -> 164 bytes .../textures/testnodes_plantlike_rooted.png | Bin 0 -> 182 bytes .../testnodes_plantlike_rooted_base.png | Bin 0 -> 101 bytes ...s_plantlike_rooted_base_side_degrotate.png | Bin 0 -> 145 bytes ...des_plantlike_rooted_base_side_leveled.png | Bin 0 -> 127 bytes ...plantlike_rooted_base_side_meshoptions.png | Bin 0 -> 128 bytes ...odes_plantlike_rooted_base_side_waving.png | Bin 0 -> 126 bytes .../testnodes_plantlike_rooted_degrotate.png | Bin 0 -> 176 bytes .../testnodes_plantlike_rooted_leveled.png | Bin 0 -> 162 bytes ...testnodes_plantlike_rooted_meshoptions.png | Bin 0 -> 162 bytes .../testnodes_plantlike_rooted_waving.png | Bin 0 -> 125 bytes .../textures/testnodes_plantlike_waving.png | Bin 0 -> 127 bytes .../textures/testnodes_rail2_crossing.png | Bin 0 -> 246 bytes .../textures/testnodes_rail2_curved.png | Bin 0 -> 253 bytes .../textures/testnodes_rail2_straight.png | Bin 0 -> 246 bytes .../textures/testnodes_rail2_t_junction.png | Bin 0 -> 254 bytes .../textures/testnodes_rail_crossing.png | Bin 0 -> 151 bytes .../textures/testnodes_rail_curved.png | Bin 0 -> 164 bytes .../textures/testnodes_rail_straight.png | Bin 0 -> 133 bytes .../textures/testnodes_rail_t_junction.png | Bin 0 -> 202 bytes .../testnodes/textures/testnodes_signlike.png | Bin 0 -> 150 bytes .../testnodes/textures/testnodes_slippery.png | Bin 0 -> 111 bytes .../textures/testnodes_street_crossing.png | Bin 0 -> 137 bytes .../textures/testnodes_street_curved.png | Bin 0 -> 115 bytes .../textures/testnodes_street_straight.png | Bin 0 -> 101 bytes .../textures/testnodes_street_t_junction.png | Bin 0 -> 126 bytes .../textures/testnodes_sunlight_filter.png | Bin 0 -> 113 bytes .../textures/testnodes_torchlike_ceiling.png | Bin 0 -> 157 bytes .../textures/testnodes_torchlike_floor.png | Bin 0 -> 141 bytes .../textures/testnodes_torchlike_wall.png | Bin 0 -> 158 bytes games/minimal/mods/testpathfinder/README.md | 15 + games/minimal/mods/testpathfinder/init.lua | 132 ++ games/minimal/mods/testpathfinder/mod.conf | 2 + .../testpathfinder_testpathfinder.png | Bin 0 -> 159 bytes .../textures/testpathfinder_waypoint.png | Bin 0 -> 99 bytes .../textures/testpathfinder_waypoint_end.png | Bin 0 -> 147 bytes .../testpathfinder_waypoint_start.png | Bin 0 -> 139 bytes games/minimal/mods/testtools/README.md | 99 + games/minimal/mods/testtools/init.lua | 691 +++++++ games/minimal/mods/testtools/mod.conf | 2 + .../textures/testtools_entity_rotator.png | Bin 0 -> 151 bytes .../textures/testtools_entity_scaler.png | Bin 0 -> 182 bytes .../textures/testtools_entity_spawner.png | Bin 0 -> 189 bytes .../textures/testtools_falling_node_tool.png | Bin 0 -> 140 bytes .../textures/testtools_node_setter.png | Bin 0 -> 146 bytes .../textures/testtools_object_attacher.png | Bin 0 -> 173 bytes .../textures/testtools_object_editor.png | Bin 0 -> 180 bytes .../textures/testtools_object_mover.png | Bin 0 -> 175 bytes .../textures/testtools_param2tool.png | Bin 0 -> 127 bytes .../testtools/textures/testtools_remover.png | Bin 0 -> 129 bytes games/minimal/mods/tiled/init.lua | 33 + games/minimal/mods/tiled/mod.conf | 3 + .../mods/tiled/textures/tiled_tiled.png | Bin 0 -> 410 bytes games/minimal/mods/unittests/crafting.lua | 120 ++ .../mods/unittests/crafting_prepare.lua | 88 + games/minimal/mods/unittests/init.lua | 16 + games/minimal/mods/unittests/mod.conf | 2 + .../mods/{test => unittests}/player.lua | 51 +- games/minimal/mods/unittests/random.lua | 10 + .../textures/unittests_coal_lump.png | Bin 0 -> 160 bytes .../textures/unittests_iron_lump.png | Bin 0 -> 154 bytes .../textures/unittests_repairable_tool.png | Bin 0 -> 160 bytes .../textures/unittests_steel_ingot.png | Bin 0 -> 159 bytes .../unittests/textures/unittests_stick.png | Bin 0 -> 147 bytes .../unittests/textures/unittests_torch.png | Bin 0 -> 155 bytes .../textures/unittests_unrepairable_tool.png | Bin 0 -> 157 bytes games/minimal/mods/util_commands/init.lua | 137 ++ games/minimal/mods/util_commands/mod.conf | 2 + games/minimal/screenshot.png | Bin 0 -> 133364 bytes games/minimal/settingtypes.txt | 37 + 465 files changed, 5141 insertions(+), 3486 deletions(-) create mode 100644 games/minimal/LICENSE.txt create mode 100644 games/minimal/README.md create mode 100644 games/minimal/menu/header.png create mode 100644 games/minimal/mods/basenodes/init.lua create mode 100644 games/minimal/mods/basenodes/mod.conf create mode 100644 games/minimal/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png create mode 100644 games/minimal/mods/basenodes/textures/basenodes_dirt_with_snow.png create mode 100644 games/minimal/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png create mode 100644 games/minimal/mods/basenodes/textures/basenodes_snow_sheet.png create mode 100644 games/minimal/mods/basenodes/textures/default_apple.png create mode 100644 games/minimal/mods/basenodes/textures/default_cobble.png create mode 100644 games/minimal/mods/basenodes/textures/default_desert_sand.png create mode 100644 games/minimal/mods/basenodes/textures/default_desert_stone.png create mode 100644 games/minimal/mods/basenodes/textures/default_dirt.png create mode 100644 games/minimal/mods/basenodes/textures/default_grass.png create mode 100644 games/minimal/mods/basenodes/textures/default_grass_side.png create mode 100644 games/minimal/mods/basenodes/textures/default_gravel.png create mode 100644 games/minimal/mods/basenodes/textures/default_ice.png create mode 100644 games/minimal/mods/basenodes/textures/default_junglegrass.png create mode 100644 games/minimal/mods/basenodes/textures/default_jungleleaves.png create mode 100644 games/minimal/mods/basenodes/textures/default_jungletree.png create mode 100644 games/minimal/mods/basenodes/textures/default_jungletree_top.png rename games/minimal/mods/{default => basenodes}/textures/default_lava.png (100%) create mode 100644 games/minimal/mods/basenodes/textures/default_lava_flowing.png create mode 100644 games/minimal/mods/basenodes/textures/default_leaves.png create mode 100644 games/minimal/mods/basenodes/textures/default_mossycobble.png create mode 100644 games/minimal/mods/basenodes/textures/default_pine_needles.png create mode 100644 games/minimal/mods/basenodes/textures/default_pine_tree.png create mode 100644 games/minimal/mods/basenodes/textures/default_pine_tree_top.png create mode 100644 games/minimal/mods/basenodes/textures/default_river_water.png create mode 100644 games/minimal/mods/basenodes/textures/default_river_water_flowing.png create mode 100644 games/minimal/mods/basenodes/textures/default_sand.png create mode 100644 games/minimal/mods/basenodes/textures/default_snow.png create mode 100644 games/minimal/mods/basenodes/textures/default_snow_side.png create mode 100644 games/minimal/mods/basenodes/textures/default_stone.png create mode 100644 games/minimal/mods/basenodes/textures/default_tree.png create mode 100644 games/minimal/mods/basenodes/textures/default_tree_top.png rename games/minimal/mods/{default => basenodes}/textures/default_water.png (100%) create mode 100644 games/minimal/mods/basenodes/textures/default_water_flowing.png create mode 100644 games/minimal/mods/basetools/init.lua create mode 100644 games/minimal/mods/basetools/mod.conf create mode 100644 games/minimal/mods/basetools/textures/basetools_dirtpick.png create mode 100644 games/minimal/mods/basetools/textures/basetools_firesword.png create mode 100644 games/minimal/mods/basetools/textures/basetools_icesword.png rename games/minimal/mods/{default/textures/default_tool_mesepick.png => basetools/textures/basetools_mesepick.png} (100%) create mode 100644 games/minimal/mods/basetools/textures/basetools_steelaxe.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steeldagger.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steelpick.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steelpick_l1.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steelpick_l2.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steelshears.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steelshovel.png create mode 100644 games/minimal/mods/basetools/textures/basetools_steelsword.png create mode 100644 games/minimal/mods/basetools/textures/basetools_stoneaxe.png rename games/minimal/mods/{default/textures/default_tool_stonepick.png => basetools/textures/basetools_stonepick.png} (100%) create mode 100644 games/minimal/mods/basetools/textures/basetools_stoneshears.png create mode 100644 games/minimal/mods/basetools/textures/basetools_stoneshovel.png create mode 100644 games/minimal/mods/basetools/textures/basetools_stonesword.png create mode 100644 games/minimal/mods/basetools/textures/basetools_woodaxe.png rename games/minimal/mods/{default/textures/default_tool_woodpick.png => basetools/textures/basetools_woodpick.png} (100%) create mode 100644 games/minimal/mods/basetools/textures/basetools_woodshears.png create mode 100644 games/minimal/mods/basetools/textures/basetools_woodshovel.png create mode 100644 games/minimal/mods/basetools/textures/basetools_woodsword.png create mode 100644 games/minimal/mods/chest/init.lua create mode 100644 games/minimal/mods/chest/mod.conf create mode 100644 games/minimal/mods/chest/textures/chest_chest.png create mode 100644 games/minimal/mods/chest_of_everything/init.lua create mode 100644 games/minimal/mods/chest_of_everything/mod.conf create mode 100644 games/minimal/mods/chest_of_everything/textures/chest_of_everything_chest.png delete mode 100644 games/minimal/mods/default/init.lua delete mode 100644 games/minimal/mods/default/mapgen.lua delete mode 100644 games/minimal/mods/default/mod.conf delete mode 100644 games/minimal/mods/default/sounds/default_grass_footstep.1.ogg delete mode 100644 games/minimal/mods/default/textures/default_apple.png delete mode 100644 games/minimal/mods/default/textures/default_book.png delete mode 100644 games/minimal/mods/default/textures/default_bookshelf.png delete mode 100644 games/minimal/mods/default/textures/default_brick.png delete mode 100644 games/minimal/mods/default/textures/default_cactus_side.png delete mode 100644 games/minimal/mods/default/textures/default_cactus_top.png delete mode 100644 games/minimal/mods/default/textures/default_chest.png delete mode 100644 games/minimal/mods/default/textures/default_clay.png delete mode 100644 games/minimal/mods/default/textures/default_clay_brick.png delete mode 100644 games/minimal/mods/default/textures/default_clay_lump.png delete mode 100644 games/minimal/mods/default/textures/default_cloud.png delete mode 100644 games/minimal/mods/default/textures/default_coal_lump.png delete mode 100644 games/minimal/mods/default/textures/default_cobble.png delete mode 100644 games/minimal/mods/default/textures/default_dirt.png delete mode 100644 games/minimal/mods/default/textures/default_fence.png delete mode 100644 games/minimal/mods/default/textures/default_furnace_fire_bg.png delete mode 100644 games/minimal/mods/default/textures/default_furnace_fire_fg.png delete mode 100644 games/minimal/mods/default/textures/default_furnace_front.png delete mode 100644 games/minimal/mods/default/textures/default_furnace_front_active.png delete mode 100644 games/minimal/mods/default/textures/default_furnace_side.png delete mode 100644 games/minimal/mods/default/textures/default_glass.png delete mode 100644 games/minimal/mods/default/textures/default_grass.png delete mode 100644 games/minimal/mods/default/textures/default_grass_footsteps.png delete mode 100644 games/minimal/mods/default/textures/default_grass_side.png delete mode 100644 games/minimal/mods/default/textures/default_gravel.png delete mode 100644 games/minimal/mods/default/textures/default_iron_lump.png delete mode 100644 games/minimal/mods/default/textures/default_junglegrass.png delete mode 100644 games/minimal/mods/default/textures/default_ladder.png delete mode 100644 games/minimal/mods/default/textures/default_lava_flowing_animated.png delete mode 100644 games/minimal/mods/default/textures/default_lava_source_animated.png delete mode 100644 games/minimal/mods/default/textures/default_leaves.png delete mode 100644 games/minimal/mods/default/textures/default_mese.png delete mode 100644 games/minimal/mods/default/textures/default_mineral_coal.png delete mode 100644 games/minimal/mods/default/textures/default_mineral_iron.png delete mode 100644 games/minimal/mods/default/textures/default_mossycobble.png delete mode 100644 games/minimal/mods/default/textures/default_nc_back.png delete mode 100644 games/minimal/mods/default/textures/default_nc_front.png delete mode 100644 games/minimal/mods/default/textures/default_nc_rb.png delete mode 100644 games/minimal/mods/default/textures/default_nc_side.png delete mode 100644 games/minimal/mods/default/textures/default_paper.png delete mode 100644 games/minimal/mods/default/textures/default_papyrus.png delete mode 100644 games/minimal/mods/default/textures/default_rail.png delete mode 100644 games/minimal/mods/default/textures/default_rail_crossing.png delete mode 100644 games/minimal/mods/default/textures/default_rail_curved.png delete mode 100644 games/minimal/mods/default/textures/default_rail_t_junction.png delete mode 100644 games/minimal/mods/default/textures/default_river_water.png delete mode 100644 games/minimal/mods/default/textures/default_sand.png delete mode 100644 games/minimal/mods/default/textures/default_sandstone.png delete mode 100644 games/minimal/mods/default/textures/default_sapling.png delete mode 100644 games/minimal/mods/default/textures/default_scorched_stuff.png delete mode 100644 games/minimal/mods/default/textures/default_sign_wall.png delete mode 100644 games/minimal/mods/default/textures/default_steel_block.png delete mode 100644 games/minimal/mods/default/textures/default_steel_ingot.png delete mode 100644 games/minimal/mods/default/textures/default_stick.png delete mode 100644 games/minimal/mods/default/textures/default_stone.png delete mode 100644 games/minimal/mods/default/textures/default_tnt_bottom.png delete mode 100644 games/minimal/mods/default/textures/default_tnt_side.png delete mode 100644 games/minimal/mods/default/textures/default_tnt_top.png delete mode 100644 games/minimal/mods/default/textures/default_tool_steelaxe.png delete mode 100644 games/minimal/mods/default/textures/default_tool_steelpick.png delete mode 100644 games/minimal/mods/default/textures/default_tool_steelshovel.png delete mode 100644 games/minimal/mods/default/textures/default_tool_steelsword.png delete mode 100644 games/minimal/mods/default/textures/default_tool_stoneaxe.png delete mode 100644 games/minimal/mods/default/textures/default_tool_stoneshovel.png delete mode 100644 games/minimal/mods/default/textures/default_tool_stonesword.png delete mode 100644 games/minimal/mods/default/textures/default_tool_woodaxe.png delete mode 100644 games/minimal/mods/default/textures/default_tool_woodshovel.png delete mode 100644 games/minimal/mods/default/textures/default_tool_woodsword.png delete mode 100644 games/minimal/mods/default/textures/default_torch.png delete mode 100644 games/minimal/mods/default/textures/default_torch_on_ceiling.png delete mode 100644 games/minimal/mods/default/textures/default_torch_on_floor.png delete mode 100644 games/minimal/mods/default/textures/default_tree.png delete mode 100644 games/minimal/mods/default/textures/default_tree_top.png delete mode 100644 games/minimal/mods/default/textures/default_wood.png delete mode 100644 games/minimal/mods/default/textures/treeprop.png create mode 100644 games/minimal/mods/dignodes/init.lua create mode 100644 games/minimal/mods/dignodes/mod.conf create mode 100644 games/minimal/mods/dignodes/textures/dignodes_choppy.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_cracky.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_crumbly.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_dig_immediate.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_none.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_rating1.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_rating2.png create mode 100644 games/minimal/mods/dignodes/textures/dignodes_rating3.png create mode 100644 games/minimal/mods/experimental/commands.lua create mode 100644 games/minimal/mods/experimental/detached.lua create mode 100644 games/minimal/mods/experimental/items.lua delete mode 100644 games/minimal/mods/experimental/modchannels.lua create mode 100644 games/minimal/mods/experimental/textures/experimental_callback_node.png delete mode 100644 games/minimal/mods/experimental/textures/experimental_dummyball.png create mode 100644 games/minimal/mods/experimental/textures/experimental_particle_sheet.png create mode 100644 games/minimal/mods/experimental/textures/experimental_particle_vertical.png delete mode 100644 games/minimal/mods/experimental/textures/experimental_tiled.png create mode 100644 games/minimal/mods/initial_message/init.lua create mode 100644 games/minimal/mods/initial_message/mod.conf delete mode 100644 games/minimal/mods/legacy/init.lua delete mode 100644 games/minimal/mods/legacy/mod.conf delete mode 100644 games/minimal/mods/legacy/textures/apple_iron.png delete mode 100644 games/minimal/mods/legacy/textures/cooked_rat.png delete mode 100644 games/minimal/mods/legacy/textures/dungeon_master.png delete mode 100644 games/minimal/mods/legacy/textures/fireball.png delete mode 100644 games/minimal/mods/legacy/textures/firefly.png delete mode 100644 games/minimal/mods/legacy/textures/oerkki1.png delete mode 100644 games/minimal/mods/legacy/textures/oerkki1_damaged.png delete mode 100644 games/minimal/mods/legacy/textures/rat.png create mode 100644 games/minimal/mods/mapgen/init.lua create mode 100644 games/minimal/mods/mapgen/mod.conf create mode 100644 games/minimal/mods/modchannels/init.lua create mode 100644 games/minimal/mods/modchannels/mod.conf create mode 100644 games/minimal/mods/soundstuff/init.lua create mode 100644 games/minimal/mods/soundstuff/mod.conf create mode 100644 games/minimal/mods/soundstuff/sounds/soundstuff_mono.ogg create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_eat.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_blank.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_climbable.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_dig.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_dug.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_fall.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_footstep.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_place.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_place_failed.png create mode 100644 games/minimal/mods/soundstuff/textures/soundstuff_node_sound.png delete mode 100644 games/minimal/mods/test/crafting.lua delete mode 100644 games/minimal/mods/test/formspec.lua delete mode 100644 games/minimal/mods/test/init.lua delete mode 100644 games/minimal/mods/test/mod.conf delete mode 100644 games/minimal/mods/test/textures/test_animation.png delete mode 100644 games/minimal/mods/test/textures/test_bg.png delete mode 100644 games/minimal/mods/test/textures/test_bg_9slice.png delete mode 100644 games/minimal/mods/test/textures/test_bg_9slice_hovered.png delete mode 100644 games/minimal/mods/test/textures/test_bg_9slice_pressed.png delete mode 100644 games/minimal/mods/test/textures/test_bg_hovered.png delete mode 100644 games/minimal/mods/test/textures/test_bg_pressed.png create mode 100644 games/minimal/mods/testentities/armor.lua create mode 100644 games/minimal/mods/testentities/callbacks.lua create mode 100644 games/minimal/mods/testentities/init.lua create mode 100644 games/minimal/mods/testentities/mod.conf create mode 100644 games/minimal/mods/testentities/textures/testentities_armorball.png create mode 100644 games/minimal/mods/testentities/textures/testentities_callback.png create mode 100644 games/minimal/mods/testentities/textures/testentities_callback_step.png create mode 100644 games/minimal/mods/testentities/textures/testentities_cube1.png create mode 100644 games/minimal/mods/testentities/textures/testentities_cube2.png create mode 100644 games/minimal/mods/testentities/textures/testentities_cube3.png create mode 100644 games/minimal/mods/testentities/textures/testentities_cube4.png create mode 100644 games/minimal/mods/testentities/textures/testentities_cube5.png create mode 100644 games/minimal/mods/testentities/textures/testentities_cube6.png create mode 100644 games/minimal/mods/testentities/textures/testentities_dungeon_master.png create mode 100644 games/minimal/mods/testentities/textures/testentities_sprite.png create mode 100644 games/minimal/mods/testentities/textures/testentities_upright_sprite1.png create mode 100644 games/minimal/mods/testentities/textures/testentities_upright_sprite2.png create mode 100644 games/minimal/mods/testentities/visuals.lua create mode 100644 games/minimal/mods/testfood/init.lua create mode 100644 games/minimal/mods/testfood/mod.conf create mode 100644 games/minimal/mods/testfood/textures/testfood_bad.png create mode 100644 games/minimal/mods/testfood/textures/testfood_bad2.png create mode 100644 games/minimal/mods/testfood/textures/testfood_good.png create mode 100644 games/minimal/mods/testfood/textures/testfood_good2.png create mode 100644 games/minimal/mods/testformspec/callbacks.lua create mode 100644 games/minimal/mods/testformspec/dummy_items.lua create mode 100644 games/minimal/mods/testformspec/formspec.lua create mode 100644 games/minimal/mods/testformspec/init.lua create mode 100644 games/minimal/mods/testformspec/mod.conf rename games/minimal/mods/{test/textures/test_animation.jpg => testformspec/textures/testformspec_animation.jpg} (100%) create mode 100644 games/minimal/mods/testformspec/textures/testformspec_animation.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_bg.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_bg_9slice.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_bg_9slice_hovered.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_bg_9slice_pressed.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_bg_hovered.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_bg_pressed.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_button_image.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_hovered.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_item.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_node.png create mode 100644 games/minimal/mods/testformspec/textures/testformspec_pressed.png create mode 100644 games/minimal/mods/testnodes/README.md create mode 100644 games/minimal/mods/testnodes/drawtypes.lua create mode 100644 games/minimal/mods/testnodes/init.lua create mode 100644 games/minimal/mods/testnodes/light.lua create mode 100644 games/minimal/mods/testnodes/liquids.lua create mode 100644 games/minimal/mods/testnodes/meshes.lua create mode 100644 games/minimal/mods/testnodes/mod.conf create mode 100644 games/minimal/mods/testnodes/models/testnodes_ocorner.obj create mode 100644 games/minimal/mods/testnodes/models/testnodes_pyramid.obj create mode 100644 games/minimal/mods/testnodes/nodeboxes.lua create mode 100644 games/minimal/mods/testnodes/param2.lua create mode 100644 games/minimal/mods/testnodes/properties.lua create mode 100644 games/minimal/mods/testnodes/settingtypes.txt create mode 100644 games/minimal/mods/testnodes/textures.lua create mode 100644 games/minimal/mods/testnodes/textures/testnodes_1.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_1g.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_1w.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_1wg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_2g.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_2w.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_2wg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_3.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_3g.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_3w.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_3wg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_4.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_4g.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_4w.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_4wg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_5.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_5g.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_5w.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_5wg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_6.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_6g.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_6w.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_6wg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_airlike.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_allfaces.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_allfaces_optional.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_alpha.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_alpha128.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_alpha191.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_alpha64.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_anim.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_attached_bottom.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_attached_side.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_attached_top.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_attachedw_bottom.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_attachedw_side.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_attachedw_top.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_bouncy.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_buildable_to.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_climbable_nojump_side.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_climbable_side.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_damage.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_damage_neg.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_drowning.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_fall_damage_minus.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_fall_damage_plus.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_fencelike.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_firelike.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_glasslike.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_glasslike_detail.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_glasslike_framed.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_glasslike_framed2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_glasslike_framed_optional.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_glasslikeliquid.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_1.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_10.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_11.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_12.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_13.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_14.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_3.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_4.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_5.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_6.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_7.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_8.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_light_9.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_line_crossing.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_line_curved.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_line_straight.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_line_t_junction.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquid.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r0.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r1.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r3.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r4.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r5.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r6.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r7.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r8.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r0.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r1.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r3.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r4.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r5.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r6.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r7.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_liquidsource_r8.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_mesh_stripes.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_mesh_stripes2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_mesh_stripes3.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_mesh_stripes4.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_node.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_node_falling.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_nodebox.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_nojump_side.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_nojump_top.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal1.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal2.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal3.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal4.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal5.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_normal6.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_palette_facedir.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_palette_full.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_palette_wallmounted.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_degrotate.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_leveled.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_meshoptions.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_leveled.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_meshoptions.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_plantlike_waving.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail2_crossing.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail2_curved.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail2_straight.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail2_t_junction.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail_crossing.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail_curved.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail_straight.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_rail_t_junction.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_signlike.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_slippery.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_street_crossing.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_street_curved.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_street_straight.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_street_t_junction.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_sunlight_filter.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_torchlike_ceiling.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_torchlike_floor.png create mode 100644 games/minimal/mods/testnodes/textures/testnodes_torchlike_wall.png create mode 100644 games/minimal/mods/testpathfinder/README.md create mode 100644 games/minimal/mods/testpathfinder/init.lua create mode 100644 games/minimal/mods/testpathfinder/mod.conf create mode 100644 games/minimal/mods/testpathfinder/textures/testpathfinder_testpathfinder.png create mode 100644 games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint.png create mode 100644 games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint_end.png create mode 100644 games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint_start.png create mode 100644 games/minimal/mods/testtools/README.md create mode 100644 games/minimal/mods/testtools/init.lua create mode 100644 games/minimal/mods/testtools/mod.conf create mode 100644 games/minimal/mods/testtools/textures/testtools_entity_rotator.png create mode 100644 games/minimal/mods/testtools/textures/testtools_entity_scaler.png create mode 100644 games/minimal/mods/testtools/textures/testtools_entity_spawner.png create mode 100644 games/minimal/mods/testtools/textures/testtools_falling_node_tool.png create mode 100644 games/minimal/mods/testtools/textures/testtools_node_setter.png create mode 100644 games/minimal/mods/testtools/textures/testtools_object_attacher.png create mode 100644 games/minimal/mods/testtools/textures/testtools_object_editor.png create mode 100644 games/minimal/mods/testtools/textures/testtools_object_mover.png create mode 100644 games/minimal/mods/testtools/textures/testtools_param2tool.png create mode 100644 games/minimal/mods/testtools/textures/testtools_remover.png create mode 100644 games/minimal/mods/tiled/init.lua create mode 100644 games/minimal/mods/tiled/mod.conf create mode 100644 games/minimal/mods/tiled/textures/tiled_tiled.png create mode 100644 games/minimal/mods/unittests/crafting.lua create mode 100644 games/minimal/mods/unittests/crafting_prepare.lua create mode 100644 games/minimal/mods/unittests/init.lua create mode 100644 games/minimal/mods/unittests/mod.conf rename games/minimal/mods/{test => unittests}/player.lua (69%) create mode 100644 games/minimal/mods/unittests/random.lua create mode 100644 games/minimal/mods/unittests/textures/unittests_coal_lump.png create mode 100644 games/minimal/mods/unittests/textures/unittests_iron_lump.png create mode 100644 games/minimal/mods/unittests/textures/unittests_repairable_tool.png create mode 100644 games/minimal/mods/unittests/textures/unittests_steel_ingot.png create mode 100644 games/minimal/mods/unittests/textures/unittests_stick.png create mode 100644 games/minimal/mods/unittests/textures/unittests_torch.png create mode 100644 games/minimal/mods/unittests/textures/unittests_unrepairable_tool.png create mode 100644 games/minimal/mods/util_commands/init.lua create mode 100644 games/minimal/mods/util_commands/mod.conf create mode 100644 games/minimal/screenshot.png create mode 100644 games/minimal/settingtypes.txt diff --git a/games/minimal/LICENSE.txt b/games/minimal/LICENSE.txt new file mode 100644 index 000000000..108c66abf --- /dev/null +++ b/games/minimal/LICENSE.txt @@ -0,0 +1,4 @@ +License information for Developer Test +-------------------------------------- + +The same license as for Minetest applies. diff --git a/games/minimal/README.md b/games/minimal/README.md new file mode 100644 index 000000000..a94530498 --- /dev/null +++ b/games/minimal/README.md @@ -0,0 +1,52 @@ +# Minimal development test + +This is a basic testing environment that contains a bunch of things to test the engine, but it could also be used as a minimal testbed for testing out mods. + +## Features + +* Basic nodes for mapgen +* Basic, minimal map generator +* Lots of example nodes for testing drawtypes, param2, light level, and many other node properties +* Example entities +* Other example items +* Formspec test (via `/test_formspec` command) +* Automated unit tests (disabled by default) +* Tools for manipulating nodes and entities, like the "Param2 Tool" + +## Getting started + +Basically, just create a world and start. A few important things to note: + +* Items are gotten from the “Chest of Everything” (`chest_of_everything:chest`) +* When you lost your initial items, type in `/stuff` command to get them back +* By default, Creative Mode activates infinite node placement. This behavior can be changed with the `devtest_infplace` setting +* Use the `/infplace` command to toggle infinite node placement in-game +* Use the Param2 Tool to change the param2 of nodes; it's useful to experiment with the various drawtype test nodes +* Check out the game settings and server commands for additional tests and features +* Creative Mode does nothing (apart from default engine behavior) + +Confused by a certain node or item? Check out for inline code comments. + +### Example tests + +* You can use this to test what happens if a player is simultaneously in 2 nodes with `damage_per_second` but with a different value. +* Or use the Falling Node Tool on various test nodes to see how they behave when falling. +* You could also use this as a testbed for dependency-free mods, e.g. to test out how your formspecs behave without theming. + +## Random notes + +* Experimental/strange/unstructured tests can be found in the `experimental` mod +* Textures of drawtype test nodes have a red dot at the top left corner. This is to see whether the textures are oriented properly + +## Design philosophy + +This should loosely follow the following principles: + +* Engine testing: The main focus of this is to aid testing of *engine* features, such as mapgen or node drawtypes +* Mod testing: The secondary focus is to help modders as well, either as a minimal testbed for mods or even as a code example +* Minimal interference: Under default settings, it shall not interfere with APIs except on explicit user wish. Non-trivial tests and features need to be enabled by a setting first +* Convenience: Have various tools to make usage easier and more convenient +* Reproducing engine bugs: When an engine bug was found, consider creating a test case +* Clarity: Textures and names need to be designed to keep different things clearly visually apart at a glance +* Low loading time: It must load blazing-fast so stuff can be tested quickly + diff --git a/games/minimal/game.conf b/games/minimal/game.conf index 99bfaf0a4..ae76cf7ad 100644 --- a/games/minimal/game.conf +++ b/games/minimal/game.conf @@ -1,2 +1,2 @@ name = Minimal development test - +description = Testing environment to help with testing the engine features of Minetest. It can also be helpful in mod development. diff --git a/games/minimal/menu/background.png b/games/minimal/menu/background.png index ea5fbdce54e58a08cfbdf97b88162836a2cccd76..415bb3d146a2ff6a8bca17c90c68cfc6638b2183 100644 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoKQJ-_N$KcnwI)^4$>`tsu9V)uSI+p0PC2sT_0 Z!H_UjT<6cfE-V40+tbz0Wt~$(69B>FGWY-h literal 392 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ksKQJ-_$t8*|VnB+y*vT`5gM;JtL;nXrE@y#9 zWHAE+-w_aIoT|+y4HRSx@Ck8s3^4!y|G$Zm=W(DhlAbP(AsP4HUa|H&>>$$m(D-A6 zW>cxVPQ#X$I$Gi);YrK51;dmWMR`@Z73PK?Se(e5b41kE+MtQ`0H21>bC+FCP7Njd zeqG;_+t7guUPxbwDZ6%I?wX1%X_)Ajn(`v2zt aHu~4d>MZC8d*cQSHU>{uKbLh*2~7YzVxFu3 diff --git a/games/minimal/menu/header.png b/games/minimal/menu/header.png new file mode 100644 index 0000000000000000000000000000000000000000..db864d6b7805ca41d711f4f8e72c4df134441e71 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^EkMk}$P6TBX0`_cDYgKg5Z7nVp8fy--_XVTCQyX2 zB*-t=*Q5KXH;_~1>Eakt!I-STzk!9rz+!`efd#`&CK(f8`GBbgf9Kn+?LYXS zQ-1fkqo1Xe`qwkK{(E=-j6&vtGdIeNjUKIC$j2-kAS-{kpS^}hUV`7i;7&e6=O6YY zJ7>0)zqxpL_OKtw`e*y&-@bo!r~b3s*VS)#+~mx-oSE^@T@`1W{+e8%D;PXo{an^L HB{Ts5E96Qf literal 0 HcmV?d00001 diff --git a/games/minimal/menu/icon.png b/games/minimal/menu/icon.png index 8ef6750232b7b0c55777ac407e59528321a91cc9..f854b9c319242b2f5a3d5cb8d4c89a6ffe448859 100644 GIT binary patch delta 201 zcmV;)05<>H0oehN7=Ho-0000gY!MUy000b7OjJbx004l1fH`6v|NsB$+k@!<0004W zQchCo=?vrkCrLClQ^-HTL4e)#<^4|c)`UI_<;CD2}#zHVg?Pvk<#N-Ji>_7?V zEC~(RSn3e<0U&~o0`(ILqeB-b*xj$WpKEj6>F3!2aYPDipMDOY00000NkvXXu0mjf DtNl*f delta 202 zcmV;*05$*F0onnO7=H)@0001B+zGV+000b7OjJbx002QyH-LbE|NsAnQ+%rc0004W zQchCTG6 zn%Pd2pOd{0#8ZF}0QUm6Cq2UtUIHKn5P^aUL2(7(0Pau?bwdCPgX+Kny$xsI0RhmV zEpXm}1wA*gpyvh_^xVJ#<<~&DKzQFLeImw4|8d{l3dZXPm%^ilaR2}S07*qoM6N<$ Ef)V9TumAu6 diff --git a/games/minimal/mods/basenodes/init.lua b/games/minimal/mods/basenodes/init.lua new file mode 100644 index 000000000..8156c4bec --- /dev/null +++ b/games/minimal/mods/basenodes/init.lua @@ -0,0 +1,334 @@ +local WATER_ALPHA = 160 +local WATER_VISC = 1 +local LAVA_VISC = 7 + +-- +-- Node definitions +-- + +-- Register nodes + +minetest.register_node("basenodes:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + groups = {cracky=3}, +}) + +minetest.register_node("basenodes:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + groups = {cracky=3}, +}) + +minetest.register_node("basenodes:dirt_with_grass", { + description = "Dirt with Grass", + tiles ={"default_grass.png", + -- a little dot on the bottom to distinguish it from dirt + "default_dirt.png^basenodes_dirt_with_grass_bottom.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly=3, soil=1}, +}) + +minetest.register_node("basenodes:dirt_with_snow", { + description = "Dirt with Snow", + tiles ={"basenodes_dirt_with_snow.png", + -- a little dot on the bottom to distinguish it from dirt + "default_dirt.png^basenodes_dirt_with_snow_bottom.png", + {name = "default_dirt.png^default_snow_side.png", + tileable_vertical = false}}, + groups = {crumbly=3, soil=1}, +}) + +minetest.register_node("basenodes:dirt", { + description = "Dirt", + tiles ={"default_dirt.png"}, + groups = {crumbly=3, soil=1}, +}) + +minetest.register_node("basenodes:sand", { + description = "Sand", + tiles ={"default_sand.png"}, + groups = {crumbly=3}, +}) + +minetest.register_node("basenodes:desert_sand", { + description = "Desert Sand", + tiles ={"default_desert_sand.png"}, + groups = {crumbly=3}, +}) + +minetest.register_node("basenodes:gravel", { + description = "Gravel", + tiles ={"default_gravel.png"}, + groups = {crumbly=2}, +}) + +minetest.register_node("basenodes:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + tiles ={"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + walkable = false, + groups = {snappy=3}, +}) + +minetest.register_node("basenodes:tree", { + description = "Normal Tree Trunk", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=1}, +}) + +minetest.register_node("basenodes:leaves", { + description = "Normal Leaves", + drawtype = "allfaces_optional", + tiles = {"default_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3}, +}) + +minetest.register_node("basenodes:jungletree", { + description = "Jungle Tree Trunk", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=1}, +}) + +minetest.register_node("basenodes:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + tiles = {"default_jungleleaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3}, +}) + +minetest.register_node("basenodes:pine_tree", { + description = "Pine Tree Trunk", + tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", "default_pine_tree.png"}, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=1}, +}) + +minetest.register_node("basenodes:pine_needles", { + description = "Pine Needles", + drawtype = "allfaces_optional", + tiles = {"default_pine_needles.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3}, +}) + +minetest.register_node("basenodes:water_source", { + description = "Water Source", + drawtype = "liquid", + tiles = {"default_water.png"}, + special_tiles = { + {name = "default_water.png", backface_culling = false}, + {name = "default_water.png", backface_culling = true}, + }, + alpha = WATER_ALPHA, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "basenodes:water_flowing", + liquid_alternative_source = "basenodes:water_source", + liquid_viscosity = WATER_VISC, + post_effect_color = {a = 64, r = 100, g = 100, b = 200}, + groups = {water = 3, liquid = 3}, +}) + +minetest.register_node("basenodes:water_flowing", { + description = "Flowing Water", + drawtype = "flowingliquid", + tiles = {"default_water_flowing.png"}, + special_tiles = { + {name = "default_water_flowing.png", backface_culling = false}, + {name = "default_water_flowing.png", backface_culling = false}, + }, + alpha = WATER_ALPHA, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "basenodes:water_flowing", + liquid_alternative_source = "basenodes:water_source", + liquid_viscosity = WATER_VISC, + post_effect_color = {a = 64, r = 100, g = 100, b = 200}, + groups = {water = 3, liquid = 3}, +}) + +minetest.register_node("basenodes:river_water_source", { + description = "River Water Source", + drawtype = "liquid", + tiles = { "default_river_water.png" }, + special_tiles = { + {name = "default_river_water.png", backface_culling = false}, + {name = "default_river_water.png", backface_culling = true}, + }, + alpha = WATER_ALPHA, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "basenodes:river_water_flowing", + liquid_alternative_source = "basenodes:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, }, +}) + +minetest.register_node("basenodes:river_water_flowing", { + description = "Flowing River Water", + drawtype = "flowingliquid", + tiles = {"default_river_water_flowing.png"}, + special_tiles = { + {name = "default_river_water_flowing.png", backface_culling = false}, + {name = "default_river_water_flowing.png", backface_culling = false}, + }, + alpha = WATER_ALPHA, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "basenodes:river_water_flowing", + liquid_alternative_source = "basenodes:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, }, +}) + +minetest.register_node("basenodes:lava_flowing", { + description = "Flowing Lava", + drawtype = "flowingliquid", + tiles = {"default_lava_flowing.png"}, + special_tiles = { + {name="default_lava_flowing.png", backface_culling = false}, + {name="default_lava_flowing.png", backface_culling = false}, + }, + paramtype = "light", + light_source = minetest.LIGHT_MAX, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drowning = 1, + damage_per_second = 4, + liquidtype = "flowing", + liquid_alternative_flowing = "basenodes:lava_flowing", + liquid_alternative_source = "basenodes:lava_source", + liquid_viscosity = LAVA_VISC, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=1}, +}) + +minetest.register_node("basenodes:lava_source", { + description = "Lava Source", + drawtype = "liquid", + tiles = { "default_lava.png" }, + special_tiles = { + {name = "default_lava.png", backface_culling = false}, + {name = "default_lava.png", backface_culling = true}, + }, + paramtype = "light", + light_source = minetest.LIGHT_MAX, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drowning = 1, + damage_per_second = 4, + liquidtype = "source", + liquid_alternative_flowing = "basenodes:lava_flowing", + liquid_alternative_source = "basenodes:lava_source", + liquid_viscosity = LAVA_VISC, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=1}, +}) + +minetest.register_node("basenodes:cobble", { + description = "Cobblestone", + tiles ={"default_cobble.png"}, + is_ground_content = false, + groups = {cracky=3}, +}) + +minetest.register_node("basenodes:mossycobble", { + description = "Mossy Cobblestone", + tiles ={"default_mossycobble.png"}, + is_ground_content = false, + groups = {cracky=3}, +}) + +minetest.register_node("basenodes:apple", { + description = "Apple", + drawtype = "plantlike", + tiles ={"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + groups = {dig_immediate=3}, + + -- Make eatable because why not? + on_use = minetest.item_eat(2), +}) + +minetest.register_node("basenodes:ice", { + description = "Ice", + tiles ={"default_ice.png"}, + groups = {cracky=3}, +}) + +-- The snow nodes intentionally have different tints to make them more +-- distinguishable +minetest.register_node("basenodes:snow", { + description = "Snow Sheet", + tiles = {"basenodes_snow_sheet.png"}, + groups = {crumbly=3}, + walkable = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, +}) + +minetest.register_node("basenodes:snowblock", { + description = "Snow Block", + tiles ={"default_snow.png"}, + groups = {crumbly=3}, +}) + + diff --git a/games/minimal/mods/basenodes/mod.conf b/games/minimal/mods/basenodes/mod.conf new file mode 100644 index 000000000..25024dc63 --- /dev/null +++ b/games/minimal/mods/basenodes/mod.conf @@ -0,0 +1,2 @@ +name = basenodes +description = Contains basic nodes for mapgen diff --git a/games/minimal/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png b/games/minimal/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8fc41a951f6d48cb260110ef67048a5232361c GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ1=4@sJoxwR!~g&Pv->O> zW_r%v7@j-#e=ksiwIs+d7)UcP9Li?f2&4i$T^vIy7){SyOE=Xm%DI@@Q_jol-E6SNMo~3SdG0E+&(98jni_FYfi1rHKjTg&i92D>cP$6n O!QkoY=d#Wzp$P!-!ae^0 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png b/games/minimal/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..447c94e9860cd8d7a8510ecf768141c4da33f952 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr*{C2iX7ZscdNaU;CTk z#T=dx1{NoYU;pFx3RD@K%2{p@w4?X!p19BJ8@=*3zbn`x(x~FIsZ0N@n3! b-WmGsS2s=H8>;FIbOVE@tDnm{r-UW|q%=ig literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/basenodes_snow_sheet.png b/games/minimal/mods/basenodes/textures/basenodes_snow_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..455332093d1a834e621b648ac62cdf69976c17f0 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u1~+d`v3p`v6q*{Dq3d) z1tUCN978x{Sq~a=H7JNQJhXRL@ASK%a6{M1sk?-&|DnJ`i5u%eZ0>3Pw!5Qx$mE@M znjP!crJL#&%iK~xwS1;GJg1R)3n!CpmSW%S6I{Qs+|0-i?i*2naK z7Z&kkSSJ)Y65B_u_jaOd#Y*7eW6>22rXM_?J;DiV3KW!nHdFwMZ$X4zlh=q#lZ4*o zDk;`mf(uac6wkYE6aF>7EK2GB%!&t}&LQ_100000NkvXXu0mjfG{T9{ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_desert_stone.png b/games/minimal/mods/basenodes/textures/default_desert_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..5126fb61ce84f5c023753a39ed47107c1e69e233 GIT binary patch literal 584 zcmV-O0=NB%P)M=+sNIGj;8$$w_Zdtta= zL483iqEtDzUqH29K#NE*lT0*#LM_5>QG7rvt64mmPd2(>LB3=~o>Di*dSJ$PTfk~f zs#rXTMlii&M5tFgkxMhQT|b*pHpO*Xa5^W&bXbN(FR@%c%7SUgePh6BOU8Iz%!O^x zk9o3OKf7T2VISv`3_D$$dDmQFR2Of%AzfPX?P zbUZ26o{C4ZE5HB%0QE^kK~#7F4a(DDMFA85uybvj&$eyb+JBKY-vK~Sz;J@3Xolr@ zK?F%g6;;y>)3P1c(|rg+I^suTVLTB{x?Cy^nPfJX&lO~{h#;jBQwF1gnq;+B|8L1i zgRB5WH(R0HRNHB(Lza;)C|Iu_3<4@MjEu(igopZc(wRl-!@1c`Q45cRrLtPjHrw8= z#zuyneFkXbAg1#ExQ837MX#`fX(E4IN76@(tgORMhJ#bJkU3XYG1*R~BW;d?@v2@+ zkQX8mki)HU6(N_u-HC_$6ww!SyKfOni`9X7G!O8(O*lH~0`d)iG#_U>hjyHaBx-*H WxFrOtm=sh10000+xj5kBG+jwP?dy=OpTdxIW%S%svYi-AiUwq95neHg?hCz7VnWHWv=)Dt@+7{ zG9yk$tjix{Qdekl_Ycmh6ftmSTdZf+$_P<()8l^eEE301l)&j zPgzWHUtPRR0~_FG^)aeC*V2YeNTaW_wd>dGb*RAH#b}es_^G>U)5gg@K~1JsE{-0v z0A`D8y1L&TY&%$cYrBfdipqnT$G789yi|&^JElE7R3ocRv4*+<>nTzHM=5G!^)%aqz(1wGAfXN%v*Yjt8^_?`gG1 z&);$RzU%0jO?}+_=xVRBAXv!ga z$z&xWeSVb4&(XO?R53R~8Jb?gL!H)|C1iMQ#?79<0v$FGc_eXs-)NrylE3^4-Qh4C z@{|Sc%w?TE+llJ3I7#|;@Tx2&98IsgJB9e|duk4Gx9tuPwp3AEIj^`(<;T;rzBO|k zb>zf#QH)Q*`sE2a9@=S~OL6{o%oB#Wg`}wk66w_9%mFtYMOh=53$us73?bCje;Rml UYvInCO8@`>07*qoM6N<$f@__Gg8%>k literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_grass.png b/games/minimal/mods/basenodes/textures/default_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6397186fbaaceb56eea5c2c314546f09016a67 GIT binary patch literal 697 zcmV;q0!ICbP)l^t)Bw|+Aa?;hI|w<&kB=MGOsmJbTy3SC zm`gVDuG)4Mj$oW6m{?*n+K8RKani|YHZwx(>Z-{0LhemX(Kl5eL~)eoe(c~;07xMo z+tHK(WmjcuFyt0We7-CMbn(TT!90Va5UZPB$^kwX4^<(wWp(5D_*4yMq}+XelIL&c z)El0c4MwDsL+mmKsk1ji{J88FjtwSocTqeKR zMBn^$zMqFx(G!XS?k$%MgsKyAYs5S$mr%kXfmS<$-6#*j5PkT0rlE=BjNnPCmf6-Y zo1^4>)U#;X!!#i_yT5Dx`==P^7I6c&#iXQGs?$Bd8e`~~(faGJzxuk|&%Jzi|N4)O z%dIr^+y!9{#@IsGcJvr(Q`tU#eC#5hx(kMFSyp}5-6ng)jcfzEZkQ0^_`Ofl>nphw z+oRJcaNWS?lW8r0u6~oFWz;O=9X`WB)+)|pFt@nvWgHSO#gqcAtaV+BN!Xk~2Og!K zGL}u9vMw*rQ^U~B^$ITURl4xgFs#?&X|tO2&`aP@@9ZR#^Z2qs2$=@FlkZ>szIK^` zrpIyoDr^WAiQm;Iap<%)o|iWzTNeG#zx*eg>F<9ZUNG5Fg1-3fSgHxzBSOUUXp~aQ za94rJj5hE%cfi>7TCIx~QiQ36E2DvFol=*t$3hJG fj_32BDC_?LK=*Q2k?)<+00000NkvXXu0mjfB~n)> literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_grass_side.png b/games/minimal/mods/basenodes/textures/default_grass_side.png new file mode 100644 index 0000000000000000000000000000000000000000..04770b6f659cab9fb6e146a093c9d2447bbfa274 GIT binary patch literal 796 zcmV+%1LOROP)9;n+h7p>B+Crpq|D58fu5lEZimbKn4c+**;X~vp`T%QbrgsAONU7ds;3&y zwW*tqw?BA^p_}l9OEu3tKHrlB9xrWQG5$5z7b$Y{YRn{OP!5M=Pl&^tFE8*N#qI4g zT{-f2TaY~-sp}Cpw0W+t$d3&|Es^Wp24xGX=K;@hdGr0(X-wm!CoB`6ou%wvGz+7V zGHogImSnkRx!)771JqD~bfj@k3_2rm%usehD~T^GHnGn`S|LMaASFx_q$Ym6XsPQS zd7s{po5U;x%`k9#m(%M3#}B!`t9k2#JxSLzlqn%(n~F?L*7T5W@&p z7dh2wVz*o1YLBV=Xju$JVf5S3%Op|MBHCf)$G?#2%vi z8Rwq1hQNt<^YtC|G+6vTu14xsv0ne5@Fc7@F->8y2^_|wCW`iy znae}k^8FA0QkNrt{d0rigWanetZ%=2jk+6A-hgGsEz15MZQ&UjmX`L;&i0s?`>n0`v$OxNultsk_^hn=w6y=3nfuPp_mq_N z&CT}G()^j3{IRk9m6i6?)cy%!8J++D0Io?yK~#7F70Sh-#V`~@!4t{8K|f|@=)b@Z zvmU4<;go}nZA{&`4%$wAM;<`9kVhWVk|&9Qp=CUcnd;p9Co~ThId@A;$uL_b$_yrJ zHrpKr*gN77YmS^0RJ(J+7sFvT%-Sp5;yx~ssb|4Mpv37p+fb<7N`|2Aq1e&l7St~= zg_uneQ$#Zx&s^YjY4pwn%}1%Ns?!CxAqATBa2jr?_0C@r3`PQGFBJI~H3kTo{elut P00000NkvXXu0mjf&JVwF literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_junglegrass.png b/games/minimal/mods/basenodes/textures/default_junglegrass.png new file mode 100644 index 0000000000000000000000000000000000000000..d64e33abce8cb5324f338f95d39842c1b6f5616d GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bWysG_@nDba)38gGlrUha zxTxy|lwvFi@(X5gcy=QV$jR_@aSY**Wj)Bq*rFiddhmD=V~OGcaqbgY42-|icS#mB zT1M~*Oei^B!aVO$OIw}RTsE($wDiLfrd4bqHuD;uR26Szi{G6zHQ{+s3G3+qP{R>+klHA7}B_R4<;!pnCxKfxpafM_aW;@6uPtbV{#uNOwTM zWV{Fl^P2QKwN3j0dxjia3=C>=9Usa7VNIuX+6Z(yl547fvneFlsQu-Y_5jPw8O|@E zUXR6g!%OYaaXr+XXf&vaJ36U_y25|NIQc8^A{W&g&?g;Hu4RV~0$a>HhHOmMRqX?I zs2&$jbPNHFa)aA7A$zQt;)15e~Ia;0mP!?2Uu}-^F*WWg$ zY~N-+39{D?0MfkB8SP8o0B5zLY#p>w`_lt(&tk25H9DAWy-t^3xkCde1AxuqrtWA* zrXSSD@>dqioF^l!W1QBSZ|C3+ZPn89QG3NW+QX%*ZTan?|ZFIgX+c?zpQ-o z)4#4`^}5Y;K6Qgivu3+y<)!D33}{sx>u`MqWvW01DyAflz5$ zK#0=yJU?(1HRrh?M8|R8)k^AxbwbG`O?3l7u490ly2(rIna0WC(9~Tni_39>rehAJ zYg^5VJ3xpCB@jTbz2CcaI}S`-Fv-~xmiSh`eR6O*yna9?=yzLBUwMZM_Tg*y(~+PQ zEmN)EYYkUe)%36`2?dzyS(X-(6NJ(B-l^^m#wVvGFIo-Hv2i;L3PDS>V;gYJxPsOX zzx>3KG@Wr|>SmIH%i(l7JlH!pCjdv5T?8dLnkI8LF7r)AGq=JhxOI<(>?t#RWKhfY^rZhZx9d)BcmoBr_YZ&|(!ed~Ho zw{P~o*#46ZM|iNL5TG&3Br>*E|2!M>X5epZ%;q!MYJ|1AKDg&B7Cd9}!QBDEpvWdr zDguC(u;t#)Rx|Pdprg@6&hu7GEQby+im+{mhW_qLFZ;eJvP=Q_KaD<9=P>kPF#rGn M07*qoM6N<$f(y}N3;+NC literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_jungletree_top.png b/games/minimal/mods/basenodes/textures/default_jungletree_top.png new file mode 100644 index 0000000000000000000000000000000000000000..e80de8a69ff4537e1d01388ca82186cc1a4b760b GIT binary patch literal 714 zcmV;*0yX`KP)x@d^Rd?TN)h-bdRysL@mQK#Ru-qg0|rE$+Eq(Ix{Wg`zry?2yA`cu(zsTwn2S* zsGd??6Z<8#EsX=o2|kMmeI3~`zzxucD*Xn;-VE)pIsU)P^8fzw(x46HiQm^}{R$BJ zvz?4Cw;X*_pf&mnR!tbKHkMkO#A?evzsybiJ-Cc%J6G+vwNXaSH*W=w{a~gT(>lr< z9G8>M|LNE`a$Sa7iLU|ABo{`9*KC8QJ}$2*RE@3TwqC+$z4 z;()V~Dv!8cHk4HwazPeMWx|>nxwB%P6xRjMk3RBn@U|qxj7%}qe`Oi|P0<}${>O(` zx{AWTUmv9|JLzs?FHjQy-3!k=5&ivp6NJKPc9}<5>6J8^Fhyk%-vBqzQ=Tlrl~DUK z02U;>I{I@KqHxiM-|=(z7NrMUrnLnN71w?ByCf|N)}CqOwgOj-#WW`b%mrd{>sltI wb=r}#vXo!01b+PJRUSN7_y6YSA6nN008DC23aufI_5c6?07*qoM6N<$f-JjNZvX%Q literal 0 HcmV?d00001 diff --git a/games/minimal/mods/default/textures/default_lava.png b/games/minimal/mods/basenodes/textures/default_lava.png similarity index 100% rename from games/minimal/mods/default/textures/default_lava.png rename to games/minimal/mods/basenodes/textures/default_lava.png diff --git a/games/minimal/mods/basenodes/textures/default_lava_flowing.png b/games/minimal/mods/basenodes/textures/default_lava_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..07066a6e3911b347a77d3ecd74d93b3221f1fc96 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|N}eu`Ar*|tGZYSgI6vdze@TUA o4YRkV6PC=flXCOY=xq~Xh;|nhP@5CO22{=9>FVdQ&MBb@0JAq2wEzGB literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_leaves.png b/games/minimal/mods/basenodes/textures/default_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..c0475d4d247346bbf4a20522b143cd281828cef4 GIT binary patch literal 883 zcmV-(1C0EMP)1uOZdd1lB%%XO z1$$iD^|3~^@f4=6=2Ed9q6ug_g1YznwfHPkb?ejRABCzl4mk8jhGrg^ioZ4(-rT6l zMpLncWJ=>61t(C|X1j*ZB@tURRJ_tqdKD^|b*p$ZO*LDA&HuG)=sMJFa?^R*Mp4{G zY{sViF68Ss6rFIYdACzVGfu2!thwGq>n_MEbrOH(hVgS~^ad=vg`7SV?sBMWL%t$Y z4nkw7e4SlIEg33`L(NXu_Cu)(tFjfD@F@NkQ6G;g@jP9{8w@q=O4i(K)PKvs8Xz*9 zqT(r!LKAj{CT;3Go=*EolwX&oz#_CP^+Cykn`K|D&A+0=7ejp)4T94sJZ7q7+KVsh z)|$_0syu`Wsx#?2>Y;otO|2U}${$7~p1E}TpEeHvX>#H3LI!Wb(1}coJVO=pUKO{c zGI}sb>rp2o*I?;8)N}+j9JDJug=pMwGIR?qel&IL_jIj&pULR)Z1o;bqU9heYfD$C z#jWrRG#!BKDYWFdUmd%0=s)9y*sPP{HHKDwLNhnK3eSJ7v>k$`?aA`TTuN_2fewSl zoem9O^DucEHviwv&?Priu0tdDAkb=IUXNmfp0Ahd)O5vs z&jGi(_BknAaEZ#Mh(>PNS@zbYt}~VrE0Ps%_7Wa;Y4DV(x*nf84<^%SEi1On6c|AD z+YHS=^N!AnXI!XpOs zZuD#5vYqHGn!V^#xXnr7QoADkF6CCZ6q`d;t4xaKZ1RO2vN)q=qYZzvsjLP>Mltw` zQds*Yz}ja~vYNkTz!iewqj_5XBwG~|S@PA`$!hyXdUlcJ%xX)WMxbkdrpyc!9ftfG zr+keL`FgO(GHBWi+0}-kon8x`o6*ar%2uPXt0_vYMdb;P{sqYCHbknK2}l3{002ov JPDHLkV1mTLr>+11 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_mossycobble.png b/games/minimal/mods/basenodes/textures/default_mossycobble.png new file mode 100644 index 0000000000000000000000000000000000000000..69585e37b7d32e78afde08bac7ad714bf9eaeb1b GIT binary patch literal 574 zcmV-E0>S->P)+qrL8R4Ub%<42)TfF+;Lvsf&)-ERB+ zKHTH+xKgRCRx6{?Xfl~*vl)!JTn-5Uold7%EV5`c+G@3^UMiIu4u|LS88{RQRjbwG z@i?E)!H+{mhQH-GMK{QaJ^n13QYjk205CFy(r}*ip^&8dc884 z4CN3f&Th9u003woj|U?wYG5e~8)F?U$IpIa+gN*ltZjs~-LMQBw}0d5n>)$fYWz9Ypz?Ny zWJ7_dNc7Lk5qod`9sj>X#r+0a_ctlt%Wye%zn$cU{eB;zP>8Wva7joguvSuxm6AnT zBZ|4XInpu~OxI*`4Bj97mQ7CU6q3UT8v-eD9r2w!*Z=yB;@Jil1oa3Bl8Ai2$XJLe zWOfq>hr`@q=krM{E-sQ9H&A)DNyz51)O@fBt)HO8b^)a)8{Am6bm&Qwq__$(p^av7 zqDo6kOFSw6G5GQycNEhaq^Qbxa&nS-Z}wpPQ{;L(>mo78P}q@x#{Ko*dMh1kk~ch9 zIp?>Y>(4jg{#PRR?;^yMN*F4#H@j4OwT*+XCq{-xTkJdLWfcU0Z)O-EoK(@hzr&e* zXzdum8aAjg6kLl@Y@(2BlV_Ui3s)gB$4}Y*pYrQyAc$v9@w|DL!B~&Dj zRw(m#nX!>~FmzB6#$rlCnUe$kB}PS4)gQ#Y(_&aTxyfv ij-qtA#{yVIm%anv#9dWKp^SV00000(+G4G4IFYm2a&8 z=Nv`;`2DxP-u<)D?#Bfwm#gqHP2lv`>l8(AA-CGNqeA6gcQ#SKKZ`}@)BVrZUd?N(StpLU>f6A9@ZE(CiF2McN5^7|K_lJJ@EfeSsYktrH#J79+O#= z(ht*iwger1{{CfP3#k*)ZkFB!N-bxpV?cQ4HIH?NFEJQ0KD0dYnJzNK8c=B2+&o$M z`tCz3-unT8%LSB$ou0yB;X@;?5=YFYi8TwpVyNmMsm4F&7PnmfSN=xY`vS<_(QaeQ3o) zYUT3nf1j<~RxJlM$Cu_4>RSkCEOrvLGkjF)qm%o4Qb zUX$uP&#!xQ;tan->llR(ZhhFze&`^Vc+{oIZTID-Y`GF9(4n6x;=VXr0cf~~6GOrJ WEdIP%9kM_NFnGH9xvX+55Jk6%V+=E68ENvE*=&mP&F!#M4h(n@7LUUm0$nHngV!dnxY))xaC1K_*{D}-|AST6 zy}WDZ;H}-a2FUs|)kvZN{FesZ%OswVMkqK%@Z?g?OawO!ps2e3TphoxPG2`@#)Cr) z&f%snzMXS24)lm$6N`4RlT;Ao(tM;m-lc}%ENbD_k=S!`8)?Ni#d(ra#Z*%fi%{ZlNq&fjq{4hkZ= zX-PGCJ$YK*@x?LC8=P}{|GhbXTZbgf4>9;JmsDTh5+6Eyi5y%9lZJA>ma6M);6NteSMB(klaM1{7u9TFmHCq~kzIFF ms`*c&pqaINDKt>3-^fpLin5Z$9Ygj200005!<}#v)Vg w$kWUx^*~2SQY0flth8BOmIqR%9V3I4yVK6V2o*+ zMoL*q+3pS^<$PJ!TI(2^Mykrb7TLrl^&!@5LWwp+tZqS7DR%uBX zx{rjEOadiEFd;SfZOTT6^0v$gIKhG#~v150269L^)HwB#C7xZcA!PBBNN##%xJ#o9z7cD;+b+xO sy`QEDiE$nRyu7^NncyuSk4NFVdQ&MBb@0H{zsTmS$7 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_snow_side.png b/games/minimal/mods/basenodes/textures/default_snow_side.png new file mode 100644 index 0000000000000000000000000000000000000000..f34d10991fcb11806073b212d444804e45052b9d GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uK&J$`2YX^pEnPH0={84 zje!(PNswPKP>{hvYvmUp-`vy1F{FYqSzyMNB-ZAR02dbK$w9}t+CsBpgC%9AuZ=h= vAfa~Q$bltl8zv;q|F?cW&;P~-4km`ikGj$qmTwIK8o}V{>gTe~DWM4f=`S=) literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_stone.png b/games/minimal/mods/basenodes/textures/default_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..763b4396a9a4a38f079cfc8748791ae4d6955a3b GIT binary patch literal 313 zcmV-90mlA`P)j2QOYrA5t_Pxy)aKB zDfnb%G4+#W1MMeihHeE&B%jGI(l27Wv6$x>H$dYOg_ZN_UrUN<3P)nY)7S|D3{WnVWw+u@f023w!Se!lZxP3Pr!Agw@Mz zYI~ko@-=H}9k6h=|`)pdtr~ zPOBSHJ{~zhrS9+9u2Ns$tCBo~e0*qw-wuQ{H9JI_1HPWuJ4|hFtu4?*Ru{%Sxk8Fe zEI8yj{yMv0V}BY-EW;QUlf+|NsRE|J%MXg`Rlg!{8u?B`fiRqcVl;9wgtG4rHNmH8 zX!!cf3cJBD&ag`i`Pt?8@J>@>T@budsZ-wQ2A{prdJ@l5siZiPo%IA3@BWQBY<&1( zg6wba(_ga{iVQI-n4p#mNu<)WC1T&z ztpJx$8m)~8{_`o(YRvrC>C!gr40fk6)?`{tjnL*iz1YWBlmO}(Hme02B62j_A^S9$ z^2aYHh@v;+LtUH9hO3)_G1W}jiai`@1ur+6aWRFAAt!7vUinh`|6-}rn_AvK))fg4 zq*~S#M~7wvou*7UyGkkyFfW@YX;0vx)|=NcPrICH zNl%kc-jCi%n&h3xCa4-C$C*!0WvMfU_T5fxjt~+h4Lwpy-V?$&A4`$5-!SqszChY5 zeL16ZuyFO)qdH_l0ufO~ScmRiOI>FCUd4 tKpxn*C7L5BhA4fg&_B=H{eeLg{{!$!dKC+%@o@kE002ovPDHLkV1gz|HE#d_ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basenodes/textures/default_tree_top.png b/games/minimal/mods/basenodes/textures/default_tree_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a4fa7042a17a55d7d3cdab9e3e078d66f4246b GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Wu7jMAr*|t1_4u)I2}zzeykL9 z;ox=fThW`;u#u&XC8X^FgZQD=4H*p+W^^>L*_bg1mhomBb3Ty~9y&+L;H+8#^RgiQ zXwI5CgAn1vB|>GqGdR}q#@h(+h3yEKwqB^NI^fczc}n*4N(5K%2RTPQa?ViTWMsHj Xu}=4>SHT3J3m80I{an^LB{Ts5I=nSk literal 0 HcmV?d00001 diff --git a/games/minimal/mods/default/textures/default_water.png b/games/minimal/mods/basenodes/textures/default_water.png similarity index 100% rename from games/minimal/mods/default/textures/default_water.png rename to games/minimal/mods/basenodes/textures/default_water.png diff --git a/games/minimal/mods/basenodes/textures/default_water_flowing.png b/games/minimal/mods/basenodes/textures/default_water_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdafd51d7f2542ccb43892fb53fa3c9b14cd233 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|R-P`7Ar*|t20UvRlz2}w+`bW( zBvEpKAzkpKf>(23fT|PoE)6y2%WQwDI4Wlq@lI(IdTYw_a|??LL-&LC>}C7o+JL4o Nc)I$ztaD0e0ss%}Admn6 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/init.lua b/games/minimal/mods/basetools/init.lua new file mode 100644 index 000000000..d9d9afb07 --- /dev/null +++ b/games/minimal/mods/basetools/init.lua @@ -0,0 +1,295 @@ +-- +-- Tool definitions +-- + +--[[ TOOLS SUMMARY: + +Tool types: + +* Hand: basic tool/weapon (just for convenience, not optimized for testing) +* Pickaxe: dig cracky +* Axe: dig choppy +* Shovel: dig crumbly +* Shears: dig snappy +* Sword: deal damage +* Dagger: deal damage, but faster + +Tool materials: + +* Dirt: dig nodes of rating 3, one use only +* Wood: dig nodes of rating 3 +* Stone: dig nodes of rating 3 or 2 +* Steel: dig nodes of rating 3, 2 or 1 +* Mese: dig "everything" instantly +]] + +-- The hand +minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x=1,y=1,z=2.5}, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[3]=1.50}, uses=0, maxlevel=0}, + snappy = {times={[3]=1.50}, uses=0, maxlevel=0}, + oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=2.00}, uses=0, maxlevel=0}, + }, + damage_groups = {fleshy=1}, + } +}) + +-- Mese Pickaxe: special tool that digs "everything" instantly +minetest.register_tool("basetools:pick_mese", { + description = "Mese Pickaxe", + inventory_image = "basetools_mesepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + cracky={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, + crumbly={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, + snappy={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, + choppy={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, + dig_immediate={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, + }, + }, +}) + + +-- +-- Pickaxes: Dig cracky +-- + +-- This should break after only 1 use +minetest.register_tool("basetools:pick_dirt", { + description = "Dirt Pickaxe", + inventory_image = "basetools_dirtpick.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + cracky={times={[3]=2.00}, uses=1, maxlevel=0} + }, + }, +}) + +minetest.register_tool("basetools:pick_wood", { + description = "Wooden Pickaxe", + inventory_image = "basetools_woodpick.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + cracky={times={[3]=2.00}, uses=30, maxlevel=0} + }, + }, +}) +minetest.register_tool("basetools:pick_stone", { + description = "Stone Pickaxe", + inventory_image = "basetools_stonepick.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + cracky={times={[2]=1.20, [3]=0.80}, uses=60, maxlevel=0} + }, + }, +}) +minetest.register_tool("basetools:pick_steel", { + description = "Steel Pickaxe", + inventory_image = "basetools_steelpick.png", + tool_capabilities = { + max_drop_level=1, + groupcaps={ + cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=0} + }, + }, +}) +minetest.register_tool("basetools:pick_steel_l1", { + description = "Steel Pickaxe Level 1", + inventory_image = "basetools_steelpick_l1.png", + tool_capabilities = { + max_drop_level=1, + groupcaps={ + cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=1} + }, + }, +}) +minetest.register_tool("basetools:pick_steel_l2", { + description = "Steel Pickaxe Level 2", + inventory_image = "basetools_steelpick_l2.png", + tool_capabilities = { + max_drop_level=1, + groupcaps={ + cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=2} + }, + }, +}) + +-- +-- Shovels (dig crumbly) +-- + +minetest.register_tool("basetools:shovel_wood", { + description = "Wooden Shovel", + inventory_image = "basetools_woodshovel.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + crumbly={times={[3]=0.50}, uses=30, maxlevel=0} + }, + }, +}) +minetest.register_tool("basetools:shovel_stone", { + description = "Stone Shovel", + inventory_image = "basetools_stoneshovel.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + crumbly={times={[2]=0.50, [3]=0.30}, uses=60, maxlevel=0} + }, + }, +}) +minetest.register_tool("basetools:shovel_steel", { + description = "Steel Shovel", + inventory_image = "basetools_steelshovel.png", + tool_capabilities = { + max_drop_level=1, + groupcaps={ + crumbly={times={[1]=1.00, [2]=0.70, [3]=0.60}, uses=90, maxlevel=0} + }, + }, +}) + +-- +-- Axes (dig choppy) +-- + +minetest.register_tool("basetools:axe_wood", { + description = "Wooden Axe", + inventory_image = "basetools_woodaxe.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + choppy={times={[3]=0.80}, uses=30, maxlevel=0}, + }, + }, +}) +minetest.register_tool("basetools:axe_stone", { + description = "Stone Axe", + inventory_image = "basetools_stoneaxe.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + choppy={times={[2]=1.00, [3]=0.60}, uses=60, maxlevel=0}, + }, + }, +}) +minetest.register_tool("basetools:axe_steel", { + description = "Steel Axe", + inventory_image = "basetools_steelaxe.png", + tool_capabilities = { + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=90, maxlevel=0}, + }, + }, +}) + +-- +-- Shears (dig snappy) +-- + +minetest.register_tool("basetools:shears_wood", { + description = "Wooden Shears", + inventory_image = "basetools_woodshears.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + snappy={times={[3]=1.00}, uses=30, maxlevel=0}, + }, + }, +}) +minetest.register_tool("basetools:shears_stone", { + description = "Stone Shears", + inventory_image = "basetools_stoneshears.png", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.00, [3]=0.50}, uses=60, maxlevel=0}, + }, + }, +}) +minetest.register_tool("basetools:shears_steel", { + description = "Steel Shears", + inventory_image = "basetools_steelshears.png", + tool_capabilities = { + max_drop_level=1, + groupcaps={ + snappy={times={[1]=1.00, [2]=0.50, [3]=0.25}, uses=90, maxlevel=0}, + }, + }, +}) + +-- +-- Swords (deal damage) +-- + +minetest.register_tool("basetools:sword_wood", { + description = "Wooden Sword", + inventory_image = "basetools_woodsword.png", + tool_capabilities = { + full_punch_interval = 1.0, + damage_groups = {fleshy=2}, + } +}) +minetest.register_tool("basetools:sword_stone", { + description = "Stone Sword", + inventory_image = "basetools_stonesword.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + damage_groups = {fleshy=4}, + } +}) +minetest.register_tool("basetools:sword_steel", { + description = "Steel Sword", + inventory_image = "basetools_steelsword.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + damage_groups = {fleshy=6}, + } +}) + +-- Fire/Ice sword: Deal damage to non-fleshy damage groups +minetest.register_tool("basetools:sword_fire", { + description = "Fire Sword", + inventory_image = "basetools_firesword.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + damage_groups = {icy=6}, + } +}) +minetest.register_tool("basetools:sword_ice", { + description = "Ice Sword", + inventory_image = "basetools_icesword.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + damage_groups = {firy=6}, + } +}) + +-- +-- Dagger: Low damage, fast punch interval +-- +minetest.register_tool("basetools:dagger_steel", { + description = "Steel Dagger", + inventory_image = "basetools_steeldagger.png", + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level=0, + damage_groups = {fleshy=2}, + } +}) diff --git a/games/minimal/mods/basetools/mod.conf b/games/minimal/mods/basetools/mod.conf new file mode 100644 index 000000000..f0d9f657d --- /dev/null +++ b/games/minimal/mods/basetools/mod.conf @@ -0,0 +1,2 @@ +name = basetools +description = Contains basic digging tools diff --git a/games/minimal/mods/basetools/textures/basetools_dirtpick.png b/games/minimal/mods/basetools/textures/basetools_dirtpick.png new file mode 100644 index 0000000000000000000000000000000000000000..20a021d725d50c3f630d3b2318767adaed5d7e62 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!3_UF&^$uA7AW$<)5S5Q zf-(7rzfwb%2EX7+9z)IZNgAG$lvXe@-s(zrx@#fTwMctY(^?ys57`b4lT7~K>-_mu z^N;4iBH>qOKtc@SiOTucIJc$=p0snxn!vtD!~Ntlr{o1@hoq8}MH)5KoD8*m?%j)+ z(ZHsyy^bZHlf(LawATJ>%hkL&m$zMUdfLX3nKJQ_#Kdnr{%@rAG^u|55^;fLbx?2C zr4iO3saB3I&nqd=RF;15#FCC4~aJ3+Hpuh|GbTvgWN*L;OV;$M@!c);@Ett zC2PaQNqr@kRm?t${y62{7%IG4QP-(|$rE0NzIm-n?}=^T0s5K2)78&qol`;+0FTsp ARR910 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_firesword.png b/games/minimal/mods/basetools/textures/basetools_firesword.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2809ab7eeb841f086b1ab0c0f6a5304fcf3cca GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV-Bu#|Uyb2^Pv!qq&;JcM zKw(W0)&f5bCne5UTNMuvkGi@#xxUv6ff8&bL4Lsu|ABxZyqdolDB|qt;uuoFnC!sZ z#3V2)Q1X<3kyrzlM3QKNNCTIFl@p7Tb8rJwf?KOH^9;dzH<<)a&N#)9=90_ZAR)F@ eOTB--363jD+%%oX7~>T4B^%M#Xu2fPZ!6K3dUpy z<|ZbAS%H$L1dPNQxFnK96GR%g46K}3oScIjm=fGtm6>M<-n+>pcyh)mjx?8C?gk05 gts*BHG};Up9AtU)Gb-(KfyOa-y85}Sb4q9e0ID!Ln*aa+ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/default/textures/default_tool_mesepick.png b/games/minimal/mods/basetools/textures/basetools_mesepick.png similarity index 100% rename from games/minimal/mods/default/textures/default_tool_mesepick.png rename to games/minimal/mods/basetools/textures/basetools_mesepick.png diff --git a/games/minimal/mods/basetools/textures/basetools_steelaxe.png b/games/minimal/mods/basetools/textures/basetools_steelaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..aac594d8456b40b630c546574845f044f95b9591 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X32BE{-7; zjL8xfAKu(Fz7!&FQNZ9Kv{s78;{tPt*QR-v#m^i}7$jXXJGO=v20c>oH5Ka&ylTS4 X@IBwOF+60_8<1I^u6{1-oD!M(LF2>af}lq&H<+IY xnaQoNx)#=|Ve9a6*Dk9CavalNC@d0WV0d~^bDqqt={G=Dc)I$ztaD0e0syW5FT?-< literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_steelpick.png b/games/minimal/mods/basetools/textures/basetools_steelpick.png new file mode 100644 index 0000000000000000000000000000000000000000..bc02aac3e45d02f0335309aecbebadbc068d1f3a GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X3ZME{-7; zjC1=AayA6;9IYzlE#%dI_wYc|>??{>_}k<@OIP_+^s4zQ+I&ygwWn@YWZJ3+cecOJ z2q{>@ZGEbbQTf!m-mRQdcx#sCxUKPhoO|F~f_GezXxfy;x^kf)dpuqJT-G@yGywpe CKwqUoc&j zEwam4d^(SIcw*tx2o& zS8e?@>9>tQp{hvDhpqXH#@S68g4c>mx>FFVdQ&MBb@0EeMQ@c;k- literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_steelpick_l2.png b/games/minimal/mods/basetools/textures/basetools_steelpick_l2.png new file mode 100644 index 0000000000000000000000000000000000000000..011df458460115f5b804abbfdb5c3fdb37c16604 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5|9E{-7; zjJ!gIGHW`BRKyy3P&_BmVP Wq-pLGd8F@wZ1!~Zb6Mw<&;$U7h(Tij literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_steelshears.png b/games/minimal/mods/basetools/textures/basetools_steelshears.png new file mode 100644 index 0000000000000000000000000000000000000000..04c86c3706021dc7b3ed35b19aead2c14823af3b GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv5AX?bWsqg`@bEZ%=Jp=fS?83{1OTuSC13ym literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_steelsword.png b/games/minimal/mods/basetools/textures/basetools_steelsword.png new file mode 100644 index 0000000000000000000000000000000000000000..9909365c32b5646276532b73a63be841f650e478 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X2;6E{-7; zjL8c)KQu5Vg}%SPzy44Qrvn@3Dn%)_-B}S90%5%uHe_B_yA-oX^AOjS<^W#-ksp~B znuSbXCoHhK7RI`+y&+j))x&>^5AN>TWwk)=(j_tGUIvCo*8&VG?><}%vdh!e&t;uc GLK6T5Up65C literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_stoneaxe.png b/games/minimal/mods/basetools/textures/basetools_stoneaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..a374c547d7570d417f66b234b1b14811f9c9eb32 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1XAXnE{-7; zjL8xf7cO3Oob~F@pBe?vEm;N%j{E_dC#!^ngdS9NToTA${bBRNmU`05Zzc)z4*}Q$iB}-NGee literal 0 HcmV?d00001 diff --git a/games/minimal/mods/default/textures/default_tool_stonepick.png b/games/minimal/mods/basetools/textures/basetools_stonepick.png similarity index 100% rename from games/minimal/mods/default/textures/default_tool_stonepick.png rename to games/minimal/mods/basetools/textures/basetools_stonepick.png diff --git a/games/minimal/mods/basetools/textures/basetools_stoneshears.png b/games/minimal/mods/basetools/textures/basetools_stoneshears.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4bd3b748ea593cacf41fee29e53f94ea595823 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn;`TPHJRxaujg=&K<_o zBvR`%;{~%>g8<7nW~P>e`r4xDrw!7i4^4b`yZFX)QO&3NcLK6Yw_Ll@q$|3>=2*ZX zhDbJz@Anv=?rgRYIDO|a1Aiw+fzjf`2YS}5&z4&LOn*>x%V&qHQNgFz+d@wriR&!V zN?4zq`ntvFe{r)+UFY-F8Z92r_VL-se-_|VcacBvzPe`446cU5h3i!`AFsN2xaI-3 YYU{bX+m9}C1Ui|))78&qol`;+03(N5%m4rY literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_stoneshovel.png b/games/minimal/mods/basetools/textures/basetools_stoneshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1bb48cb58e1a8f3f75ac8aa05ad0a6d7377d01 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X9+XE{-7; zjL8d(I$9Z%LZ>SL31t%jmJ_RX@7~RMGhsDTAbYrPMDt`J^$Ct$Sq2Lhz6!j`!4TvN Yv`1;D4ww9KRbh~Ep00i_>zopr0GYZW*8l(j literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_stonesword.png b/games/minimal/mods/basetools/textures/basetools_stonesword.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3e94cda2f7dc43247258e43ebb8e0558701343 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X3ZME{-7; zjL8c)KQu5Vgm{1&C6?nXBkq10`lF2<4|zhDN3XE)M-oCr@B$B+uf zWCzBcCMJQl37jnlB_18)Nb8)Y?$IF8V|-d7+L7mADyP#kg|-r=#YK`HY0}J(XR;VH z2Y!=cj&Q4zj&SHHESI{mh5KfvK=RH@3(S_OF4)Duz-`9Ak@2}$1<(!#Pgg&ebxsLQ E0P9gca{vGU literal 0 HcmV?d00001 diff --git a/games/minimal/mods/basetools/textures/basetools_woodshovel.png b/games/minimal/mods/basetools/textures/basetools_woodshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc52f8a1607e0ed86566e19301d168eb0dada77 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5O>E{-7; zjL8d(3W6TBC?tg*zqRUs;Ko&gQXEVvS6S<%SV9h8b@W)&)Ba1QB>v?;oRX>c z;qs67OO9}wHN>1PU~Ze5*1{&B7X7(?h1w+3#Wy_s?UR{iq$%{ik-cPc{MIT3X{JLi lma^+4J$owj5B#+TS|IZ$bvJL;O>>~>44$rjF6*2UngEbEFBkv- literal 0 HcmV?d00001 diff --git a/games/minimal/mods/bucket/init.lua b/games/minimal/mods/bucket/init.lua index dcd59ed38..3189d4aa6 100644 --- a/games/minimal/mods/bucket/init.lua +++ b/games/minimal/mods/bucket/init.lua @@ -1,95 +1,26 @@ --- bucket (Minetest 0.4 mod) --- A bucket, which can pick up water and lava +-- Bucket: Punch liquid source or flowing liquid to collect it -minetest.register_alias("bucket", "bucket:bucket_empty") -minetest.register_alias("bucket_water", "bucket:bucket_water") -minetest.register_alias("bucket_lava", "bucket:bucket_lava") - -minetest.register_craft({ - output = 'bucket:bucket_empty 1', - recipe = { - {'default:steel_ingot', '', 'default:steel_ingot'}, - {'', 'default:steel_ingot', ''}, - } -}) - -bucket = {} -bucket.liquids = {} - --- Register a new liquid --- source = name of the source node --- flowing = name of the flowing node --- itemname = name of the new bucket item (or nil if liquid is not takeable) --- inventory_image = texture of the new bucket item (ignored if itemname == nil) --- This function can be called from any mod (that depends on bucket). -function bucket.register_liquid(source, flowing, itemname, inventory_image) - bucket.liquids[source] = { - source = source, - flowing = flowing, - itemname = itemname, - } - bucket.liquids[flowing] = bucket.liquids[source] - - if itemname ~= nil then - minetest.register_craftitem(itemname, { - inventory_image = inventory_image, - stack_max = 1, - liquids_pointable = true, - on_use = function(itemstack, user, pointed_thing) - -- Must be pointing to node - if pointed_thing.type ~= "node" then - return - end - -- Check if pointing to a liquid - n = minetest.get_node(pointed_thing.under) - if bucket.liquids[n.name] == nil then - -- Not a liquid - minetest.add_node(pointed_thing.above, {name=source}) - elseif n.name ~= source then - -- It's a liquid - minetest.add_node(pointed_thing.under, {name=source}) - end - return {name="bucket:bucket_empty"} - end - }) - end -end - -minetest.register_craftitem("bucket:bucket_empty", { +minetest.register_tool("bucket:bucket", { + description = "Bucket", inventory_image = "bucket.png", stack_max = 1, liquids_pointable = true, + groups = { disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then return end - -- Check if pointing to a liquid source - n = minetest.get_node(pointed_thing.under) - liquiddef = bucket.liquids[n.name] - if liquiddef ~= nil and liquiddef.source == n.name and liquiddef.itemname ~= nil then + -- Check if pointing to a liquid + local n = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[n.name] + if def ~= nil and (def.liquidtype == "source" or def.liquidtype == "flowing") then minetest.add_node(pointed_thing.under, {name="air"}) - return {name=liquiddef.itemname} + local inv = user:get_inventory() + if inv then + inv:add_item("main", ItemStack(n.name)) + end end end, }) -bucket.register_liquid( - "default:water_source", - "default:water_flowing", - "bucket:bucket_water", - "bucket_water.png" -) - -bucket.register_liquid( - "default:lava_source", - "default:lava_flowing", - "bucket:bucket_lava", - "bucket_lava.png" -) - -minetest.register_craft({ - type = "fuel", - recipe = "bucket:bucket_lava", - burntime = 60, -}) diff --git a/games/minimal/mods/bucket/mod.conf b/games/minimal/mods/bucket/mod.conf index 2a6086775..d14deb4ea 100644 --- a/games/minimal/mods/bucket/mod.conf +++ b/games/minimal/mods/bucket/mod.conf @@ -1,3 +1,2 @@ name = bucket -description = Minimal bucket to place and pick up liquids -depends = default +description = Minimal bucket to pick up liquids diff --git a/games/minimal/mods/bucket/textures/bucket.png b/games/minimal/mods/bucket/textures/bucket.png index b775a9fd335d074debc8a63010330a052da00a38..6779528753716365ba2d722b3587280e82d3a0e0 100644 GIT binary patch delta 146 zcmV;D0B!%a0iyws8Gi-<001BJ|6u?C0BT7@K~#7F&63dx03i%RZ#7qN11E5YF48@^ zT#x)n;FR?K47|@gBlNj8d8SyLb23`O#oqfC7RlMIwGV1Vy8B}He>2N5h89Ew%TNST zfGk11tXKRKfYbc)EuhF$U*{DlF#7e_BP8k|4ie28U-i(tsQ{PZ!6Kid(&XCwUnRI1YR9zxXF?9w7Mf$o>eoB$J8$ zGubaBtYhfgGKQ2tP#{ca?fM&_S0$?bH zf?IW;tdd2tN0w_H#8cH5!2g^U?h-`tkrA(7CSukef$1WfKvltKi2uyIBfsvrnw$pVB1jSEZo$`_I0ShhId=O$ERWtwq002ovPDHLk FV1mL7KC1u# delta 166 zcmZ3%xSer=WIZzj1A~Sxe=v}e4)6(a1=2u}n3&kq)HHwo{9U_t{WoLy-!An3|NqY$ z{ucn{7)yfuf*Bm1-ADs+ygXeTLn?0do--6`FyLW!l;M8<-~QPFjmbvWGmp2fKfLJn zGZpUL|0c9eSG%oHD`F{jXOb2#$AqVEC*NU6eEzLNeg%Jxkp{!_^Ziu}hfEm#Y^@%i P206gf)z4*}Q$iB}{p~?3 diff --git a/games/minimal/mods/bucket/textures/bucket_water.png b/games/minimal/mods/bucket/textures/bucket_water.png index a3c9d72f74e06692c3eeb9534cc09e26cdb9f61c..e164b0a50fe3a0f9ce5b022636f3445f34254a7a 100644 GIT binary patch delta 151 zcmV;I0BHZT0jL3x8Gi-<001BJ|6u?C0B=b|K~#7FVi>gGKQ2tP#^k)cC>U7|uVxLa zy?|!Pzye?>2BNcOl`N7yvRvz-ocekPXgC7z<&ckv$kjIRSuiu?C}QvKtE#+Ucb}ag z0JZ|=EdWAbVABFP7N|sF68{3ACcUmL05tx3^vb`S8+*Ridk|H^H75W7002ovPDHLk FV1kozKZ^hW delta 163 zcmZ3%xP@_oWIZzj1A~Sxe=v}e4)6(a1=2vEVYN3gF)=xBZ&Op#{Q2{D?b`MK|NkYc zg&cr#j3q&S!3+-1ZlnP@?w&4=Ar-fJ`yBZWDDWJ1TX^$-y-l~?3iq1sr_S@d-7Y?3 zk}ms`aOe8A3EQMB`zuskqY?xp@A+-wLrXmdj6Xdfo3vz My85}Sb4q9e05+gIcK`qY diff --git a/games/minimal/mods/chest/init.lua b/games/minimal/mods/chest/init.lua new file mode 100644 index 000000000..c44522cb9 --- /dev/null +++ b/games/minimal/mods/chest/init.lua @@ -0,0 +1,27 @@ +minetest.register_node("chest:chest", { + description = "Chest", + tiles ={"chest_chest.png^[sheet:2x2:0,0", "chest_chest.png^[sheet:2x2:0,0", + "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:1,0", + "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:0,1"}, + paramtype2 = "facedir", + groups = {dig_immediate=2,choppy=3}, + is_ground_content = false, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[8,9]".. + "list[current_name;main;0,0;8,4;]".. + "list[current_player;main;0,5;8,4;]" .. + "listring[]") + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, +}) + + diff --git a/games/minimal/mods/chest/mod.conf b/games/minimal/mods/chest/mod.conf new file mode 100644 index 000000000..0d7500164 --- /dev/null +++ b/games/minimal/mods/chest/mod.conf @@ -0,0 +1,2 @@ +name = chest +description = A simple chest to store items diff --git a/games/minimal/mods/chest/textures/chest_chest.png b/games/minimal/mods/chest/textures/chest_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..824b4d50255fa092bac1e8505350b224dd9aa4d5 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*ME@}T*#e}aWM1P15pKz4&&yN42x#4 zIw`X_`7BK1kaXJ8GGoz9L5(go0VyDE(-Y{^Q;_ml{egjDyNWdTOR2DKpot8gu6{1- HoD!M<-`X*p literal 0 HcmV?d00001 diff --git a/games/minimal/mods/chest_of_everything/init.lua b/games/minimal/mods/chest_of_everything/init.lua new file mode 100644 index 000000000..7d61abebf --- /dev/null +++ b/games/minimal/mods/chest_of_everything/init.lua @@ -0,0 +1,135 @@ +local F = minetest.formspec_escape + +-- Create a detached inventory +local inv_everything = minetest.create_detached_inventory("everything", { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + allow_put = function(inv, listname, index, stack, player) + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + return -1 + end, +}) +local inv_trash = minetest.create_detached_inventory("trash", { + allow_take = function(inv, listname, index, stack, player) + return 0 + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + on_put = function(inv, listname, index, stack, player) + inv:set_list("main", {}) + end, +}) +inv_trash:set_size("main", 1) + +local max_page = 1 + +local function get_chest_formspec(page) + local start = 0 + (page-1)*32 + return "size[8,9]".. + "list[detached:everything;main;0,0;8,4;"..start.."]".. + "list[current_player;main;0,5;8,4;]" .. + "label[6,4;Trash:]" .. + "list[detached:trash;main;7,4;1,1]" .. + "button[0,4;1,1;chest_of_everything_prev;"..F("<").."]".. + "button[1,4;1,1;chest_of_everything_next;"..F(">").."]".. + "label[2,4;"..F("Page: "..page).."]".. + "listring[detached:everything;main]".. + "listring[current_player;main]".. + "listring[detached:trash;main]" +end + +minetest.register_node("chest_of_everything:chest", { + description = "Chest of Everything", + tiles ={"chest_of_everything_chest.png^[sheet:2x2:0,0", "chest_of_everything_chest.png^[sheet:2x2:0,0", + "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:1,0", + "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:0,1"}, + paramtype2 = "facedir", + groups = {dig_immediate=2,choppy=3}, + is_ground_content = false, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest of Everything") + meta:set_int("page", 1) + meta:set_string("formspec", get_chest_formspec(1)) + end, + on_receive_fields = function(pos, formname, fields, sender) + if formname == "" then + local meta = minetest.get_meta(pos) + local page = meta:get_int("page") + if fields.chest_of_everything_prev then + page = page - 1 + elseif fields.chest_of_everything_next then + page = page + 1 + end + if page < 1 then + page = 1 + end + if page > max_page then + page = max_page + end + meta:set_int("page", page) + meta:set_string("formspec", get_chest_formspec(page)) + end + end, +}) + +minetest.register_on_mods_loaded(function() + local items = {} + for itemstring,_ in pairs(minetest.registered_items) do + if itemstring ~= "" and itemstring ~= "unknown" and itemstring ~= "ignore" then + table.insert(items, itemstring) + end + end + --[[ Sort items in this order: + * Chest of Everything + * Test tools + * Other tools + * Craftitems + * Other items + * Dummy items ]] + local function compare(item1, item2) + local def1 = minetest.registered_items[item1] + local def2 = minetest.registered_items[item2] + local tool1 = def1.type == "tool" + local tool2 = def2.type == "tool" + local testtool1 = minetest.get_item_group(item1, "testtool") == 1 + local testtool2 = minetest.get_item_group(item2, "testtool") == 1 + local dummy1 = minetest.get_item_group(item1, "dummy") == 1 + local dummy2 = minetest.get_item_group(item2, "dummy") == 1 + local craftitem1 = def1.type == "craft" + local craftitem2 = def2.type == "craft" + if item1 == "chest_of_everything:chest" then + return true + elseif item2 == "chest_of_everything:chest" then + return false + elseif dummy1 and not dummy2 then + return false + elseif not dummy1 and dummy2 then + return true + elseif testtool1 and not testtool2 then + return true + elseif not testtool1 and testtool2 then + return false + elseif tool1 and not tool2 then + return true + elseif not tool1 and tool2 then + return false + elseif craftitem1 and not craftitem2 then + return true + elseif not craftitem1 and craftitem2 then + return false + else + return item1 < item2 + end + end + table.sort(items, compare) + inv_everything:set_size("main", #items) + max_page = math.ceil(#items / 32) + for i=1, #items do + inv_everything:add_item("main", items[i]) + end +end) diff --git a/games/minimal/mods/chest_of_everything/mod.conf b/games/minimal/mods/chest_of_everything/mod.conf new file mode 100644 index 000000000..4a4425e05 --- /dev/null +++ b/games/minimal/mods/chest_of_everything/mod.conf @@ -0,0 +1,2 @@ +name = chest_of_everything +description = Adds the chest of everything from which you can take all items diff --git a/games/minimal/mods/chest_of_everything/textures/chest_of_everything_chest.png b/games/minimal/mods/chest_of_everything/textures/chest_of_everything_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2fd58d51c9f6be98ad202ed0c1749d58703e0a GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*Za4OmoJuDTFS7rgyF-x z1rP7oKYNt;^kKy1bBcGaDI09!?gOgK_jGX#sbEY#z|hl_pun)WkXvC(0v89Trq-gY zKoKV+=5Y#WV2&Ni$kQv6`qL> z9n&@ym>6>%WewaLAJ-?AB>FT%OY0)*5pGTvBaR88atuw6 - --wall_bottom = = - --wall_side = = - }, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3}, - legacy_wallmounted = true, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:wood", { - description = "Wood", - tiles ={"default_wood.png"}, - is_ground_content = false, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("default:mese", { - description = "Mese", - tiles ={"default_mese.png"}, - groups = {cracky=1,level=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:cloud", { - description = "Cloud", - tiles ={"default_cloud.png"}, - is_ground_content = false, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:water_flowing", { - description = "Water (flowing)", - drawtype = "flowingliquid", - tiles = {"default_water.png"}, - special_tiles = { - {name = "default_water.png", backface_culling = false}, - {name = "default_water.png", backface_culling = true}, - }, - alpha = WATER_ALPHA, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - liquidtype = "flowing", - liquid_alternative_flowing = "default:water_flowing", - liquid_alternative_source = "default:water_source", - liquid_viscosity = WATER_VISC, - post_effect_color = {a = 64, r = 100, g = 100, b = 200}, - groups = {water = 3, liquid = 3}, -}) - -minetest.register_node("default:water_source", { - description = "Water", - drawtype = "liquid", - tiles = {"default_water.png"}, - special_tiles = { - -- New-style water source material (mostly unused) - {name = "default_water.png", backface_culling = false}, - }, - alpha = WATER_ALPHA, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "default:water_flowing", - liquid_alternative_source = "default:water_source", - liquid_viscosity = WATER_VISC, - post_effect_color = {a = 64, r = 100, g = 100, b = 200}, - groups = {water = 3, liquid = 3}, -}) - -minetest.register_node("default:river_water_source", { - description = "River Water Source", - drawtype = "liquid", - tiles = {"default_river_water.png"}, - special_tiles = { - -- New-style water source material (mostly unused) - {name = "default_river_water.png", backface_culling = false}, - }, - alpha = 160, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "default:river_water_flowing", - liquid_alternative_source = "default:river_water_source", - liquid_viscosity = 1, - 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}, -}) - -minetest.register_node("default:river_water_flowing", { - description = "Flowing River Water", - drawtype = "flowingliquid", - tiles = {"default_river_water.png"}, - special_tiles = { - {name = "default_river_water.png", backface_culling = false}, - {name = "default_river_water.png", backface_culling = true}, - }, - alpha = 160, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - liquidtype = "flowing", - liquid_alternative_flowing = "default:river_water_flowing", - liquid_alternative_source = "default:river_water_source", - liquid_viscosity = 1, - 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}, -}) - -minetest.register_node("default:lava_flowing", { - description = "Lava (flowing)", - inventory_image = minetest.inventorycube("default_lava.png"), - drawtype = "flowingliquid", - tiles ={"default_lava.png"}, - special_tiles = { - { - image="default_lava_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} - }, - { - image="default_lava_flowing_animated.png", - backface_culling=true, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} - }, - }, - paramtype = "light", - light_source = LIGHT_MAX - 1, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - liquidtype = "flowing", - liquid_alternative_flowing = "default:lava_flowing", - liquid_alternative_source = "default:lava_source", - liquid_viscosity = LAVA_VISC, - damage_per_second = 4*2, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=2, hot=3}, -}) - -minetest.register_node("default:lava_source", { - description = "Lava", - inventory_image = minetest.inventorycube("default_lava.png"), - drawtype = "liquid", - --tiles ={"default_lava.png"}, - tiles = { - { - name = "default_lava_source_animated.png", - animation = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} - } - }, - special_tiles = { - -- New-style lava source material (mostly unused) - {name="default_lava.png", backface_culling=false}, - }, - paramtype = "light", - light_source = LIGHT_MAX - 1, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "default:lava_flowing", - liquid_alternative_source = "default:lava_source", - liquid_viscosity = LAVA_VISC, - damage_per_second = 4*2, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=2, hot=3}, -}) - -minetest.register_node("default:torch", { - description = "Torch", - drawtype = "torchlike", - tiles ={"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"}, - inventory_image = "default_torch_on_floor.png", - wield_image = "default_torch_on_floor.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - is_ground_content = false, - walkable = false, - light_source = LIGHT_MAX-1, - selection_box = { - type = "wallmounted", - wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, - wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, - wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, - }, - groups = {choppy=2,dig_immediate=3,attached_node=1}, - legacy_wallmounted = true, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:sign_wall", { - description = "Sign", - drawtype = "signlike", - tiles ={"default_sign_wall.png"}, - inventory_image = "default_sign_wall.png", - wield_image = "default_sign_wall.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, - is_ground_content = false, - walkable = false, - selection_box = { - type = "wallmounted", - --wall_top = - --wall_bottom = - --wall_side = - }, - groups = {choppy=2,dig_immediate=2,attached_node=1}, - legacy_wallmounted = true, - sounds = default.node_sound_defaults(), - on_construct = function(pos) - --local n = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", "field[text;;${text}]") - meta:set_string("infotext", "\"\"") - end, - on_receive_fields = function(pos, formname, fields, sender) - --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) - local meta = minetest.get_meta(pos) - fields.text = fields.text or "" - print((sender:get_player_name() or "").." wrote \""..fields.text.. - "\" to sign at "..minetest.pos_to_string(pos)) - meta:set_string("text", fields.text) - meta:set_string("infotext", '"'..fields.text..'"') - end, -}) - -minetest.register_node("default:chest", { - description = "Chest", - tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0", - "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0", - "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:0,1"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]" .. - "listring[]") - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, -}) - -local function has_locked_chest_privilege(meta, player) - if player:get_player_name() ~= meta:get_string("owner") then - return false - end - return true -end - -minetest.register_node("default:chest_locked", { - description = "Locked Chest", - tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0", - "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0", - "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,1"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local pname = - placer and placer:get_player_name() or "" - meta:set_string("owner", pname) - meta:set_string("infotext", "Locked Chest (owned by ".. - meta:get_string("owner")..")") - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]" .. - "listring[]") - meta:set_string("infotext", "Locked Chest") - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - -- this is not really the intended usage but works for testing purposes: - meta:mark_as_private("owner") - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - if not has_locked_chest_privilege(meta, player) then - minetest.log("action", player:get_player_name().. - " tried to access a locked chest belonging to ".. - meta:get_string("owner").." at ".. - minetest.pos_to_string(pos)) - return 0 - end - return count - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if not has_locked_chest_privilege(meta, player) then - minetest.log("action", player:get_player_name().. - " tried to access a locked chest belonging to ".. - meta:get_string("owner").." at ".. - minetest.pos_to_string(pos)) - return 0 - end - return stack:get_count() - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if not has_locked_chest_privilege(meta, player) then - minetest.log("action", player:get_player_name().. - " tried to access a locked chest belonging to ".. - meta:get_string("owner").." at ".. - minetest.pos_to_string(pos)) - return 0 - end - return stack:get_count() - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in locked chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to locked chest at "..minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from locked chest at "..minetest.pos_to_string(pos)) - end, -}) - -default.furnace_inactive_formspec = - "size[8,9]".. - "image[2,2;1,1;default_furnace_fire_bg.png]".. - "list[current_name;fuel;2,3;1,1;]".. - "list[current_name;src;2,1;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,5;8,4;]" .. - "listring[current_name;dst]" .. - "listring[current_player;main]" .. - "listring[current_name;src]" .. - "listring[current_player;main]" - -minetest.register_node("default:furnace", { - description = "Furnace", - tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"}, - paramtype2 = "facedir", - groups = {cracky=2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace") - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, -}) - -minetest.register_node("default:furnace_active", { - description = "Furnace", - tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"}, - paramtype2 = "facedir", - light_source = 8, - drop = "default:furnace", - groups = {cracky=2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", default.furnace_inactive_formspec) - meta:set_string("infotext", "Furnace"); - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - if not inv:is_empty("fuel") then - return false - elseif not inv:is_empty("dst") then - return false - elseif not inv:is_empty("src") then - return false - end - return true - end, -}) - -function swap_node(pos,name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -minetest.register_abm({ - nodenames = {"default:furnace","default:furnace_active"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.get_meta(pos) - for i, name in ipairs({ - "fuel_totaltime", - "fuel_time", - "src_totaltime", - "src_time" - }) do - if meta:get_string(name) == "" then - meta:set_float(name, 0.0) - end - end - - local inv = meta:get_inventory() - - local srclist = inv:get_list("src") - local cooked = nil - - if srclist then - cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - - local was_active = false - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - was_active = true - meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) - meta:set_float("src_time", meta:get_float("src_time") + 1) - if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then - -- check if there's room for output in "dst" list - if inv:room_for_item("dst",cooked.item) then - -- Put result in "dst" list - inv:add_item("dst", cooked.item) - -- take stuff from "src" list - srcstack = inv:get_stack("src", 1) - srcstack:take_item() - inv:set_stack("src", 1, srcstack) - else - print("Could not insert '"..cooked.item:to_string().."'") - end - meta:set_string("src_time", 0) - end - end - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - local percent = math.floor(meta:get_float("fuel_time") / - meta:get_float("fuel_totaltime") * 100) - meta:set_string("infotext","Furnace active: "..percent.."%") - swap_node(pos,"default:furnace_active") - meta:set_string("formspec", - "size[8,9]".. - "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-percent)..":default_furnace_fire_fg.png]".. - "list[current_name;fuel;2,3;1,1;]".. - "list[current_name;src;2,1;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,5;8,4;]" .. - "listring[current_name;dst]" .. - "listring[current_player;main]" .. - "listring[current_name;src]" .. - "listring[current_player;main]") - return - end - - local fuel = nil - local cooked = nil - local fuellist = inv:get_list("fuel") - local srclist = inv:get_list("src") - - if srclist then - cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - end - if fuellist then - fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - end - - if fuel.time <= 0 then - meta:set_string("infotext","Furnace out of fuel") - swap_node(pos,"default:furnace") - meta:set_string("formspec", default.furnace_inactive_formspec) - return - end - - if cooked.item:is_empty() then - if was_active then - meta:set_string("infotext","Furnace is empty") - swap_node(pos,"default:furnace") - meta:set_string("formspec", default.furnace_inactive_formspec) - end - return - end - - meta:set_string("fuel_totaltime", fuel.time) - meta:set_string("fuel_time", 0) - - local stack = inv:get_stack("fuel", 1) - stack:take_item() - inv:set_stack("fuel", 1, stack) - end, -}) - -minetest.register_node("default:cobble", { - description = "Cobble", - tiles ={"default_cobble.png"}, - is_ground_content = false, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:mossycobble", { - description = "Mossy Cobble", - tiles ={"default_mossycobble.png"}, - is_ground_content = false, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:steelblock", { - description = "Steel Block", - tiles ={"default_steel_block.png"}, - is_ground_content = false, - groups = {snappy=1,bendy=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("default:nyancat", { - description = "Nyancat", - tiles ={"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", - "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, - inventory_image = "default_nc_front.png", - paramtype2 = "facedir", - groups = {cracky=2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:nyancat_rainbow", { - description = "Nyancat Rainbow", - tiles ={"default_nc_rb.png"}, - inventory_image = "default_nc_rb.png", - is_ground_content = false, - groups = {cracky=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:sapling", { - description = "Sapling", - drawtype = "plantlike", - visual_scale = 1.0, - tiles ={"default_sapling.png"}, - inventory_image = "default_sapling.png", - wield_image = "default_sapling.png", - paramtype = "light", - walkable = false, - groups = {snappy=2,dig_immediate=3,attached_node=1}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("default:apple", { - description = "Apple", - drawtype = "plantlike", - visual_scale = 1.0, - tiles ={"default_apple.png"}, - inventory_image = "default_apple.png", - paramtype = "light", - is_ground_content = false, - sunlight_propagates = true, - walkable = false, - groups = {fleshy=3,dig_immediate=3}, - on_use = minetest.item_eat(4), - sounds = default.node_sound_defaults(), -}) - --- --- Grow tree function --- - -local c_air = minetest.get_content_id("air") -local c_ignore = minetest.get_content_id("ignore") -local c_tree = minetest.get_content_id("default:tree") -local c_leaves = minetest.get_content_id("default:leaves") -local c_apple = minetest.get_content_id("default:apple") -function default.grow_tree(data, a, pos, is_apple_tree, seed) - --[[ - NOTE: Tree-placing code is currently duplicated in the engine - and in games that have saplings; both are deprecated but not - replaced yet - ]]-- - local pr = PseudoRandom(seed) - local th = pr:next(4, 5) - local x, y, z = pos.x, pos.y, pos.z - for yy = y, y+th-1 do - local vi = a:index(x, yy, z) - if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then - data[vi] = c_tree - end - end - y = y+th-1 -- (x, y, z) is now last piece of trunk - local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}} - local leaves_buffer = {} - - -- Force leaves near the trunk - local d = 1 - for xi = -d, d do - for yi = -d, d do - for zi = -d, d do - leaves_buffer[leaves_a:index(xi, yi, zi)] = true - end - end - end - - -- Add leaves randomly - for iii = 1, 8 do - local d = 1 - local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d) - local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d) - local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d) - - for xi = 0, d do - for yi = 0, d do - for zi = 0, d do - leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true - end - end - end - end - - -- Add the leaves - for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do - for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do - for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do - if a:contains(x+xi, y+yi, z+zi) then - local vi = a:index(x+xi, y+yi, z+zi) - if data[vi] == c_air or data[vi] == c_ignore then - if leaves_buffer[leaves_a:index(xi, yi, zi)] then - if is_apple_tree and pr:next(1, 100) <= 10 then - data[vi] = c_apple - else - data[vi] = c_leaves - end - end - end - end - end - end - end -end - --- --- ABMs --- - -minetest.register_abm({ - nodenames = {"default:sapling"}, - interval = 10, - chance = 50, - action = function(pos, node) - if minetest.get_item_group(minetest.get_node( - {x = pos.x, y = pos.y - 1, z = pos.z}).name, "soil") == 0 then - return - end - print("A sapling grows into a tree at "..minetest.pos_to_string(pos)) - local vm = minetest.get_voxel_manip() - local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16}) - local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp} - local data = vm:get_data() - default.grow_tree(data, a, pos, math.random(1, 4) == 1, math.random(1,100000)) - vm:set_data(data) - vm:write_to_map(data) - vm:update_map() - end -}) - -minetest.register_abm({ - nodenames = {"default:dirt"}, - interval = 2, - chance = 200, - action = function(pos, node) - local above = {x=pos.x, y=pos.y+1, z=pos.z} - local name = minetest.get_node(above).name - local nodedef = minetest.registered_nodes[name] - if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light") - and nodedef.liquidtype == "none" - and (minetest.get_node_light(above) or 0) >= 13 then - if name == "default:snow" or name == "default:snowblock" then - minetest.set_node(pos, {name = "default:dirt_with_snow"}) - else - minetest.set_node(pos, {name = "default:dirt_with_grass"}) - end - end - end -}) - -minetest.register_abm({ - nodenames = {"default:dirt_with_grass"}, - interval = 2, - chance = 20, - action = function(pos, node) - local above = {x=pos.x, y=pos.y+1, z=pos.z} - local name = minetest.get_node(above).name - local nodedef = minetest.registered_nodes[name] - if name ~= "ignore" and nodedef - and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light") - and nodedef.liquidtype == "none") then - minetest.set_node(pos, {name = "default:dirt"}) - end - end -}) - --- --- Crafting items --- - -minetest.register_craftitem("default:stick", { - description = "Stick", - inventory_image = "default_stick.png", -}) - -minetest.register_craftitem("default:paper", { - description = "Paper", - inventory_image = "default_paper.png", -}) - -minetest.register_craftitem("default:book", { - description = "Book", - inventory_image = "default_book.png", -}) - -minetest.register_craftitem("default:coal_lump", { - description = "Lump of coal", - inventory_image = "default_coal_lump.png", -}) - -minetest.register_craftitem("default:iron_lump", { - description = "Lump of iron", - inventory_image = "default_iron_lump.png", -}) - -minetest.register_craftitem("default:clay_lump", { - description = "Lump of clay", - inventory_image = "default_clay_lump.png", -}) - -minetest.register_craftitem("default:steel_ingot", { - description = "Steel ingot", - inventory_image = "default_steel_ingot.png", -}) - -minetest.register_craftitem("default:clay_brick", { - description = "Clay brick", - inventory_image = "default_steel_ingot.png", - inventory_image = "default_clay_brick.png", -}) - -minetest.register_craftitem("default:scorched_stuff", { - description = "Scorched stuff", - inventory_image = "default_scorched_stuff.png", -}) - --- --- Support old code --- - -function default.spawn_falling_node(p, nodename) - spawn_falling_node(p, nodename) -end - --- Horrible stuff to support old code --- Don't use this and never do what this does, it's completely wrong! --- (More specifically, the client and the C++ code doesn't get the group) -function default.register_falling_node(nodename, texture) - minetest.log("error", debug.traceback()) - minetest.log('error', "WARNING: default.register_falling_node is deprecated") - if minetest.registered_nodes[nodename] then - minetest.registered_nodes[nodename].groups.falling_node = 1 - end -end - --- --- Global callbacks --- - --- Global environment step function -function on_step(dtime) - -- print("on_step") -end -minetest.register_globalstep(on_step) - -function on_placenode(p, node) - --print("on_placenode") -end -minetest.register_on_placenode(on_placenode) - -function on_dignode(p, node) - --print("on_dignode") -end -minetest.register_on_dignode(on_dignode) - -function on_punchnode(p, node) -end -minetest.register_on_punchnode(on_punchnode) diff --git a/games/minimal/mods/default/mapgen.lua b/games/minimal/mods/default/mapgen.lua deleted file mode 100644 index 30a865366..000000000 --- a/games/minimal/mods/default/mapgen.lua +++ /dev/null @@ -1,137 +0,0 @@ --- --- Aliases for map generator outputs --- - - -minetest.register_alias("mapgen_stone", "default:stone") -minetest.register_alias("mapgen_dirt", "default:dirt") -minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") -minetest.register_alias("mapgen_sand", "default:sand") -minetest.register_alias("mapgen_water_source", "default:water_source") -minetest.register_alias("mapgen_river_water_source", "default:river_water_source") -minetest.register_alias("mapgen_lava_source", "default:lava_source") -minetest.register_alias("mapgen_gravel", "default:gravel") - -minetest.register_alias("mapgen_tree", "default:tree") -minetest.register_alias("mapgen_leaves", "default:leaves") -minetest.register_alias("mapgen_apple", "default:apple") -minetest.register_alias("mapgen_junglegrass", "default:junglegrass") - -minetest.register_alias("mapgen_cobble", "default:cobble") -minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") -minetest.register_alias("mapgen_mossycobble", "default:mossycobble") - - --- --- Ore generation --- - - --- Blob ore first to avoid other ores inside blobs - -minetest.register_ore({ - ore_type = "blob", - ore = "default:clay", - wherein = {"default:sand"}, - clust_scarcity = 24*24*24, - clust_size = 7, - y_min = -15, - y_max = 0, - noise_threshold = 0, - noise_params = { - offset=0.35, - scale=0.2, - spread={x=5, y=5, z=5}, - seed=-316, - octaves=1, - persist=0.5 - }, -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_coal", - wherein = "default:stone", - clust_scarcity = 8*8*8, - clust_num_ores = 8, - clust_size = 3, - y_min = -31000, - y_max = 64, -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 12*12*12, - clust_num_ores = 3, - clust_size = 2, - y_min = -15, - y_max = 2, -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 9*9*9, - clust_num_ores = 5, - clust_size = 3, - y_min = -63, - y_max = -16, -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "default:stone_with_iron", - wherein = "default:stone", - clust_scarcity = 7*7*7, - clust_num_ores = 5, - clust_size = 3, - y_min = -31000, - y_max = -64, -}) - - --- --- Register biomes for biome API --- - - -minetest.clear_registered_biomes() -minetest.clear_registered_decorations() - -minetest.register_biome({ - name = "default: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 = "", - y_min = 5, - y_max = 31000, - heat_point = 50, - humidity_point = 50, -}) - -minetest.register_biome({ - name = "default:grassland_ocean", - --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 = "", - y_min = -31000, - y_max = 4, - heat_point = 50, - humidity_point = 50, -}) - diff --git a/games/minimal/mods/default/mod.conf b/games/minimal/mods/default/mod.conf deleted file mode 100644 index f6f7ea798..000000000 --- a/games/minimal/mods/default/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = default -description = Minimal default, adds basic nodes diff --git a/games/minimal/mods/default/sounds/default_grass_footstep.1.ogg b/games/minimal/mods/default/sounds/default_grass_footstep.1.ogg deleted file mode 100644 index ce625d92b7bb196dc2f7a3aa642b1c7b1fd96504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7014 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 diff --git a/games/minimal/mods/default/textures/default_apple.png b/games/minimal/mods/default/textures/default_apple.png deleted file mode 100644 index 4473dca285e3fbb076b28ca0efe057a576befcac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr-gYPE_P$aNs!H_FVS6 z?>xIAt}g{GYExHB_Fdh>Fk8*tpdmKX=Rem(sp-F&e{pk0B-meq<8{+LR^7#Xn1gcB-7>V=c|hU zfy5b0g8YIR9G=}s19I#=T^vIyZuOpa=VLJ7V0Jw9|G!MI&k^4HWh$p@)3zCH58B$| zdGcP8l@Qy9Nj~2hIE)=c4jozgG@X0$p*f20tNV^J{AzTVBLXyv!PC{xWt~$(696=t BHKzao diff --git a/games/minimal/mods/default/textures/default_bookshelf.png b/games/minimal/mods/default/textures/default_bookshelf.png deleted file mode 100644 index f225e3449cfd3d1ab84e61028a72135c4bb90939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmV+e0{s1nP)EN1>jx7af^-+LdyMK7~~objmS7&^Z$QKXJ(cUeQ1B%&wAgrHWuso zu-|LcTkmhv(Wwk-viJ zzy}^3P%kdbaO3fZythH$T_lpYkJYO9XNMck)sDTCQe#h}Nu002ovPDHLk FV1jg0xVHcR diff --git a/games/minimal/mods/default/textures/default_brick.png b/games/minimal/mods/default/textures/default_brick.png deleted file mode 100644 index def1cf0b17ba8883fd4748b941cd76219218ca63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmV;)0XF`LP) z?&a(7=kWFH(~=o*0002oNkli)NHQy1JnnqC+kXrDR600000NkvXXu0mjfBBRm~ diff --git a/games/minimal/mods/default/textures/default_cactus_side.png b/games/minimal/mods/default/textures/default_cactus_side.png deleted file mode 100644 index 128a4d28a74a7bd8e4436b67e8f1e5a4cd41e65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0Yx(jm2*k+uXo=>wp|5 zPZ!4!4q4WNj-m$?1e_1%w@(d{obziDOF^LD>=kc#ir6lvp1PZH^u+VWl7_Ezvf`DG p?>XmI+anXK%v?Ha=X%ZM^@hHRYwsQJKM6FA!PC{xWt~$(69BnDF8lxh diff --git a/games/minimal/mods/default/textures/default_cactus_top.png b/games/minimal/mods/default/textures/default_cactus_top.png deleted file mode 100644 index eda1a0bb6374dfc88b4475f304f2b0e034ef5c1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0Fe^#kP0dy#+v)o~Mgr z2!|}|!Hv8O3Opzopr05z~6ZU6uP diff --git a/games/minimal/mods/default/textures/default_chest.png b/games/minimal/mods/default/textures/default_chest.png deleted file mode 100644 index 9746a3fd9396e8d318be2674deeee14427c74586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJx+0MH8sl}#uI=-%RF5iLp+Wr=VT--&`d~7NJy}7*iyvK7If9v(BQ&B_9aa0 zLRa|wFMba zSA!3-H#G@glyEu1xNgHSExC@}s|pSTK9tE&(0#fuX6DHQ2M!2WO!P99O4CR*o;B;| zgWIj4Tedb#oIAZuY)}0B^DAF+CSK6u+aP5dCC@YM7X!nQk18x*_VhLZUCiL=>gTe~ HDWM4fnuc4; diff --git a/games/minimal/mods/default/textures/default_clay.png b/games/minimal/mods/default/textures/default_clay.png deleted file mode 100644 index 070b69e486b4f521bc7829f8245cab562a6c07c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UA7>k44ofy`glX(f`a29w(7Bet# z3xhBt!>l}=`|MeE^Tsc%fa9~2au<$io>?|eOzV9wZi zj~zWlp04^~Aibw#j!VO)m=8f}EHii(Cm-wF-rc&?(C5J#)!n+mhdS2wq*bhJKc_yi zFlbSs`hk<%o>~>;O#YTWxA>GQR}%Icj^?C$KF1?q?hYaaBlUkdTZq@)9ULR^9LVg`mYU~&lq!)Y-4 zotEZ%P0gw_mX$zh=8_=4U?Bag?8rSJW#{SQ7*cU-=?PE10}4C`9Jp@&`~T>gmY|0F zhuk}PMfyvew5EJCG~;W_R4HD;rZUs{>GR7HX+2M3n8NQqDAf1iXEGA{xcei}BnD4c KKbLh*2~7aPBsWn2 diff --git a/games/minimal/mods/default/textures/default_clay_lump.png b/games/minimal/mods/default/textures/default_clay_lump.png deleted file mode 100644 index ceed6fa7565f91e9431ebf5ccd73a4ffa27d2cc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJPk>K|E0B(kj;^n-U$SJ$>}t&h zAfK@$$S;_|;n|HeAV<&B#WAGf*4`5bIT;Li4j(vjul{)wm*ZK6z4JrtZ^lW=aPh>x iDDP-qZfTWeQe|zD#L%kT(RCZBlfl!~&t;ucLK6U9+bH?~ diff --git a/games/minimal/mods/default/textures/default_cloud.png b/games/minimal/mods/default/textures/default_cloud.png deleted file mode 100644 index faf0ec13de983c2e28528138705425868155b239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pxOfx;Tb# c$R;ZY0yzc@j9kw>M1U*?Pgg&ebxsLQ0CUz5%m4rY diff --git a/games/minimal/mods/default/textures/default_coal_lump.png b/games/minimal/mods/default/textures/default_coal_lump.png deleted file mode 100644 index dae47e3425bd7007f94cc701ecb1dec022f5b8cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u0UEvMa9$8GdDMP%Gu4n zKt5whkY6x^!?PP{K#q>5i(?2!baKK0{vZ4dPyhdC6xtug&>6m3LSjbPL5{Xi?ZzZ+ g=f;){jw3P*A@8`;V>9>61?pq)boFyt=akR{0I=I8KL7v# diff --git a/games/minimal/mods/default/textures/default_cobble.png b/games/minimal/mods/default/textures/default_cobble.png deleted file mode 100644 index 2a28d25a569acd27621d745c5d23f29585a8b265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UA7>k`eLpYvsMb89sI14-?iy0XB zj({-ZRBb+KpaN-67sn6@Nk#$2_x~8Iy%pu$>izpy^tlcTZ^vmN8|P?tHt%GZ-PyN%ifBbi z`^?$>>b{Zf41IH}n^sQu@@m<%Q3<<~Enn^8GUd;RJS3?fp(61E!a zTWTgICc1=JYcgC`oVujoH((SVSdk?mAh)^HY`c+Tiw&pvV)=6HDuP7 z%>^r`y3Z_aY^zzp;A18&)l@3Gyg5Gfqp)iS+HbS#8F% S?;jf|Ks{akT-G@yGywqq=#m5g diff --git a/games/minimal/mods/default/textures/default_dirt.png b/games/minimal/mods/default/textures/default_dirt.png deleted file mode 100644 index 7cb9c89a637584b4e53c82a7c6eb1ec7109befae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1586 zcmZuw2~d+q6kb75sRsk0q?k5{zaXLY3W9(a3WY_b(ZE_-}~PC4=Mb- zCz@KD0stmLAJ5hNHZ$yTM*K|HggXOZ3=}K;y|~K;HygYd_n2W(N(mttV}uZdP!I$P z00964fB=912s~@VCrSY!0Aqj04-!kfDGG<2RUGpVzRQivgMAj}(tFLMbMMCqjgH1f~=b0x{+`qLjbS4M-_J z1vY{`BaC875Wx^5&KEO^D1ij?IuN6f5?&utYaJ`E5I?++&lCPA6vozrkn!cK!dARW;7ZAqYmil;Xk8x zOex()Ljl;>&otgTV{MB@b^GU|kY#+M@6QhfTqKscG$EO}~h?Y0SX~b!+=X-vW2P^CC zOE1gUWNA;A{T|`yqmErDI$N!&=)c?jWchZ_!nMl>&VLnMmSVE1;auPnn|(q-;%E9DAfn*VT5@WtYVs_RuFy`_69T&H;7zq$%~PLRE~nZ{ai_oo0qY?o}pv zkx_0ntu5BM^m2$(uI=?IY4OK7d;Vx^iKuUnpIhX(Q?OX->^C>e_eEm+nW#%geM*X3 zOHoAh%n6^m_38d?NK2AgJM`c5va@ghJwKDMqkkYKL6vbCr9@%nFQnfi|&H}rRuSHf>1##()ElxLbrMJId zpVWIcqWS5hyFCZ5_|9(3mo~82t0k>9i@%W^D{WTTtUK&jvi`KGJSuF}X1pZ4Lf6^< zV{gGVrQ1uJBfEk0s5W! A1poj5 diff --git a/games/minimal/mods/default/textures/default_fence.png b/games/minimal/mods/default/textures/default_fence.png deleted file mode 100644 index e3510c52a1085b10c272c40fc440b9c5eb939e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfw*a3IS0K&Ez@VofYNW_(%*$XR z&1fRWZmq;)qrz>cqvWK->8vj3tRv#4&Fii&=4B$|t0&}ZBIau%{T z?5L6Kq@C=dk?O3P>SC1YuAk~fW4W-<;;!mh01z;nbNQ z)L9tWRg&19wmU3*{u(^5zWjUFq#)Pr!dkNL-=qbR+S6IsuKF}J zBr|0(te9arb>5qASquutO`@7FW<6wNk(sP-)38}Y_yMEF`TFmS-Sb73UOTOM73f3; MPgg&ebxsLQ02F(h`2YX_ diff --git a/games/minimal/mods/default/textures/default_furnace_fire_bg.png b/games/minimal/mods/default/textures/default_furnace_fire_bg.png deleted file mode 100644 index e3370f438fad0f8a5af6c70fcda355964da0191b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU1=2Qx9Mxicb&~A$(%dr@ zcvq&F+Xu0GFt`TA>Ica>hc z{qJ?9fBtor`E4%jD&z{_xy4yz?ZM8(arc$HmqzgVTN*DOfUNO!^>bP0l+XkK&pJaY diff --git a/games/minimal/mods/default/textures/default_furnace_fire_fg.png b/games/minimal/mods/default/textures/default_furnace_fire_fg.png deleted file mode 100644 index 7a126e325f3ca5cde22e76b3a89a10187e82d3e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0x^k7{-tEA@4a-Q#LPYHf)ku4Vky{(u%x=p>(lSEXe4h5q(fJC`|~VK9o=ylo^T< zMkGNAWtR6qqbrsrWm6K=>E@Q!FZUlfh6WvYIPZDh^Zw5B;fViPCEo6mmhf3*rZ@@y z1!@X*w8*}H$jjBvs9!61u35F<#mF2jLMwBk%y+q%7iZ)yVqVre6+RAjfJ)gi+GFJu z1vs-$=CLTv)j&7Vutt)#*P-?x-^)rn;NwAUs3)8Zp=YBN+^ll9h}Sy;rStt@ndsi= zXd@1#crJQnDqG3OZUt`=R`4Rym7kd#EVY=g#e6OF2mCE!qCkn@TsY$eK};X?V<_DQ z)90;QsQcpFn9L4Bm*FFM<{~8@v@4+~6fwF-A(_7ll?-Gkm?*YJeZAR9+GkFz=4-k) zQ@L{Hio+z2i?J9=BQVy*+tLrFx??yW2HlZ-+U3SXzFca~R>wiPhHp7u7~0lb0oRp` zK2b7xA;bn4$#O$q6Am}GU~J#SaH#?wB}2_N%t!q&SB1m-1nAPzpDDnQ%vht34KRIJ zjxjHQxwbg^YFzl!nj|%OtHp3FobL}*@H7cyMI}ksMmm z-O(M|ir}4w-YfplodqAYP@!U`GYQ7`!>uTIrG?&HMlXkAx}?E$H=f2w2TFWhIqvO@ zxE(LxSsKPl72HcjR~wAEX{TMHV!0Qmy&VxttiRk$lS~JSPO|_2002ovPDHLkV1hsR BPGA54 diff --git a/games/minimal/mods/default/textures/default_furnace_front.png b/games/minimal/mods/default/textures/default_furnace_front.png deleted file mode 100644 index 4da398c0a9c8fb2548d3351d92c836c2f6edbc11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjtFf_hczAejZf-+E!_=u$ zTOybK0ZMs$x;TbZ+)C|r9GkE|2 diff --git a/games/minimal/mods/default/textures/default_furnace_front_active.png b/games/minimal/mods/default/textures/default_furnace_front_active.png deleted file mode 100644 index 06c4ab3efec213f9bc4883c760b9b080ce9ca3dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmV+$0p$LPP)v(Kh(iM)|`C`Nj?T%NY62ANtx;{m~r#)Fvy=%fkQw z0B}h}K~#9!U5!@`LO~1zO<9`35PC27za+%cYI$#dqD-U=q6cL7Lk1*EgF^181PQUA z2@&iHfhy6EAhI?*vr?Lq?wBR1aA47-g9j!(+{o&j&CHyw%>3Gg&6<^MH#5&6UItDv Wu5UV@pLGItGkCiCxvXPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW1RND5G>FJeVgLXD24YJ`L;(K) z{{a7>y{D4^00NFlL_t&-83n;ha@#fl08kP?68wv#=va-KSk5HgWG0#P0L`N7E_#d} zqql1h&~)53vSV8oCGjT`AP9iSd-m^td<;ULCPW*%KQhj0cyi6q-E6u zA6?%>T3c1sAMQuSCa|xbnyQ~|n@hQSZYCoM_4m(gb5oFD+Ls-In6oMM9S@4DcQM+P z;MqF zXJ^xEC45XU1sK?av|c1d6vyzx&&wH@G+kn(m>3+_p0rtK8#(K~8(!uacAdwE?(2V* z)B~gjoGT^RECioN3(W`t&q(|B_I7ORRS^^~R(JoLd}`-;;4iS_A%tv*TyK`~Y#KL2 zyB$wL;x8QJvbq^L|CU{1KXDD$pR!B5Txam}uRk)OkSig?K|qq65C`$bQbxK~K&fX*KF;D;4S+yI zYq3SIf6p_y7O^ M07*qoM6N<$f}(d>ga7~l diff --git a/games/minimal/mods/default/textures/default_grass_footsteps.png b/games/minimal/mods/default/textures/default_grass_footsteps.png deleted file mode 100644 index 8349033d62edcad0223b154d9ab04b9979eb66e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 771 zcmV+e1N{7nP)rYZ~0ET~UwOX6bQETkMD=~ zefK;-?ZMgOEdM^ovBNb)sg5{z%8kqalm-t3+h?Qk>gZyU=GtPEYYVZ17jr&5@D`Yc z6{^4V^5{xAJ&!rNmMld&^lRkJ@}SX6x5foCQNo9B!^^ugJxtU>JdmkL-lkf#K~CXZ zwf$9-+UM&-gkYslAZO+8qGvMTzf_WrB%f&C_J&)qA8j z5W>{w!{wfEiRszvg7Q4Imn|`pfE8(d1K~`uCsPIxO%e~w4CUM-xe46P%a=*%GvU-b zeC7AJJwQaRBw)aX(S<4fvtY&oqS;n-UZw?>1Zn$n44ohMY5Fux@&F!~ zQ|-H#BQh&?&hbz_|A5{P+^b}R8*e+L299Y^mh0G|qgU<%AMLCaCxJFbSWLGjE3!a= zr7}Nuh1wK8+~-SA zY?G><*&6?&L5y+XJz ztque3lIcP;f4)QP#Ku1L+?6(B#nfSdOy67&$uEOLDvCEv*9SY!ZPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipQ0 z4j~36msoB900QnwL_t(I%O%KLa@$k@fZ_j0N3!mYX$gww9>;LFdjFcL?CG__Fh|_|lQFx9aKer}Z8&B%Q5-X#&j}I_ z*_}YxhA_Jm9XlO4Hg|U=S{lMfq9cb*S|9?c-`<2M1-rB$T{e_ui}AQyi9=eTg`n&@ zv0fiUqdQ@F9-GIKtD6~i*s$3gg)}Wum#vukBjK5ic>Q%GK^c?eom(vN-8L|3u!j0(~--oF^TUJ zg)TiOgf>|IQPBxatt#S$i!xfutR-2*pbBJBmn3Hv{>;R-LDdG&`HoXpF!ChAGk7`k zskOkdeD;SO@2)2dBa{2PXN;$ZmRTG!9gjI|3m(%g{m@dE;M)OLZ>AKgqilODThccc zi}?ljf2IV^fI%%ulK;asHSsi{&Lk7hrq3bt7vwvKr?lbs-0l&+0voo6-5dZ)H07*qoM6N<$ Ef()6G;s5{u diff --git a/games/minimal/mods/default/textures/default_gravel.png b/games/minimal/mods/default/textures/default_gravel.png deleted file mode 100644 index 4b47e2346ffe16711f750edcd35755174a6b88ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uDY5k9*$;V{vMsR1(sEO zAwcnHPZ!4!4q3(khV}m$oM&5IV(3(HIK|-IC9;a4lBMevL&E!82N-_UIjv!^yg4J8 zAyY6+g(2EXg_S|WCRv?fc8K9^1~HEuH3rVI#72h19MR_tZ)#p^F&w#hWl{mR%y#|P Swl{&+FnGH9xvXK|E0CV#sj@BC^Y*0NH2p^} zfPBW1AirP+hi5m^fE+zf7srr_TYFC&NtLxp5<{zUN7rqjP6kg`KbLh*2~7Zj8YyJ} diff --git a/games/minimal/mods/default/textures/default_junglegrass.png b/games/minimal/mods/default/textures/default_junglegrass.png deleted file mode 100644 index 7066f7dd95418fb818b73a49ec7674afc72deac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRm!VDxC`x5Md6n}tEh$~3YfJMcF-7Zx!vQNX* zNH-Ovq9n*Kn8D%MjWi&q$J50zghQ6~VE5Ek0}h9S*-nhvNsPZ1G}LG`EdCOI`5aJ< zm;&3I2Js261ROeLg`_uFr6?yHwfA_$5v$_TsrN~BXYAA0+zajZX$fT6$$Gt7cfKL% zV|b|0IhlJ`PadvW%eFtmZZ_*u`|Fy@H*;SGt0tIT)sJ8C{L1@Wk1fB8xcL^xUe4Q5 e_gA*)KXc+8(XX$|mM#X`$>8bg=d#Wzp$P!5x>AS$ diff --git a/games/minimal/mods/default/textures/default_ladder.png b/games/minimal/mods/default/textures/default_ladder.png deleted file mode 100644 index 46757b884e9510342fd1f4323d4ede538ce7ce2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfmH?j+S0J6@E}h~bmFXpuQL&qnSlUv+^`% z6&uYiHl9;rG^fOPZi(^yQsaeXCX32VmsFT8sWe+&ZN8$`d}WRK>N<<{jg}jlEjPDV zZELr_bnyiz(A|tBL4Lsu4$p3+0XbQoE{-7*;mHXJ7eta9m<)XloP&J=ub;RO5*{n2 zr*KY1<E!=RkZFZgeE{Zyc>44$rjF6*2UngGJZ BfA#Nklpde+`fooR#?gU?~ECfpRj|H2-c*q#J)` z@B8n~$Qvl?L!TTk5SC9!go|`>&~86Srl*!&!0WebB_Ubeyj%>m7s@w`(R68k$}(WV zfWyzv1SZnq7=W9S7$G6lwlzb4M{lk#L(t*E^9_t99RUo+LYo_;2 z^3-SmP{IsuFx*fv}pFELRny;Xi?N$OIqRu-{wdkae@%k&kEj1sucXdInmpHD}UkpgNZkIE*RNAriGNO(g+{v;zofN zrrF}+q5^c@+gdY{t17h*2S0eVdg+L>v0~4=%CNpo+#)>;d+Gr(-$e+&Td7iaHV0vIkwcMJgN@6Fb8 zD~O`onq6?v-1VPgX#l}r_aB(EMhM`xKe77TSYvdrkO0<}!WMTo!Ku{x*qp!Yk_~5G z+4qBMs>PunBy+P&PGuSZ?ih`^E#={iIHWT}+~-LAljhpIIZ`ecjk=vXCzIl66lF3E z!<&bbRVBe1&9NRAo?y?yzx+HSOV9Le6y@!%eRVmLNn0dcKz)5Ix!}f(b#>l1>@sZ6 z7*66|w(D1+ zr;`s4)pBp}buqSmtlSZTZjLM=T)e2_he_V+b_>YLI=Z%&YQE%6{)eIWiu%sY<;w>Q zYhk}7mk5dLudaA!x=YKE3!ImANsL4fZy9L1LGZC5!x&r#*tz2|HfL?HZ>W?SSr5{B zkY0bGq_ZT^&1aTer(C89w*X+x8~1myDYr^W6=ggC;I29#!)5iwi9|b2cs=w1F#Q|< zeU425n*JA8b@jn0n z006%G`w9TS9Q=mI@0Ef1elT2)@O<@WW|&OAX_`vwW1-qQnQ!?@%ky)v2)%xn>wIVG zaNG7%H_p}Zen+yHV2eCSfU5^mLQ!ox004QZlF}^zpy4NBAtX{Aobj?S1e%WJCLa2~ z!IR$sz*_!k`pIR0h9BS1w19r3U71Xj$fNz$5F{(uwl~)WAUGJka5$MW0>L$3DMlZ` z8l#WJE?|vWZQAUufnL8o#2OAn9B)hs->rBTmhAkg^k|Fu#asix-bTu$hI59KDZN?J zkf*|z2S$t1V5uz5t8?!=MK7LOUe08mBp27R-Hn1vEzh@zj*`wkd(Sda@AYLJ7haq> zM^j;o!pS?fDD?T+^!}Xz{vdA&wi~X`Df0Q3U|epUj*hfiq9k5fE(Aqdcy6Vl{$o9A z+#biP2GjeqRIyv9`)q^Tt? z?QW|TN0~}O*>8PfMC<--wbvi4%`H(eZ3vK3XPGeOj$s+JW+cKrcm}`$?(_jnceiJ2(KY1cP>{54{emTJqXE6ZfGy({Hi<*eyKlV&DnQ8SZC+nQfy(n8L7EqZeELlE-ZH?>Cc08% zy|qPQRe;mrgm~>0b-0ayOv^4Ye;&oqMup=XU4b@Inf^$XWkNzzY}XelnsP9IOM_v}}9_R)(>En+6wx6Ho& zFR~P;TM1hd97jBJYC$iaw3#hSDcUns1Bn*C;Dga}Xi$$IK7;*6E;N3Eg_c6b)STOPG4UqT120PN#zL5Yt z`C-*cDMyC^faC9BPgvm4vkIU{vG(;-MhsyfRqE|jCRWHDB?|z++buYOwEzHEVT}@4 z$dt;2c)5?{jY0|lpp^-ZuyVJ3bc?3=!9gSM9^+0O}6sUrz7oEHgqUVVH&C%33fuQsv^D zZlBoTHaJ8pDdH#+aN|nud)iKZ)D8QdwrR@z>~F3sv#-SiiabL2W*CLN=V(;;zKY`j z+i97aY=yY8V(lNV>##UOJj2{MZcVr)J}~2vM7_mD0MGl`={axyT})mULbSHi_!8iq;;ebrF9ln+}~d2&(C#XN2NyWTFbr$D-4DV8Q$4m0EDu85&` zT}|lWo4rFXH{)2&#oRbfV{Cv;0iFd>YLr}mG4A*0a;b7DI}2+Esxm*XG1_v^9_NZ- zwl~yySC^TPmzPo245Y}c%k>>IeFAI7tDV*|BUjSQcco(~@mYDRd=UNoGvqfwi zaINF$q7c?zaHZ#^p;XGT0GRa@TP0Ysj?H6C$a-At*1B~-L!(;J0y%v`?iv92z>ps+ zu$H{P>k7y^V1t#(MU_l}f@8m|2&rUu4gh%dY3%D3IDP~GlVI(+Qci^eG9e!A_$fkO zyW0W)Fde}XZ@sPouwW0rVO5g?634+Y$73W^I z2ij8Rc^>8fz^B$qJkjf^um=c)D8eGl(IBiH@siA1d8QlRe+EDa^uP#L+kgJ9_s~7y zHZXGOLG`24NbpQ{T_v~1=)ZltUtKu>d}%$}aiI9>?}Wk|#A)(#?l~g?;1hS@Jyig@ z*X#RHR1Jc$fx5iLl827YDK&Xk#F_2&Lg3a_Jo_|L@Aa0to-Wcfo1g#E&a%3^%hL`? z1Rf)bgaaoc<2Wi!ha46r3t?J?l`=5qH%8hc;VkYnC#KmRu_Jr(ltUU%&b5&e$9ZLX zNi7^xMdAyg{%$>6@3w3(yp*%6&v2WP(LuL9kq(`SPKLUg&!0KnPWow)Yh{%@l6X`| zd=@{nKX}y%pBKz#tJNGT-elWJx7+FGeHmn>fhbb~^q^~5W~s~Lz1l0kD62v4GO!-3 z$m4jalS{2t6<1)Q^y4-3-V4(g-{FIK4#m}r>f{zI002aJu0Sg534AxZY5>_=%aONv z{GHOe3YQLW^M$Yh08oNmb+SC~Ct@iQTN))Tko}BOf!AzaIY?=c+W7#d&OsilA?{d# zE2YWvIL~))Xexm$;Dtp1RiUy4B>>(%3cXpeorYq2U0Wz%p+Zz3Tg%+O5@2Zr6$1db zd<>!mKv($9m1zMArca2|3G%5IkpSHH4EfstoxY$j0EOwCFK}=H`1z7^DnWkj8tNJi z64C++zI`yDKLgO8`S!tp^U>gYUd>N4izqJPXvkkKPXM0auXm7LffJnrfGn7B4)NRX z5PKe2wR}=WIfX!gfUm8C0!IS?l*b%RE60F>nx6`gGa27G1^}$|;1a(3fd7Ms0Fa7b z@HfW+@-*FFB@n2f&tyzctNr?F)&$7S3^s~&L!EjRKB#^BZH`9(cV5eeK1Y|j`eaCX zV8Dl+Rn#_swc`a9I6gp|_xk|1j59mKnI*R!dm1PO!Ce!0TVM&609b+~cx2vHx-faZ zvBHnex_Ni8mnm6-Pmi)^09L>>1Q77pn=bHH*U?%#S|1K^L}9WHAa5Pzx{F~I%$M0v zWf@z>zje zo#oVt6W0U%L0?^(v^ybhoQNNIXONZb-3P?JVMVO_7jp1k4$bL_m3(5HjRUX?08oMvkC`M5 ztI~7WhddX5~b16+gA{HG%p9}M^G5;@^9B6AU$deeY{KUtp`kkC8EnH2fs$8aRT z4}Xq%0|3w(uzJD7drblH%+=rQXsay7>>uL5`zr2*t=N$+TvX$;D`7Ky1dFi9yRT^A(FMdV&=m^)z`?&pV2O^^AgGDM3=ZJ)~j;F#YiC9TktLbRr)B&bGOx^h>$+v}fvb@3Z7tDWtrJ|3Z= zJd%IZd%mUPOiKY^``vLZC|_O8dJpyj01|*GN&2`QAqGK#T+XaDqnFl7#?S*r-|(9MDP? zR=g7-nZ^+~;D83suy;oW063MsJF;j70TO^?39@Z?y#)Z=I11yu`H_D22mpSaX!e)+5s#E6xnCG3>cwib}{aC)ILPeqPJ&Sf-313=;HvsUN zYZJQAbveR6oWa6G!2a#W$9pf)_b-lI{6jnD(23rB|MQjrO;_OmOw|25I;GSm09 zgkjAeY=YhJEVuy6r$v37?@pF{&qQ$?6-2S8!{e5c91{H51t6gS30J@s{Ke@C5+y7U z_}-&!nn4^}0Fms%y>kNKgHd*a1W4O6t`ymG{LyiLupBS;Jtf5A)D#HiC*>>eY%%D@ z?*`v{Rh}QBb}s4iJk@3OhJ39U5kaHU&{3``ji%>$^2-wus-QIR!?SuZ}>S_?5!%7%@V ztYTYOK5KVZLt|yA^bqf@**hOeZ-8!PSiIG=Y zN{uiQF|-;xECAg7 ztD!RuARssLjSz_t?ZgTIt{W$>F+cAt%m@G=Y{VH3xUjNhB*;!`e{cc|fdb$L4*oEB z@LwcAD0@F`9yp5+O((yyiWDflAmzx25#qCJk&1x}x$Ls&qDx!kh5gr|Z%;Q95Q3}j zpghUx1l=nN7XZM!2_=9W3jU6E&Fcg3$yGf51X15LMWJ)wM~F|aLR?GzS%ij8!koc6 z-<~R&s%MiVw1lBo50dHWNXjU>aRp6>p%H=mrO8yAXPJKBU9#;?eFU2iTKiVUHDJ}ckvBF_0Yxg&C0pTcP0 zcY30m3*RaHvQUn=NObgNH)XFpbJZ2~rUWXwoWrgGScTq(lzi~Z0t_4S z{lf?;r7;+@e!Y~9Aqnbe5){BF?4aTyg+2XI4wgNAU)b@o1T3_g;Ck}hX?epM4a|-s zmMHsR?I-R`0J5$c%Jw&MAcy0xA}sQ`M<}!go_YZB3R*HhTYv?y+3e=79{^%cX=0`;d0N(_v=xB&1`hs)>L^OY`X3jp?B zm33bpeyv3&WoE=ORw9G~0Jw8CnFS;O062}ZK!Jk6zzC4QKOMCK04?Db{_bxo|M+zY z06aGE!_x#%&hx8lNKnIF*{KibLfp85lBRJf>((Wkx3tQYf`^*-oEV(VgoQmfF|xqf z41Ka^8UQps+ksomi4(mkzR_LVZ2uSr~_r_Q69Qw)n7PQ7Y5=-3VV7s)*91 zCH3dy#qQfH<&|D}9%mJ-?^2$fHFDj?+@8~CsFVWQnIg@?#ZJ1^mD+Xuwe$Hp(|eDX zmgv0;Zu9D!1NMzxI_3kFQcy1ixh!P_!O)PNOw`6cacYmZc=afZH?J5TWMzt~#KW2H z*rf35K^&)0^EUdPzHWDMWOAfHzq-JNGHqR>Q=tqMt)xajw#s-rT;br=#m? zrynYxT42=Y)(KI)u*n`pks;k$)m<@=o}OB4Tdi$rBI%V4Qh1H?JptS_L3PC83XL`G zsU>VtYKUuBdnl#zTp06-b=qHEkVyBL835&DZ}PyB_n*0MnIdH$j#7TfbwEJn)`}yM zTB_St1N5#WPjjp#Y2Ef^NZVioo8CSYIp9I_sj?DMKJ~8vz=6M~cn|;#fC&Nr6A1tq z`1(}MNGb395&&Rw$Sv@X-|+x!fwkZN9&#Ny#EyfPg$7xE&I$m4`_8~2ZoM-F0I;{- zmg;GMLWpkWet$_w7L5=9z$HV1F2f@NKnP%HI2S1rfRfIqb0O!Wx z{na{E`8Co_rTl<9wL1;^p{}rY#ViwY65wf6dH!u)ZVTC*7+=%KDg&bIj}F!Kmp8@J;cDSJkDa5ec)3&AdbrN@ zfXu6rW0yOvRuU#M301#y>#)?lyQ|Orq~30!1i!wX#=2o{)L4s&i> zz2(#8kpYP}a6=v7?zPlC%?%nX=^{{8+&!t+Uy-7U^_6+y;~K?HASSOGsF^&TR8@TNL{76a9hJ#!>3yD_v(oQKZ-15EG2C zSTTp~v$F*-QDS%=UQD z%aN-^mJRjhKes;Mq9q>Jlv9M$c0@y&pPc9yo~M!|&$E6jsmSFJSB`7@ds};C^DNHO zpXAy;*M?7bE%ar#B|y3A$y4*r!cm)p(qs3N&ZOLBvtIZ0&kaJv5^B~>UCQqE*OF>~x#;CZ#t z(OqxNN2b|9|4?%C;s$qG_(KStN0#*uC4pkPVH=B_YPB{pQX3t;eV1EN&*rDvz){vM zrRQpoz(MbtcsBa(38Sk}$S2)T%EGfOMF@4*@;V}cR(!%*)LAM#S5ekJ?eYx|wSd_u zrpq<}-5Jj;gjX94avm}Xv~+)GB7ehE3%EXu(3n@~v8P6+1W-shP0_r`u&0yubhJp3 z+Q3l+yf~KH^je9p0MhGl^sqWJHRT$v>e^Am?#rX{J@#E!uoC(FlET#so6uxEggR13 zkEEuh+~Y%2Ng!oUGhgMYo`EfL!b$?07dI$$a&rp5OdMh)^^R=O9i6a}DZ|X0F`-_& zw&SP!v$Zn7re$Oo&tr`SF^F83nMj9WxjY`}YNTrAAVzOttsf?~Sy*IfaV!zi77dD_+}DmNO$A(2bmBn&Q}Z%9=wrW+~u_@Busd{-Fx zHCX|CV<}lfV~qw8-V~5l#g%89LQ2*5MG*XDL7G#;60O)jl+@GdS!;mk`K?tVpAC{! zM~e)AM{@wkR0HG4r2DSh(>uLyj5`Q-&GswiiQ2<>)p9v7y1G~#aK7WF$s*!1G zARxUVqe~`~A)|irVI;r4Jw=nC{!%a->ci-?XUF z#_s@COK3`8FMz#@AZS8_H`8}Rj9&(lfxotBYhb{EW9Q&jb!rJgq! ze(s(b;s9cVa^6Kc_kD8E!S*%V*Z!|w{oO+;;1^X5IBb;8f7`xrr`^`4Eja%o*j_%^ zh+Fs%?fR#WD%DtduMBXgu6?%I@wvW9;s~jrXFvOUW$WLAcgi#s#ce9TnwXGyE^!pN zF0gii3m_76*+k^cxmQd#1Y&M0RrTv<1g)$BP%=mZLWG#Z`*xi$nET|KvjBlm+Iu00 zLjfuX$R%7qMxyEcLrLGB^>RH=Y)KB>D%uQx>)60_TY6ufn0T%v3L%h^TblhFlK;H3 z8*Kr=-sneDQ5)akdzG2vb@zuKw`Hq^`K)5kE@R+v&~qRw&nr(KL4xM{t203qhHC#v z7VsTsZJ`D_aQ*HEVT_RMum+|PQUX^!60w6g4Cn6rjlCXWK;&(HvWZaw!9HFbuE$XX z^zDWlMnd1~|D}~XBL`f!OlZ1J9Nx6mCQ(4|;sE=Owb{Dt>li-^iDUI-x>cvSy#N}K z4FR{7DJ;;_9jckUJR7~R%^jIybZBVaIkN$<>)bX%6riL*vJZUEuUCP-JkMNj|K?W# zWZb6JbevApEOupC716Yb1N1xxaKqTKEZ{GC`SHsPyT0q`7z$$WtCz2688Lvh`Vq%sqAD$@>{>egy^oTs5^C<*); zcON5e-gZ%H*NPzUyhgd~S=x{5ZlYGPth$i0Q7+%LsLE)S$f8o`p-E)wp=;&s=ZdhI z1jZ`*caIKst5(bOOcedySyiTLI4a`_)}?{x_8V(+Gxez{Kp4i$9}gK5BW^@mCPe%h z*qWvD9De9>H^eT@Q4Us+2CuH@Kc1SG^~WoEs!;GOt2Q!nSH}@<@M{hedkF3)-${24 z-q(;?@Po{@LrU*LZM>2&ip4OF6(P1dZ*X&~^U!`UiU?0?}-Wt2}N#zT_^o&TS-a)h^`1QoApLiqFu4UVklanJKd=S)X|2CywazS^* za^3Iw!OK0Dp6J1r)Kk<AKvtybg?7Y@aEGaMvMty=`m|Gvhd39LEVK zV>%sad;2nL*YbMBWz^=OkMLmU2Pg4>?|A`e2`_25g>>Wg-bPD4#=Jd8G#4H{O!#5} zsevGwQK1$^PE1!`$?Elu#u3&25)XZ!UyqS4@i)CJO~A@o_5?9BT-S;d6(PDo6^#7> z{dE$0C1xIH$nP?A_U6o4N;my{H1N1lJ@AP_-Ch->;%8 zLM%+BWoXEX%U5$`N~Lv+F$IN-PfAx|+X@6UJ+I-q>&`8yg0jn{oz!9767tGv)&Sd9 zpn>Q6p6{>8(xn1yT%7Wu)$_$=C=!TTE%y3lD4_U0p0_3^<@_^b5Od%A#Gnc~e;-u< z?0W&MF>w(^m7HO;y7AcJHf=i(12iI%UvAs6?*#xp573cFv|2&o(=BQ8+eb6)0bn&r z4Jp`re*_U%J1K=o*IS2`m0+f1YqA75A8oeDtp6I+hXGaa;4(J=1?nGi)I(R;xCB6) zPh)mcTK~txb0lqA~yKs^EUpD76Yphf@}(iH{R_4_+>SYu9)WoA&ebB0r?O6 z+YR%nmk8eCx7W&cW&r;;q6bSxBwN5L?UZ?Va!dJ z(i+$z2;y1%?0V#Rb7nCyD7v0cxxkG(ROOTz0eJX64cal>c5`T+4G^em#t51*$_{}Q z^1p6}2LC<7YKJfWX%oNR`rwNf8vKHvO%ST88>sJB%U^Xl;__b50lYnZI$p@L7FH(T zuwMVfid?tR)P6oyzWA^rx{7a10lZh{3#0tu#v1-iOa4Wdc=b2C|EEk-N0?*{8=VQvzl}S~-+8Jq=XRx+VZymYgm*NU6?_QGLDm5eS7j z&h%VbqJkRoAzm!0xQ}6bn4M(W_7&IJ%<3Ap0}!#l*EbXA8a3*;xxSN zGyPvYbqt{4`(MuB#1O}O4xKW^{yC3q&+NH()~6Q=Pkuxa(#__oPNYD+ch;Ki=a5tY z?zz^c-nQnJgY9U4vk&uavMSfU+kSJ+;&z#t!+-b+->w5_aLsDsg8jFZ&Gm*Gq%wYHnrKI*0>y1LeL}*d6aVAXf@TZoyjY&(r^+) zkt)D|M?M8BPw7gN(9QObQ>GC%ToX>+JUny4G!`Um&vPRj z*T|Y~C}m)pt?ZF&$o>l`Q1KWKQS}Fpr_7uYyKXhab&W#GJ#nHTbI|{((+kf^ZabVg z`Kx0X`^)504L1gmuww-mBq^qT8=qH{f|Oaq_<5a$X?KxMQBf4j>g&an%+F#fa2528 z-*z}d;76VZ_=&`8HM){+(`oqQ<0AeHTu}lzIKNf<0j#lB4s97U3Tb!BGNceQBO}1} zrHx`=Nfq$=DIspvtpnV4IFrlNKdz=sAq*jaUCZm-v7j~ma22>?IHTW|6+|Eg1zPn`upLFG&gv$ZL3&jXqo7EbQ@+NO zLyMbpA|FZ(phI%NurjJdaPm1u#iJ<5(5i^QbOBcXyJBKMcFEnnyS#V5-}}9H$>N|j z76Ll~0KfvS6@JF{>Bc$5oUQW)`7Z%51>*Hm5j*mulONr9cH)hLQc4KH7$bxrgdE3F z00;mW00aO8fMZb;t|$eB0E_`b07Ah1pA!X?0D=KV06_pb_R@r~iSRrj6k~!Ah7fTa zk1<7vK!}-*5QUI1147DHMwO?85==0{2qMTqj_?Fij0l1la)`q`MifB;Im{s*LCQQh z$U|;4p3-;FAR%J`5yo#ZnLck|85bim!=ES~&l5^9AuJFg#5^#ih!BV|vk|52eP%#P z*~;+~*z<&^m=Z)V#E9|5JVlg1f>|Djr;rksALJ>^+Za6_j43k~j|un|k`?z2Dx<=H zN8u+Z2gWPMj$>0X7MaI{B1|B{97KSl?`RDe(J^uZMCdya5EC9@3K6RT1{@lnuCYfj zPY}hBu*yMzSf1m%0fO=MVI%>?fFQu!c|a(@1R%`Xmhb>mMgcIO(b3>+GKu|#ASm>e z&aySDq8oxIgIoQ5davH_X{Vxs1N4Dg%1fkKdD5-Ei_C6DA=_fF?&8&Hrvq1|2d15I zll9=R%^ruurDa293)_C5t1C8atBmuxV+aj@q*iGZbDAPEy;sY7uLVAhu3j@#8yUNN z{+6Tv&WV1$v0~%*KeklrH;uUGww}Gh@6YL}ES1KDi7$nnyz_aAi}sI@{`{RY@**w- zSUpWDoE2~=wC0@Of|>0B>z6yl+2k7(5d*flD!_~PV9rotVl927gr|vF2sZ(jYK6QVkv6m&Rt-UC0%V{i7HHs1iiHGYC zCEOeS$oh+f_6QK2ZF3m{Zy<=d|F)!j+Z05Cq?&C|;+Nu``sj7=thTU#= z_#QcUK@%qIQC4?PD;a2Q*8OvM+fZJz{>F^7xvlBcUl&v9=T)j1JfS!wOXGZztWE=mgNcTN;jm_zaty8)*R?66h ztgmg%TfI_+z7xc*pd|4bTX+Dt9)B`#cMeqIZk!{PK$Td zSo-Q8eA{|hF6onBH3`q?S-~wAuWOg)Hz-${TJK&~8zF4^pd@dbAoM4}cUce0e2KYB x+_7x4%YHeE3-h) diff --git a/games/minimal/mods/default/textures/default_mese.png b/games/minimal/mods/default/textures/default_mese.png deleted file mode 100644 index 123f0f4b916efa30f7adfc89f43440ac28a9b86d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0F&GpP}P+K>(0t=IP=X z!Xcad=llVS_nOK5hL4#lkNJvAem88ou;0&Z!HP{T&aY3XS##*e?$(c+Ig+bc Z88%o5C7RxeFbA5z;OXk;vd$@?2>_2-DPaHr diff --git a/games/minimal/mods/default/textures/default_mineral_coal.png b/games/minimal/mods/default/textures/default_mineral_coal.png deleted file mode 100644 index 0f52062af1a21000deab8c6f02cde775efd724bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0UEvMMY0f@1bvj3y{ND z666=m;PC858jxe`>Eal|5uKdC(9B?<$#kU0myu@;A5X!77Y7bV%`$CmOceETx#Gy+ ju_?__)KS#fsfU5#wj*oSa_tNKKI)Txdc4dD5q^!);tjzSR?6j=>{OtU! z>;fRl&B;#B1%bTW-2A+}w7mR+yyD{g;)4A0DxhRRVSYhTL19T=VO4oier|C|L2-FW zNojsbd3i~7RcTFic}YQed2xANRe60wMP*GzOoG<$8WL-&qZe;7KJxe!v(WY(VSZdOM(-UV6GXhDb>2 z9%OcA4v=8IpnqFe_x8T6IoUVMPH)S-e{cWW*5VXV`(MJ3quI2X7(4DeJ~ivSW8d$-UJhwca*t8{-}~fw7`woPTQx~ulPnmzG+gKA z=e9ZLtj~#?W7mFbhqH3*o4YB0X4Ow|>uP!LYpeCPV*j3d0c{?c)&Ds*nWpK=-wQwM zE2BI2r0CXnvt~y-Rr5~%e7bkabf!sOnoKV@Wk}vLO}FQnVe8wrTS>*cli%~t>)%`x zzp|cwqfs~U$c!Tq<~Cca)|!O*r=8sxVgExy1Kf^$jIQ(BCG%a0OUzT zK~#9!1;L3Tf>98F(FxZwcCx0gFj+%VRJKZyQWSqtD#ZK0f^)x;R6+Slq=W5 zjKktEs0tKIAA~4ve^yl)h-w}*&UN|8CSBxO@=l#EaktaVzzFAm0H64(1DfB?tcM+XzO+UgH;z z>k5pq5MEs0#8ACi;Thu+l@*S+M07WBZqjNI6K(2SlfhWd@s@@6;91dS3@_4TZ#<}U iv^i(q@!?PHf5y{VEFYHcy`liLg2B_(&t;ucLK6T4Jwjao diff --git a/games/minimal/mods/default/textures/default_nc_front.png b/games/minimal/mods/default/textures/default_nc_front.png deleted file mode 100644 index c9dd6a330ed87cfb410787d9038410c2f1576c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)eD;F1+5no(lVq#KKQc+P+ zLqo%XhQhRz>~c$0z6YH;*7ce-_ratU0m>^y61`@b-pM#*%d#WU@qGUWA-Ct5>ZuVeVv2^x zMWp!x>~A|X>xczPUU|_J>#|_3p46r7_3!te3ujK5#;SY*XcvR0tDnm{r-UW||3Xcd diff --git a/games/minimal/mods/default/textures/default_nc_rb.png b/games/minimal/mods/default/textures/default_nc_rb.png deleted file mode 100644 index 685a22ccf53ab659eafcab0dd95e7b031cbdb0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWHR6k#Aej4~f#JUc!~X_` z|N9yK|7U0b@fjEn)B{-#4j|z`fj9oKbJqfONqM?BhHykDCp0j*2`F+TaX3lplq6{w bD=;$jy=D@~d2jgysEWbU)z4*}Q$iB}HhUEaktajUieA{T=K2lMqe|My#(Ozd=Y*WW!$LQJH8H=}r1%Z{0aI;^@H ufdQq&Ne7LR^7#Xn64D>*tRhJJJl~ zFqQ=Q1v5B2yO9Ru7^^7fO;7`UHx3vIVCg!0O4^i!TW0$;vtpk zC7tOdljSXw%*4@7bW{;~xDa)m$?C|499R}?5$93)>7ELRdN zUm7f579w9BDqj&QUl|5O3RU3>)!_>D(TWYxN)0hejnPVN$=aQ%I^F5I6SDLtX6sMR zHJA!Sc?Q$+fyi)1q0!7Dqgg;yY&5&rcutAYoD$=?CC2khfyiWGnaQGZ)5VphODas4 zRGKZVGFx74zM|HAWsUjjI*av;pM0cX^Ve6_fC2v5J!efiQRF z^Y<60_D3;#bQKzlWJbDmefs}(M(6j(tE#PUGoNBh=yWrUU429-?$l$yee6jhj*ms+ R_5$6+;OXk;vd$@?2>?J@qEG+; diff --git a/games/minimal/mods/default/textures/default_rail_crossing.png b/games/minimal/mods/default/textures/default_rail_crossing.png deleted file mode 100644 index a988c4740786bc78673b5e98ffa36125dd158ada..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfiU6MwS0Ei49-QGRmg6m+>n%~> zD^chtS?DiW?3Bvlb2T^%Z29VSx~CS4OQ zQwKy5GTmvq-5I()>ADlL^(SWQPsufymS;G7ojg#TBMYDuKvsX_eWsD$`|EX3J~LR@RxXsxx0xZ?S9dwrLaZy#u&)hlbA5-i0O**!f zYz-XjtPvN_He9;P<#|P%JAp5li+#cT8BOgwJmQ!C*y*#9yTK!;B66?98|{$WYkAxp za(^2~+c8}{C2DSX_vrPHHC9W_7}}B~)aJ$+WC!gF{$m}1D Z`5(?Tcjz9na diff --git a/games/minimal/mods/default/textures/default_rail_curved.png b/games/minimal/mods/default/textures/default_rail_curved.png deleted file mode 100644 index f87e826c9d652e7daacd1431ad99c7c9a1236f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf(g2?jS0Ei49-QGNlkFpu;|oNx zxxO-aezN)gvIPM^Bv%+HTNEHy6ew35BwrFNUm7e|79w8}3PcLkkt(&3ighunbuntq zvC7Ty>MaTCEs5IgNgACgn!V|oy_tFwvh^os>rcu7B7>><1~UqcW)&IDE;gQ1Vm!CR zcz&tL{4(Q(<)(|uO%_#{E&-xSv*k7BD{9PF*O{-Wvslw$v1{)(#~WRWK!-Ax1o;Is zI6S+N2IMq&x;TbNNU|PeS7K&lU^x(}8`!6Du~i|f$M5_#gLjeuw02v*XWfFKj6PcIKRnNkPG$gdNYGEMnZfx%@Tv zx7qujYV(9|=bV+e>)YQ?M-!t=ZbV4_wOMxC+vGrn$NWFcS1P$PGlM?K0BvIMboFyt I=akR{09iJN!vFvP diff --git a/games/minimal/mods/default/textures/default_rail_t_junction.png b/games/minimal/mods/default/textures/default_rail_t_junction.png deleted file mode 100644 index fd25b5ba6a6b8f05f50feff56c064472867ef3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf`~aU2S0Ei49-Qteo#7>u=`EAv zBa`DRlj|#!=O>#FMEv6ewF1C|4XLUlJ@|8Z1{9B3}^-L<*H*3e}M+wULT- zF{*VjYW2}d&GG6j3F^J+n*CXN6SMUvc@FMzf2J=ad-F zEis-~Vm!apWPX|P!gA9k6{gE;%vaQyudXv+Q)jWJ!D83mZSGeKcLSZsSQ6wH%;50s zMjDXQ>gnPbQgJKv{B=GiLmroll2yEWH|y*@9Q5q}eqQg+Ef4qo^q7{zpyVX7#>Xbc z{PtJ9yTRJclU_V~npk^9DPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n~ z2NxX`Z75g(00K-&L_t(I%RQ6Za@9=rjVK^H*SR1X_|PlgSBOBsF%6JLyew>8fJ3~?D^@a?ZN-xDe&AJi{G0-JdBtjh*ngBw2$J;WXzc1Q>~zR}4uZ#&_+Ip3<24OVm9H#`y} z-YT!Bb@M{kF$@FVCzd?pw(?R9N1$Xbs{AqykoFw^QR2_%# zVVsCD@;(JbMwZoizRcL^JCT0a43sadX{1=>nA^rz75ag9DI(%L6=N+61{}u3OB+!D y_e~asjbp2b2%-Uirv}f}IYjyKbg$ zy_wIxm(RbN(7u|`znIX!nb5zQ(7&6|z?jg$o6y0T(Z8F~z?jj%nbE+T(ZQS1!JN^; zn9;(T(!rb3!kyB?o72Ia)54q6!k*K^ozugf)5D+C!<^K^p47vi)Wo0E#hcZ`pVh>l z*2JLJ#h=#3pw`Br*TtdN#-P{6qSwcs*TU z$fMcGq}j@%+Q_8Z$)MWFquR=)+sUQd%A?!Lq}$4++smii%BS4Rquk4;+{~xl%ctGU zr`^q{-pr`p&Zyqbsou`2-_EJu(5T_htK!hCbLlUOw!4Dqi$4-|{a zUr}z9o1PvGml1{`zL&jJ2(}_88N?7C0;-W4*H1(Kj%m4rY07*qoM6N<$g6YA$rvLx| diff --git a/games/minimal/mods/default/textures/default_sandstone.png b/games/minimal/mods/default/textures/default_sandstone.png deleted file mode 100644 index bd9cb8692f449d37711a3a31e313230d147327ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmVP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW1sfMI6;LOBPXGV{dPzhPwZeDuoD8b5T`&xsw!{L-+jhDO(W$AN~=Z+ISdBkI~+dO-cB>xe>*eZ zHR#Xn58wAs&(2Ow^X~4h+wYZSi5P@1rnGh(r_pHWx~{3}-}`%6Rxqh+hGB|4|9N{m znNAr>d0xO6`M!rSYno=BWiTKJf?*h0nsAt54#y)rn4xv;dY+;vmSu%eL@CX(?EL(E z4LGtaiDDGLvERRa0sP@;B#7c_xndZ~aa@ul6(Rk8pT*eoeZxHc{cEmjnq^&Jj^{B# zJjcO$%1}{iKsU>>7nYSA6NC_GTPz-|PnQW0IUKR3>tPV=cDuT+L76D<^?Su}EJ-59 zIEtcnyY0FzARxrx{eJ)T=4QLulBxo_JkJBd;cy6o0Ayg6?HI=F>gq&MHtY3azvp_TrJa0%6bQD#=plUL? z%!`8Wnxra%(3@Rd=XnlZ)s*6*D8UDj7k~z->f!Li#b{(Nmk1+OZ3ccYolZ8J4TwBZ zn@|`=6}e&CwkS%Va_y}B!0Ww>vF&AE>l_U2E30cM{V8$Tg z!yu)|F5}A}YsMk##VqH_F6Y4_7sw#5#j9c_sG%sRVIiOu$fd0!qFutEqb#SB%BZU; zp|2ulU?*vk$pbXXteC-EOTt=7#9m7RXsk<>kb9*__yUHwrTp2U26>L!`QduSVcL#= zZ$$y^W+@5s1G$A^^W?NyK&sl)#WAGfR&QT4-ys7Y7Q^*U-U}HoO)BJWdHy%wLrKI@ z#qLA@(~B8<7snefT=9eL&`l}kCASx^FzaS%;y-tGxhLnpsD*8>cx`qqv5`HXB-pU~ zox{f|k2%&b?${A}YQm2O$*m`rpW3$nd*sdJ>TKf;@8x3I%nlcGyk6fUKFgd-WjSY- P9LPDIu6{1-oD!Mf`*F3 zA%QI=Q@NY7!@>j(Z^>NQ$YXre$ys98vSogW4@#!a;$)D&!E^8Mv)g_k%RF8ET-G@y GGywqA!7o_g5!*P|voDN1c9k!Cc2 z5;Aj}bddAwI7^76d^(EJ79KM;?$QnlJ_8S%Htx5~TuOfc(o_>iQU@P55}$7h>5+17 zQl`@XnDhKxRd%r(Hfe!%ubzXTKzhPJe6WJpKqZ?#BWlz{W~7GbKrQpmCe)Ob?1Z2N zcINb4#LYh~ve#H@ECh|;D@sf9kzpo#JGDSQpl5&CKq1gdVyKbKOb@v!3rEowRN2PW zMjxl^P6{DA$+31V5FTz|by^_d>mokh%khH1NyNZI*2?qQ5HCePMcK|?(876K)B>KK zDwGumi|!5rE`gA{o_SXdF?SvEXaj5RY9gWzXL~LE7CmMEDdh{na=T=L_w*$I0000< KMNUMnLSTa9JG?Id diff --git a/games/minimal/mods/default/textures/default_steel_block.png b/games/minimal/mods/default/textures/default_steel_block.png deleted file mode 100644 index 9c0a0e2484f58f5bc7f64076add1e0b89fe3e57f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9>wyCYu3Witbg$MNpopob zi(?2!bn=h?^A|c!Sm-`+;o*r389SsTr6eV#EF`5=B%{=fN_K-@$ a|7VE2&o|w^!2K@J00vK2KbLh*2~7aM87Slc diff --git a/games/minimal/mods/default/textures/default_steel_ingot.png b/games/minimal/mods/default/textures/default_steel_ingot.png deleted file mode 100644 index ad133bc124e1c46e7e4aa398ad4bf5cdc475c869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRt!3-oH7vA{>q<8{+LR^7#T3T8|L&Jds2hx4| zrU3bjB|(0{3=Yq3qyafbo-U3d6}Q%&aO7i9;5gzS{_lVKW45dvQq{B9txxsa<*hYo onQDKB+GCx>{)WA?bbef5%U{NDMBM4b7octiPgg&ebxsLQ0CjIK*#H0l diff --git a/games/minimal/mods/default/textures/default_stick.png b/games/minimal/mods/default/textures/default_stick.png deleted file mode 100644 index 055a6ac0439fbb9a7fe1c83a07918e3891665da9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMj(LE0A_l;*7ObF)d9v3gj@B z1o;IsI6S+N2IRPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW1O*BeH5%f#UjP6A0%A)?L;(MX zkIcUS009X}L_t&-83n;xPl8|=0O0q(b=7KXYgRLcS j%pb3v+E%QlAr6Xvs}g@EPqJ$500000NkvXXu0mjfmq%)!Xi#-q?6kl@fL!N7P|$g$3GuLw|{!PC{xWt~$(69BaA732T_ diff --git a/games/minimal/mods/default/textures/default_tnt_side.png b/games/minimal/mods/default/textures/default_tnt_side.png deleted file mode 100644 index c259726d688808e83e0c50a192b2dca46d190070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=4v83=IqnYcw?e|Nk$P z@8b>>()Dz44B?oWY!KAqz?LMT7jWRgp#z5=Jz!W8BNHPb6BBWOM~qE^S&1pwr%RL} XtxxQ1i$mXTphgByS3j3^P6A(=f(-@&EC&T0R{c;=ve!An{FgTe~DWM4f#X&A+ diff --git a/games/minimal/mods/default/textures/default_tool_steelaxe.png b/games/minimal/mods/default/textures/default_tool_steelaxe.png deleted file mode 100644 index fae19dd0dc51ec75da2d91dc8400aa543e608c6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!P=HT}E0A_l;*7ObnKNh3fddDg zJ$q)LXaE#sU@Qsp3ubV5b|VeQ(eQL}45_%a_kFVdQ I&MBb@03wh$mjD0& diff --git a/games/minimal/mods/default/textures/default_tool_steelshovel.png b/games/minimal/mods/default/textures/default_tool_steelshovel.png deleted file mode 100644 index d5b1bc6bc354e3b5f6a22fe4c5f73648b5372149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!P=HT}E0A_l;*7Ob>F(}6aNxkZ zckiA|yXFBDWh@Eu3ubV5b|VeQ(eZR~45_$v^!P?b1_d4_1Dy~5PnYFL#+((inQ&+N n(me(%D)&4oz2Ycm-~Wd-ax+7N;FnL`Kz$6Ju6{1-oD!Mq#hB diff --git a/games/minimal/mods/default/textures/default_tool_stoneshovel.png b/games/minimal/mods/default/textures/default_tool_stoneshovel.png deleted file mode 100644 index 7bbd2d4070260fe3fa426774e5880f831860aed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!P=HT}E0A_l;*7ObiH(gdDJkjh z?iO3oG#e<&SQ6wH%;50sMjDW# zOf2xzsH>~%>+4&uaqTlunz1CvFPOpM*^M+H$J*1yF{I+w)c%893bP0l+XkK+wU@D diff --git a/games/minimal/mods/default/textures/default_tool_woodaxe.png b/games/minimal/mods/default/textures/default_tool_woodaxe.png deleted file mode 100644 index 6e70f4a2156742b4a74f3e92b32f89b93587a226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJPk>K|E0A_l;*7ObDe%)!;ykz$ z$Y(4G@(X5gcy=QVq}J2LF{I+w-cyP~3=AAhj#K{sk6abt6Bo^PXYuaLuYW beDNlO#%cza#FLE8Ks^keu6{1-oD!MK|E0A_l;*7ObDe%)!;ykz$ z$Y(4G@(X5gcy=QV$kFt4aSW-rb@YTH6N3TA;R7Q7{->MW_wgB!2(^ diff --git a/games/minimal/mods/default/textures/default_tool_woodsword.png b/games/minimal/mods/default/textures/default_tool_woodsword.png deleted file mode 100644 index 8099af1391695db1cb70f6df1f2a77bad3d150ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0ER{VRcgCjI~uM@Y7H& z=s5-yVk`;r3ubV5b|VeQG4gbA45_#^_p~7&g8~ne!-7Bm&z5cBkxEst6e{3ZyXDd! oQ_H)%{w7++BrjZ*E$w2H%ILL#p~Za8Taf7tp00i_>zopr05XRtZvX%Q diff --git a/games/minimal/mods/default/textures/default_torch.png b/games/minimal/mods/default/textures/default_torch.png deleted file mode 100644 index 21d98bdbb059a806a574318ac46c7af6d4d65343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=5}>47n-{lRO!2Gcf%B zud-P+Q3fc=SQ6wH%;50sMjDW#=jq}Y!V#UEaDb7?AYx$vo3^%(+7;1L9EA-=Ggubz oq%qG>N|ZP(aV+6Tf&v2r(+g&9j*qwh0Ch5Wy85}Sb4q9e0FebIf&c&j diff --git a/games/minimal/mods/default/textures/default_torch_on_ceiling.png b/games/minimal/mods/default/textures/default_torch_on_ceiling.png deleted file mode 100644 index dccd380b23a210f96fe4f84c9777bee87cef6476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=5}>47n-{lRO!2Gcf%B zud-P+Q3fc=SQ6wH%;50sMjDW#>gnPb!V#UEz`(>T(0GQ!q}6B!FOx!#Lih>}Z;dGj dxu!1E1FG7?v_4E}-&&vs22WQ%mvv4FO#l#uA{qby diff --git a/games/minimal/mods/default/textures/default_torch_on_floor.png b/games/minimal/mods/default/textures/default_torch_on_floor.png deleted file mode 100644 index c22010750b1e47653b60ca028faa0eade0d88046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=5}>47n-{lRO!2Gcf%B zud-P+Q3fc=SQ6wH%;50sMjDW#=IP=X!V#UEpdiZPkQv4^@j}3iDcVy67crz7NFR`3 fdcotymcqs`y_G5RoJ#5rpbiF4S3j3^P6y!k`ihBm_+Q>vZZ|i3Pg-#K)3th=J@Gu_ug~fopYb(Jm>5^8WFbH z+RD+2F=h>0f+E#zW89Xe>MSTs^kvM9MTABLD_2f$IekgxN#hbiaL$Pc5dlEcG{G2W zj2J`4fH6&F&HE$-BY9t8-0tbyWln6paXdpqG&KF`18gM=n z5Q!dPDt#WpDlSH3g+E_BDY+2Dxk>~?6+uEE=Rl-v6hghP3=l${nw-a8aw$k~KHdzuE zNF0zfK&FW~S~Ep-hTIIfn3Dm-C6WMCJs_sx>~f7WLXx8(;Hq=LP}Mnm8i392k0Qwg zF^)`yOU4Bw&XCmDa>+<23QPe_uZ|U_=8T!fLQp`Idxynkks^E@SnP;lN9~>HjHJif zuKK1oziZOaw|KNFyr#z~!@oAM@XNHb(O-OK=HWDP=)q9_VatyiFIwpTePzKpL)%X+ zgWo6hpO4e+%nn^YIX>J`VKDo3cc_fY}u7$s!#RY-fWw>)}zvX%6-Ujyz2Buhp+%I$BTak_Bv&(xoo(Q z`e5WctA>^rLTliO@wU5}**&+S?alLx{0v1^!#%6cyZz-|yjAbt8yy}yHu(09xVuwL z%lF7XJ~{QAr)}Rv;+cVxu9Actoh@D;^i}_ew=%|lwBDcE*83sqyaHC*)0Q&b%ioMe z)S2$yq^t3D$sF_Odh^@Kzccaa43mZ~ha~Uz@{q&>r(*6;oqckne@py@*ubE?c#%*V zvaRtQzd+lQOTrGI_dsfj>9wfU@t(Ydr0q@Iw72u)1qt@xy1d|U`Y(I#cjxv+YMVFQ81cF7+LWt{@rPZe6+5eATGyrQ zD|h|+*!rvunQl5t4fYM_c6hPxUDTC*&N00!*8I~Lk@6L+?fKj) z{lx9KYIBo)Z?qgw%=^^g%xKi<)arq>)@Svl!&|fMGM?GK$T)Nm92QiyDK_UniaxM? diff --git a/games/minimal/mods/default/textures/default_tree_top.png b/games/minimal/mods/default/textures/default_tree_top.png deleted file mode 100644 index 3e6bd5262a4350898fc3b92045e48804b62349fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!T!2rAtDYjifufY5nwXcZM1ZkG zpuSY7jbgN`YL>53fuGtd*7{{Ym42Qsjv*DdV*8_o4k&OiuXT-nSO3sWk@xYxl$b}W zW7!4bA`UI*jAwETvN$eOe^`S@L9T1g>WQbL)4$ws5_EVe`!(vw>U00Rjg6c_6!`4! XsS0YT0k?X4T;=< zgAfiaO9^NQk$Q=u;U|GPOjyXvV`joK#S(!qp11qq=6H0sd+#}S=iJ}#{Lc9(%(!ux zjiU_!EMu<)hpT(JdFw3InO_j^2e1gjLL>Fcl`~t;TvB<`yog8$fry-Q#+asQ1Rwwq zfCDf9O=T^3A_5@*5jY3NK>NQS0umq)kOODHH1*Shw1x0e2tpK`BV%0CBqDJx7(-=q zPK*gnR&g;SEBuAxNhyd>2$jeM@ zI10v5V;nS^r!^>|v*ZRYXkG?GAvqG`ss{)fpIfeZMo&cyE2=e}yZ)>QMxs+u*uhSkSI!@fz+bK7oj z%-YiLeRz|rbwXmE=j2HD63Zmro%+OHw~AX&t^UwyiD&1D9y^cx_0wNB>PgdZOzgyP!H+a=F>Ok(dIuP%ifpObbIC!15Sz+1; znGw$=l${+se_>I|^z>gY?#1uLykz?#{Mz;LsPXFzzheQ;cxvgLh}^`N%llZ-p()db zkqGbR&36MAe_rVKc3(lSuWxb8&_69H|L$|JJASpetZLvsJ^Bgg~F}OPD%@6(q D@ROia diff --git a/games/minimal/mods/default/textures/treeprop.png b/games/minimal/mods/default/textures/treeprop.png deleted file mode 100644 index eb8a8e6c4f72f621425efa2fffd133d433c5daca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmV^6ifgWKmZpW2p1&)86XH6AqN^#02>tr8$tjZPzW1S z030R@97+frO#mG>2pvcO9ZCZoO9CD|1s+8Q9!LZpOa~rO03KHWA1VzWMGYTN1tAs& zAxZ!tQUf7U2qZQUB}@q=RRJYg0wy3AC?OFjI1niz94Sx_DPRLCQ3@(y2rC>BD<+w04y63EFvB(BOWX{7A$1}Eh!i-X#g)I7BDIsFg_VDVG1y03NdH_GAZfbM@0004WQchC_6okj#+uBgEqo~+W zu~!sP#^s+F2+V_JJYFMlobq z8XN0QXGx9Sub_dHjbi)}N+UVb!kBvp>PE-Tq51>O1uV=@U|BbImd@il$w@?Gz#{AS z*W0=pTc&uG_BwR=1`e10|9XDH0T6hM~y8Cnhhr)Pb68{P&KT+00000NkvXXu0mjfNMz^| diff --git a/games/minimal/mods/dignodes/init.lua b/games/minimal/mods/dignodes/init.lua new file mode 100644 index 000000000..833150873 --- /dev/null +++ b/games/minimal/mods/dignodes/init.lua @@ -0,0 +1,37 @@ +local groups = { + "cracky", "dig_immediate" +} + +-- Register dig nodes with 1 digging group, a rating between 1-3 and a level between 0-2 +for g=1, #groups do + local gr = groups[g] + for r=1, 3 do + for l=0, 2 do + if not (gr=="dig_immediate" and (l>0 or r==1)) then + local d + if l > 0 then + d = string.format("Dig Test Node: %s=%d, level=%d", gr, r, l) + else + d = string.format("Dig Test Node: %s=%d", gr, r) + end + local tile = "dignodes_"..gr..".png^dignodes_rating"..r..".png" + if l==1 then + tile = tile .. "^[colorize:#FFFF00:127" + elseif l==2 then + tile = tile .. "^[colorize:#FF0000:127" + end + minetest.register_node("dignodes:"..gr.."_"..r.."_"..l, { + description = d, + tiles = { tile }, + groups = { [gr] = r, level = l }, + }) + end + end + end +end + +-- Node without any digging groups +minetest.register_node("dignodes:none", { + description = "Dig Test Node: groupless", + tiles = {"dignodes_none.png"}, +}) diff --git a/games/minimal/mods/dignodes/mod.conf b/games/minimal/mods/dignodes/mod.conf new file mode 100644 index 000000000..52a80d66e --- /dev/null +++ b/games/minimal/mods/dignodes/mod.conf @@ -0,0 +1,2 @@ +name = dignodes +description = Nodes with different digging groups diff --git a/games/minimal/mods/dignodes/textures/dignodes_choppy.png b/games/minimal/mods/dignodes/textures/dignodes_choppy.png new file mode 100644 index 0000000000000000000000000000000000000000..a73fc2424140e0f429b274ac72f7f20dfa0e2679 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYU0GAJvbOfp)~y$}Z0YFe z$j{HexOHnnLPD&qijxxOikg}*;naAb;!sZ)$B+uf{?+H-_Ooy2~ z^2AooymRMcczj*LcQX&olv<{isJt-dt?5!e&krrHOnmX$!?^6Y!qo}Sns|?KCpB+$ p%$dM@yoBY??1e0;22OJs8MJSTiT2c9ybH96!PC{xWt~$(695yGNCp4^ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/dignodes/textures/dignodes_crumbly.png b/games/minimal/mods/dignodes/textures/dignodes_crumbly.png new file mode 100644 index 0000000000000000000000000000000000000000..23f2f7c71997d29bdc50006a6161e2ad72770b24 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|#hxyXAr*|hliV2_3$9y!AC4Vz5>8yM*x-;Mz`@J3*zti0#~ilC3koJmEo_YU%xdp3=hr;d UT_6>-4ro1tr>mdKI;Vst0NN`!F8}}l literal 0 HcmV?d00001 diff --git a/games/minimal/mods/dignodes/textures/dignodes_dig_immediate.png b/games/minimal/mods/dignodes/textures/dignodes_dig_immediate.png new file mode 100644 index 0000000000000000000000000000000000000000..a532ad90b20e7b7eb69c87721229852c5d5c3c4b GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|g`O^sAr*{kCpmH*P~c&yUHD_c zSNpe-#ou_py7u1CwQUh{lz5R?KC7cmSmMbWCXQb(mCUyK=`Bj-n(yYl^5}{$L2`~q zggO)_m^vlQBopV($|DsyIK;3sOgOJ^=RaVP&+-FI)sV}UvbN}TM$WeFg{r3|) z53rT`IKH%Y>|3PVqsw&DRQ|Gb;`)y69m$Bq+#}VJFug`b_-NxYQ>gTe~DWM4foq|u| literal 0 HcmV?d00001 diff --git a/games/minimal/mods/dignodes/textures/dignodes_rating1.png b/games/minimal/mods/dignodes/textures/dignodes_rating1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2fee3a23269731a2c9e56a86e04df3c1b386e23 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`s-7;6Ar*|t61x&adYb+N!9thM q^&1$cFjz@9TwuA*b2x-EfMNDurIQCQ3tR$fVDNPHb6Mw<&;$T}$sKe6 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/dignodes/textures/dignodes_rating2.png b/games/minimal/mods/dignodes/textures/dignodes_rating2.png new file mode 100644 index 0000000000000000000000000000000000000000..15329b93fa9b94075774044d3ec7af828362d072 GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%APKcAr*|t60;ISdYb+NL1SVU n@1h&5CEF$4{ 30900 or pos.x - start_pos.x > 46 then + pos.x = start_pos.x + pos.z = pos.z + 2 + end + if pos.z > 30900 then + -- We ran out of space! Aborting + aborted = true + return false + end + return pos +end + +local function place_nodes(param) + local nodes = param.nodes + local name = param.name + local pos = param.pos + local start_pos = param.start_pos + table.sort(nodes) + minetest.chat_send_player(name, "Placing nodes …") + local nodes_placed = 0 + for n=1, #nodes do + local itemstring = nodes[n] + local def = minetest.registered_nodes[itemstring] + local p2_max = 0 + if param.param ~= "no_param2" then + -- Also test the param2 values of the nodes + -- ... but we only use permissible param2 values + if def.paramtype2 == "wallmounted" then + p2_max = 5 + elseif def.paramtype2 == "facedir" then + p2_max = 23 + elseif def.paramtype2 == "glasslikeliquidlevel" then + p2_max = 63 + elseif def.paramtype2 == "meshoptions" and def.drawtype == "plantlike" then + p2_max = 63 + elseif def.paramtype2 == "leveled" then + p2_max = 127 + elseif def.paramtype2 == "degrotate" and def.drawtype == "plantlike" then + p2_max = 179 + elseif def.paramtype2 == "colorfacedir" or + def.paramtype2 == "colorwallmounted" or + def.paramtype2 == "color" then + p2_max = 255 + end + end + for p2 = 0, p2_max do + -- Skip undefined param2 values + if not ((def.paramtype2 == "meshoptions" and p2 % 8 > 4) or + (def.paramtype2 == "colorwallmounted" and p2 % 8 > 5) or + (def.paramtype2 == "colorfacedir" and p2 % 32 > 23)) then + + minetest.set_node(pos, { name = itemstring, param2 = p2 }) + nodes_placed = nodes_placed + 1 + pos = advance_pos(pos, start_pos) + if not pos then + aborted = true + break + end + end + end + if aborted then + break + end + end + if aborted then + minetest.chat_send_player(name, "Not all nodes could be placed, please move further away from the world boundary. Nodes placed: "..nodes_placed) + end + minetest.chat_send_player(name, "Nodes placed: "..nodes_placed..".") +end + +local function after_emerge(blockpos, action, calls_remaining, param) + if calls_remaining == 0 then + place_nodes(param) + end +end + +minetest.register_chatcommand("test_place_nodes", { + params = "[ no_param2 ]", + description = "Test: Place all non-experimental nodes and optionally their permissible param2 variants", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + local pos = vector.floor(player:get_pos()) + pos.x = math.ceil(pos.x + 3) + pos.z = math.ceil(pos.z + 3) + pos.y = math.ceil(pos.y + 1) + local start_pos = table.copy(pos) + if pos.x > 30800 then + return false, "Too close to world boundary (+X). Please move to X < 30800." + end + if pos.z > 30800 then + return false, "Too close to world boundary (+Z). Please move to Z < 30800." + end + + local aborted = false + local nodes = {} + local emerge_estimate = 0 + for itemstring, def in pairs(minetest.registered_nodes) do + if itemstring ~= "ignore" and string.sub(itemstring, 1, 13) ~= "experimental:" then + table.insert(nodes, itemstring) + if def.paramtype2 == 0 then + emerge_estimate = emerge_estimate + 1 + else + emerge_estimate = emerge_estimate + 255 + end + end + end + -- Emerge area to make sure that all nodes are being placed. + -- Note we will emerge much more than we need to (overestimation), + -- the estimation code could be improved performance-wise … + local length = 16 + math.ceil(emerge_estimate / 24) * 2 + minetest.emerge_area(start_pos, + { x = start_pos.x + 46, y = start_pos.y, z = start_pos.z + length }, + after_emerge, { nodes = nodes, name = name, pos = pos, start_pos = start_pos, param = param }) + return true, "Emerging area …" + end, +}) + diff --git a/games/minimal/mods/experimental/detached.lua b/games/minimal/mods/experimental/detached.lua new file mode 100644 index 000000000..673adfdd4 --- /dev/null +++ b/games/minimal/mods/experimental/detached.lua @@ -0,0 +1,29 @@ +-- Create a detached inventory +local inv = minetest.create_detached_inventory("test_inventory", { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + experimental.print_to_everything("allow move asked") + return count -- Allow all + end, + allow_put = function(inv, listname, index, stack, player) + experimental.print_to_everything("allow put asked") + return 1 -- Allow only 1 + end, + allow_take = function(inv, listname, index, stack, player) + experimental.print_to_everything("allow take asked") + return 4 -- Allow 4 at max + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + experimental.print_to_everything(player:get_player_name().." moved items") + end, + on_put = function(inv, listname, index, stack, player) + experimental.print_to_everything(player:get_player_name().." put items") + end, + on_take = function(inv, listname, index, stack, player) + experimental.print_to_everything(player:get_player_name().." took items") + end, +}) +inv:set_size("main", 4*6) +inv:add_item("main", "experimental:callback_node") +inv:add_item("main", "experimental:particle_spawner") + + diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua index e8aeff2b3..b292f792e 100644 --- a/games/minimal/mods/experimental/init.lua +++ b/games/minimal/mods/experimental/init.lua @@ -2,821 +2,22 @@ -- Experimental things -- -dofile(minetest.get_modpath("experimental").."/modchannels.lua") - --- For testing random stuff - experimental = {} +dofile(minetest.get_modpath("experimental").."/detached.lua") +dofile(minetest.get_modpath("experimental").."/items.lua") +dofile(minetest.get_modpath("experimental").."/commands.lua") + function experimental.print_to_everything(msg) minetest.log("action", msg) minetest.chat_send_all(msg) end ---[[ -experimental.player_visual_index = 0 -function switch_player_visual() - for _, obj in pairs(minetest.get_connected_players()) do - if experimental.player_visual_index == 0 then - obj:set_properties({visual="upright_sprite"}) - else - obj:set_properties({visual="cube"}) - end - end - experimental.player_visual_index = (experimental.player_visual_index + 1) % 2 - minetest.after(1.0, switch_player_visual) -end -minetest.after(1.0, switch_player_visual) -]] +minetest.log("info", "[experimental] modname="..dump(minetest.get_current_modname())) +minetest.log("info", "[experimental] modpath="..dump(minetest.get_modpath("experimental"))) +minetest.log("info", "[experimental] worldpath="..dump(minetest.get_worldpath())) -minetest.register_node("experimental:soundblock", { - tiles = {"unknown_node.png", "default_tnt_bottom.png", - "default_tnt_side.png", "default_tnt_side.png", - "default_tnt_side.png", "default_tnt_side.png"}, - inventory_image = minetest.inventorycube("unknown_node.png", - "default_tnt_side.png", "default_tnt_side.png"), - groups = {dig_immediate=3}, -}) -minetest.register_alias("sb", "experimental:soundblock") - -minetest.register_abm({ - nodenames = {"experimental:soundblock"}, - interval = 1, - chance = 1, - action = function(p0, node, _, _) - minetest.sound_play("default_grass_footstep", {pos=p0, gain=0.5}) - end, -}) - ---[[ -stepsound = -1 -function test_sound() - print("test_sound") - stepsound = minetest.sound_play("default_grass_footstep", {gain=1.0}) - minetest.after(2.0, test_sound) - --minetest.after(0.1, test_sound_stop) -end -function test_sound_stop() - print("test_sound_stop") - minetest.sound_stop(stepsound) - minetest.after(2.0, test_sound) -end -test_sound() ---]] - -function on_step(dtime) - -- print("experimental on_step") - --[[ - objs = minetest.get_objects_inside_radius({x=0,y=0,z=0}, 10) - for k, obj in pairs(objs) do - name = obj:get_player_name() - if name then - print(name.." at "..dump(obj:getpos())) - print(name.." dir: "..dump(obj:get_look_dir())) - print(name.." pitch: "..dump(obj:get_look_pitch())) - print(name.." yaw: "..dump(obj:get_look_yaw())) - else - print("Some object at "..dump(obj:getpos())) - end - end - --]] - --[[ - if experimental.t1 == nil then - experimental.t1 = 0 - end - experimental.t1 = experimental.t1 + dtime - if experimental.t1 >= 2 then - experimental.t1 = experimental.t1 - 2 - minetest.log("verbose", "time of day is "..minetest.get_timeofday()) - if experimental.day then - minetest.log("verbose", "forcing day->night") - experimental.day = false - minetest.set_timeofday(0.0) - else - minetest.log("verbose", "forcing night->day") - experimental.day = true - minetest.set_timeofday(0.5) - end - minetest.log("verbose", "time of day is "..minetest.get_timeofday()) - end - --]] -end -minetest.register_globalstep(on_step) - --- --- Random stuff --- - --- --- TNT (not functional) --- - -minetest.register_craft({ - output = 'experimental:tnt', - recipe = { - {'default:wood'}, - {'default:coal_lump'}, - {'default:wood'} - } -}) - -minetest.register_node("experimental:tnt", { - tiles = {"default_tnt_top.png", "default_tnt_bottom.png", - "default_tnt_side.png", "default_tnt_side.png", - "default_tnt_side.png", "default_tnt_side.png"}, - inventory_image = minetest.inventorycube("default_tnt_top.png", - "default_tnt_side.png", "default_tnt_side.png"), - drop = '', -- Get nothing - material = { - diggability = "not", - }, -}) - -minetest.register_on_punchnode(function(p, node) - if node.name == "experimental:tnt" then - minetest.remove_node(p) - minetest.add_entity(p, "experimental:tnt") - minetest.check_for_falling(p) - end +minetest.register_on_mods_loaded(function() + minetest.log("action", "[experimental] on_mods_loaded()") end) - -local TNT = { - -- Static definition - physical = true, -- Collides with things - -- weight = 5, - collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual = "cube", - textures = {"default_tnt_top.png", "default_tnt_bottom.png", - "default_tnt_side.png", "default_tnt_side.png", - "default_tnt_side.png", "default_tnt_side.png"}, - -- Initial value for our timer - timer = 0, - -- Number of punches required to defuse - health = 1, - blinktimer = 0, - blinkstatus = true, -} - --- Called when a TNT object is created -function TNT:on_activate(staticdata) - print("TNT:on_activate()") - self.object:setvelocity({x=0, y=4, z=0}) - self.object:setacceleration({x=0, y=-10, z=0}) - self.object:settexturemod("^[brighten") - self.object:set_armor_groups({immortal=1}) -end - --- Called periodically -function TNT:on_step(dtime) - --print("TNT:on_step()") - self.timer = self.timer + dtime - self.blinktimer = self.blinktimer + dtime - if self.blinktimer > 0.5 then - self.blinktimer = self.blinktimer - 0.5 - if self.blinkstatus then - self.object:settexturemod("") - else - self.object:settexturemod("^[brighten") - end - self.blinkstatus = not self.blinkstatus - end -end - --- Called when object is punched -function TNT:on_punch(hitter) - print("TNT:on_punch()") - self.health = self.health - 1 - if self.health <= 0 then - self.object:remove() - hitter:get_inventory():add_item("main", "experimental:tnt") - --hitter:set_hp(hitter:get_hp() - 1) - end -end - --- Called when object is right-clicked -function TNT:on_rightclick(clicker) - --pos = self.object:getpos() - --pos = {x=pos.x, y=pos.y+0.1, z=pos.z} - --self.object:moveto(pos, false) -end - ---print("TNT dump: "..dump(TNT)) ---print("Registering TNT"); -minetest.register_entity("experimental:tnt", TNT) - --- Add TNT's old name also -minetest.register_alias("TNT", "experimental:tnt") - --- --- The dummyball! --- - -minetest.register_entity("experimental:dummyball", { - initial_properties = { - hp_max = 20, - physical = false, - collisionbox = {-0.4,-0.4,-0.4, 0.4,0.4,0.4}, - visual = "sprite", - visual_size = {x=1, y=1}, - textures = {"experimental_dummyball.png"}, - spritediv = {x=1, y=3}, - initial_sprite_basepos = {x=0, y=0}, - }, - - phase = 0, - phasetimer = 0, - - on_activate = function(self, staticdata) - minetest.log("action", "Dummyball activated!") - end, - - on_step = function(self, dtime) - self.phasetimer = self.phasetimer + dtime - if self.phasetimer > 2.0 then - self.phasetimer = self.phasetimer - 2.0 - self.phase = self.phase + 1 - if self.phase >= 3 then - self.phase = 0 - end - self.object:setsprite({x=0, y=self.phase}) - phasearmor = { - [0]={cracky=3}, - [1]={crumbly=3}, - [2]={fleshy=3} - } - self.object:set_armor_groups(phasearmor[self.phase]) - end - end, - - on_punch = function(self, hitter) - end, -}) - -minetest.register_on_chat_message(function(name, message) - local cmd = "/dummyball" - if message:sub(0, #cmd) == cmd then - count = tonumber(message:sub(#cmd+1)) or 1 - if not minetest.get_player_privs(name)["give"] then - minetest.chat_send_player(name, "you don't have permission to spawn (give)") - return true -- Handled chat message - end - if not minetest.get_player_privs(name)["interact"] then - minetest.chat_send_player(name, "you don't have permission to interact") - return true -- Handled chat message - end - if count >= 2 and not minetest.get_player_privs(name)["server"] then - minetest.chat_send_player(name, "you don't have " .. - "permission to spawn multiple " .. - "dummyballs (server)") - return true -- Handled chat message - end - local player = minetest.get_player_by_name(name) - if player == nil then - print("Unable to spawn entity, player is nil") - return true -- Handled chat message - end - local entityname = "experimental:dummyball" - local p = player:getpos() - p.y = p.y + 1 - for i = 1,count do - minetest.add_entity(p, entityname) - end - minetest.chat_send_player(name, '"'..entityname - ..'" spawned '..tostring(count)..' time(s).'); - return true -- Handled chat message - end -end) - --- --- A test entity for testing animated and yaw-modulated sprites --- - -minetest.register_entity("experimental:testentity", { - -- Static definition - physical = true, -- Collides with things - -- weight = 5, - collisionbox = {-0.7,-1.35,-0.7, 0.7,1.0,0.7}, - --collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual = "sprite", - visual_size = {x=2, y=3}, - textures = {"dungeon_master.png^[makealpha:128,0,0^[makealpha:128,128,0"}, - spritediv = {x=6, y=5}, - initial_sprite_basepos = {x=0, y=0}, - - on_activate = function(self, staticdata) - print("testentity.on_activate") - self.object:setsprite({x=0,y=0}, 1, 0, true) - --self.object:setsprite({x=0,y=0}, 4, 0.3, true) - - -- Set gravity - self.object:setacceleration({x=0, y=-10, z=0}) - -- Jump a bit upwards - self.object:setvelocity({x=0, y=10, z=0}) - end, - - on_punch = function(self, hitter) - self.object:remove() - hitter:add_to_inventory('craft testobject1 1') - end, - on_death = function(self, killer) - print("testentity.on_death") - end -}) - --- --- More random stuff --- - -minetest.register_on_respawnplayer(function(player) - print("on_respawnplayer") - -- player:setpos({x=0, y=30, z=0}) - -- return true -end) - -minetest.register_on_generated(function(minp, maxp) - --print("on_generated: minp="..dump(minp).." maxp="..dump(maxp)) - --cp = {x=(minp.x+maxp.x)/2, y=(minp.y+maxp.y)/2, z=(minp.z+maxp.z)/2} - --minetest.add_node(cp, {name="sand"}) -end) - --- Example setting get ---print("setting max_users = " .. dump(minetest.setting_get("max_users"))) ---print("setting asdf = " .. dump(minetest.setting_get("asdf"))) - -minetest.register_on_chat_message(function(name, message) - --[[print("on_chat_message: name="..dump(name).." message="..dump(message)) - local cmd = "/testcommand" - if message:sub(0, #cmd) == cmd then - print(cmd.." invoked") - return true - end - local cmd = "/help" - if message:sub(0, #cmd) == cmd then - print("script-overridden help command") - minetest.chat_send_all("script-overridden help command") - return true - end]] -end) - --- Grow papyrus on TNT every 10 seconds ---[[minetest.register_abm({ - nodenames = {"TNT"}, - interval = 10.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - print("TNT ABM action") - pos.y = pos.y + 1 - minetest.add_node(pos, {name="papyrus"}) - end, -})]] - --- Replace texts of alls signs with "foo" every 10 seconds ---[[minetest.register_abm({ - nodenames = {"sign_wall"}, - interval = 10.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - print("ABM: Sign text changed") - local meta = minetest.get_meta(pos) - meta:set_text("foo") - end, -})]] - ---[[local ncpos = nil -local ncq = 1 -local ncstuff = { - {2, 1, 0, 3}, {3, 0, 1, 2}, {4, -1, 0, 1}, {5, -1, 0, 1}, {6, 0, -1, 0}, - {7, 0, -1, 0}, {8, 1, 0, 3}, {9, 1, 0, 3}, {10, 1, 0, 3}, {11, 0, 1, 2}, - {12, 0, 1, 2}, {13, 0, 1, 2}, {14, -1, 0, 1}, {15, -1, 0, 1}, {16, -1, 0, 1}, - {17, -1, 0, 1}, {18, 0, -1, 0}, {19, 0, -1, 0}, {20, 0, -1, 0}, {21, 0, -1, 0}, - {22, 1, 0, 3}, {23, 1, 0, 3}, {24, 1, 0, 3}, {25, 1, 0, 3}, {10, 0, 1, 2} -} -local ncold = {} -local nctime = nil - -minetest.register_abm({ - nodenames = {"dirt_with_grass"}, - interval = 100000.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - if ncpos ~= nil then - return - end - - if pos.x % 16 ~= 8 or pos.z % 16 ~= 8 then - return - end - - pos.y = pos.y + 1 - n = minetest.get_node(pos) - print(dump(n)) - if n.name ~= "air" then - return - end - - pos.y = pos.y + 2 - ncpos = pos - nctime = os.clock() - minetest.add_node(ncpos, {name="nyancat"}) - end -}) - -minetest.register_abm({ - nodenames = {"nyancat"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - if ncpos == nil then - return - end - if pos.x == ncpos.x and pos.y == ncpos.y and pos.z == ncpos.z then - clock = os.clock() - if clock - nctime < 0.1 then - return - end - nctime = clock - - s0 = ncstuff[ncq] - ncq = s0[1] - s1 = ncstuff[ncq] - p0 = pos - p1 = {x = p0.x + s0[2], y = p0.y, z = p0.z + s0[3]} - p2 = {x = p1.x + s1[2], y = p1.y, z = p1.z + s1[3]} - table.insert(ncold, 1, p0) - while #ncold >= 10 do - minetest.add_node(ncold[#ncold], {name="air"}) - table.remove(ncold, #ncold) - end - minetest.add_node(p0, {name="nyancat_rainbow"}) - minetest.add_node(p1, {name="nyancat", param1=s0[4]}) - minetest.add_node(p2, {name="air"}) - ncpos = p1 - end - end, -})--]] - -minetest.register_node("experimental:tester_node_1", { - description = "Tester Node 1 (construct/destruct/timer)", - tiles = {"wieldhand.png"}, - groups = {oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), - -- This was known to cause a bug in minetest.item_place_node() when used - -- via minetest.place_node(), causing a placer with no position - paramtype2 = "facedir", - - on_construct = function(pos) - experimental.print_to_everything("experimental:tester_node_1:on_construct("..minetest.pos_to_string(pos)..")") - local meta = minetest.get_meta(pos) - meta:set_string("mine", "test") - local timer = minetest.get_node_timer(pos) - timer:start(4, 3) - end, - - after_place_node = function(pos, placer) - experimental.print_to_everything("experimental:tester_node_1:after_place_node("..minetest.pos_to_string(pos)..")") - local meta = minetest.get_meta(pos) - if meta:get_string("mine") == "test" then - experimental.print_to_everything("correct metadata found") - else - experimental.print_to_everything("incorrect metadata found") - end - end, - - on_destruct = function(pos) - experimental.print_to_everything("experimental:tester_node_1:on_destruct("..minetest.pos_to_string(pos)..")") - end, - - after_destruct = function(pos) - experimental.print_to_everything("experimental:tester_node_1:after_destruct("..minetest.pos_to_string(pos)..")") - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - experimental.print_to_everything("experimental:tester_node_1:after_dig_node("..minetest.pos_to_string(pos)..")") - end, - - on_timer = function(pos, elapsed) - experimental.print_to_everything("on_timer(): elapsed="..dump(elapsed)) - return true - end, -}) - -minetest.register_node("experimental:tiled", { - description = "Tiled stone", - tiles = {{ - name = "experimental_tiled.png", - align_style = "world", - scale = 8, - }}, - groups = {cracky=2}, -}) - -stairs.register_stair_and_slab("tiled_n", "experimental:tiled", - {cracky=2}, - {{name="experimental_tiled.png", align_style="node", scale=8}}, - "Tiled stair (node-aligned)", - "Tiled slab (node-aligned)") - -stairs.register_stair_and_slab("tiled", "experimantal:tiled", - {cracky=2}, - {{name="experimental_tiled.png", align_style="world", scale=8}}, - "Tiled stair", - "Tiled slab") - -minetest.register_craft({ - output = 'experimental:tiled 4', - recipe = { - {'default:cobble', '', 'default:cobble'}, - {'', '', ''}, - {'default:cobble', '', 'default:cobble'}, - } -}) - -minetest.register_craft({ - output = 'stairs:stair_tiled', - recipe = {{'stairs:stair_tiled_n'}} -}) - -minetest.register_craft({ - output = 'stairs:stair_tiled_n', - recipe = {{'stairs:stair_tiled'}} -}) - -minetest.register_craft({ - output = 'stairs:slab_tiled', - recipe = {{'stairs:slab_tiled_n'}} -}) - -minetest.register_craft({ - output = 'stairs:slab_tiled_n', - recipe = {{'stairs:slab_tiled'}} -}) - -minetest.register_craftitem("experimental:tester_tool_1", { - description = "Tester Tool 1", - inventory_image = "experimental_tester_tool_1.png", - on_use = function(itemstack, user, pointed_thing) - --print(dump(pointed_thing)) - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - if node.name == "experimental:tester_node_1" or node.name == "default:chest" then - local p = pointed_thing.under - minetest.log("action", "Tester tool used at "..minetest.pos_to_string(p)) - if node.name == "experimental:tester_node_1" then - minetest.dig_node(p) - else - minetest.get_meta(p):mark_as_private({"infotext", "formspec"}) - minetest.chat_send_player(user:get_player_name(), "Verify that chest is unusable now.") - end - else - local p = pointed_thing.above - minetest.log("action", "Tester tool used at "..minetest.pos_to_string(p)) - minetest.place_node(p, {name="experimental:tester_node_1"}) - end - end - end, -}) - -minetest.register_craft({ - output = 'experimental:tester_tool_1', - recipe = { - {'group:crumbly'}, - {'group:crumbly'}, - } -}) - -minetest.register_craftitem("experimental:tester_tool_2", { - description = "Tester Tool 2", - inventory_image = "experimental_tester_tool_1.png^[invert:g", - on_use = function(itemstack, user, pointed_thing) - local pos = minetest.get_pointed_thing_position(pointed_thing, true) - if pos == nil then return end - pos = vector.add(pos, {x=0, y=0.5, z=0}) - local tex, anim - if math.random(0, 1) == 0 then - tex = "default_lava_source_animated.png" - anim = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} - else - tex = "default_lava_flowing_animated.png" - anim = {type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} - end - - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0.04, z=0}, - expirationtime = 6, - collisiondetection = true, - texture = tex, - animation = anim, - size = 4, - glow = math.random(0, 5), - }) - end, -}) - --- Test the disable_repair=1 group -minetest.register_tool("experimental:unrepairable_tool", { - description = "Unrepairable Tool", - wield_image = "default_stone.png", - inventory_image = "default_stone.png", - tool_capabilities = { - groupcaps = { - cracky = { - times = {3, 2, 1}, - } - } - }, - groups = { disable_repair = 1 } -}) - -minetest.register_tool("experimental:repairable_tool", { - description = "Repairable Tool", - wield_image = "default_dirt.png", - inventory_image = "default_dirt.png", - tool_capabilities = { - groupcaps = { - cracky = { - times = {3, 2, 1}, - } - } - }, -}) - -minetest.register_craft({ - output = 'experimental:tester_tool_2', - recipe = { - {'group:crumbly','group:crumbly'}, - } -}) - ---[[minetest.register_on_joinplayer(function(player) - minetest.after(3, function() - player:set_inventory_formspec("size[8,7.5]".. - "image[1,0.6;1,2;player.png]".. - "list[current_player;main;0,3.5;8,4;]".. - "list[current_player;craft;3,0;3,3;]".. - "list[current_player;craftpreview;7,1;1,1;]") - end) -end)]] - --- Create a detached inventory -local inv = minetest.create_detached_inventory("test_inventory", { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - experimental.print_to_everything("allow move asked") - return count -- Allow all - end, - allow_put = function(inv, listname, index, stack, player) - experimental.print_to_everything("allow put asked") - return 1 -- Allow only 1 - end, - allow_take = function(inv, listname, index, stack, player) - experimental.print_to_everything("allow take asked") - return 4 -- Allow 4 at max - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - experimental.print_to_everything(player:get_player_name().." moved items") - end, - on_put = function(inv, listname, index, stack, player) - experimental.print_to_everything(player:get_player_name().." put items") - end, - on_take = function(inv, listname, index, stack, player) - experimental.print_to_everything(player:get_player_name().." took items") - end, -}) -inv:set_size("main", 4*6) -inv:add_item("main", "experimental:tester_tool_1") -inv:add_item("main", "experimental:tnt 5") - -minetest.register_chatcommand("test1", { - params = "", - description = "Test 1: Modify player's inventory view", - func = function(name, param) - local player = minetest.get_player_by_name(name) - if not player then - return - end - player:set_inventory_formspec( - "size[13,7.5]".. - "image[6,0.6;1,2;player.png]".. - "list[current_player;main;5,3.5;8,4;]".. - "list[current_player;craft;8,0;3,3;]".. - "list[current_player;craftpreview;12,1;1,1;]".. - "list[detached:test_inventory;main;0,0;4,6;0]".. - "button[0.5,7;2,1;button1;Button 1]".. - "button_exit[2.5,7;2,1;button2;Exit Button]" - ) - minetest.chat_send_player(name, "Done."); - end, -}) - -minetest.register_chatcommand("test_bulk_set_node", { - params = "", - description = "Test 2: bulk set a node", - func = function(name, param) - local player = minetest.get_player_by_name(name) - if not player then - return - end - local pos_list = {} - local ppos = player:get_pos() - local i = 1 - for x=2,10 do - for y=2,10 do - for z=2,10 do - pos_list[i] = {x=ppos.x + x,y = ppos.y + y,z = ppos.z + z} - i = i + 1 - end - end - end - minetest.bulk_set_node(pos_list, {name = "default:stone"}) - minetest.chat_send_player(name, "Done."); - end, -}) - -minetest.register_chatcommand("bench_bulk_set_node", { - params = "", - description = "Test 3: bulk set a node (bench)", - func = function(name, param) - local player = minetest.get_player_by_name(name) - if not player then - return - end - local pos_list = {} - local ppos = player:get_pos() - local i = 1 - for x=2,100 do - for y=2,100 do - for z=2,100 do - pos_list[i] = {x=ppos.x + x,y = ppos.y + y,z = ppos.z + z} - i = i + 1 - end - end - end - - minetest.chat_send_player(name, "Benching bulk set node. Warming up..."); - - -- warm up with default:stone to prevent having different callbacks - -- due to different node topology - minetest.bulk_set_node(pos_list, {name = "default:stone"}) - - minetest.chat_send_player(name, "Warming up finished, now benching..."); - - local start_time = os.clock() - for i=1,#pos_list do - minetest.set_node(pos_list[i], {name = "default:stone"}) - end - local middle_time = os.clock() - minetest.bulk_set_node(pos_list, {name = "default:stone"}) - local end_time = os.clock() - minetest.chat_send_player(name, - string.format("Bench results: set_node loop[%.2fms], bulk_set_node[%.2fms]", - (middle_time - start_time) * 1000, - (end_time - middle_time) * 1000 - ) - ); - end, -}) - -local formspec_test_active = false - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formspec_test_active then - experimental.print_to_everything("Inventory fields 1: player="..player:get_player_name()..", fields="..dump(fields)) - end -end) -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formspec_test_active then - experimental.print_to_everything("Inventory fields 2: player="..player:get_player_name()..", fields="..dump(fields)) - return true -- Disable the first callback - end -end) -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formspec_test_active then - experimental.print_to_everything("Inventory fields 3: player="..player:get_player_name()..", fields="..dump(fields)) - end -end) - -minetest.register_chatcommand("test_formspec", { - param = "", - description = "Test 4: Toggle formspec test", - func = function(name, param) - formspec_test_active = not formspec_test_active - if formspec_test_active then - minetest.chat_send_player(name, "Formspec test enabled!") - else - minetest.chat_send_player(name, "Formspec test disabled!") - end - end -}) - -minetest.log("info", "experimental modname="..dump(minetest.get_current_modname())) -minetest.log("info", "experimental modpath="..dump(minetest.get_modpath("experimental"))) -minetest.log("info", "experimental worldpath="..dump(minetest.get_worldpath())) - - -core.register_on_mods_loaded(function() - core.log("action", "Yeah experimental loaded mods.") -end) - --- END diff --git a/games/minimal/mods/experimental/items.lua b/games/minimal/mods/experimental/items.lua new file mode 100644 index 000000000..51b063ba2 --- /dev/null +++ b/games/minimal/mods/experimental/items.lua @@ -0,0 +1,103 @@ +minetest.register_node("experimental:callback_node", { + description = "Callback Test Node (construct/destruct/timer)", + tiles = {"experimental_callback_node.png"}, + groups = {dig_immediate=3}, + -- This was known to cause a bug in minetest.item_place_node() when used + -- via minetest.place_node(), causing a placer with no position + paramtype2 = "facedir", + drop = "", + + on_construct = function(pos) + experimental.print_to_everything("experimental:callback_node:on_construct("..minetest.pos_to_string(pos)..")") + local meta = minetest.get_meta(pos) + meta:set_string("mine", "test") + local timer = minetest.get_node_timer(pos) + timer:start(4, 3) + end, + + after_place_node = function(pos, placer) + experimental.print_to_everything("experimental:callback_node:after_place_node("..minetest.pos_to_string(pos)..")") + local meta = minetest.get_meta(pos) + if meta:get_string("mine") == "test" then + experimental.print_to_everything("correct metadata found") + else + experimental.print_to_everything("incorrect metadata found") + end + end, + + on_destruct = function(pos) + experimental.print_to_everything("experimental:callback_node:on_destruct("..minetest.pos_to_string(pos)..")") + end, + + after_destruct = function(pos) + experimental.print_to_everything("experimental:callback_node:after_destruct("..minetest.pos_to_string(pos)..")") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + experimental.print_to_everything("experimental:callback_node:after_dig_node("..minetest.pos_to_string(pos)..")") + end, + + on_timer = function(pos, elapsed) + experimental.print_to_everything("on_timer(): elapsed="..dump(elapsed)) + return true + end, +}) + +minetest.register_tool("experimental:privatizer", { + description = "Node Meta Privatizer", + inventory_image = "experimental_tester_tool_1.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "node" then + local node = minetest.get_node(pointed_thing.under) + if node.name == "chest:chest" then + local p = pointed_thing.under + minetest.log("action", "Privatizer used at "..minetest.pos_to_string(p)) + minetest.get_meta(p):mark_as_private({"infotext", "formspec"}) + if user and user:is_player() then + minetest.chat_send_player(user:get_player_name(), "Chest metadata (infotext, formspec) set private!") + end + return + end + end + if user and user:is_player() then + minetest.chat_send_player(user:get_player_name(), "Privatizer can only be used on chest!") + end + end, +}) + +minetest.register_tool("experimental:particle_spawner", { + description = "Particle Spawner", + inventory_image = "experimental_tester_tool_1.png^[invert:g", + groups = { testtool = 1, disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + local pos = minetest.get_pointed_thing_position(pointed_thing, true) + if pos == nil then + if user then + pos = user:get_pos() + end + end + pos = vector.add(pos, {x=0, y=0.5, z=0}) + local tex, anim + if math.random(0, 1) == 0 then + tex = "experimental_particle_sheet.png" + anim = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} + else + tex = "experimental_particle_vertical.png" + anim = {type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + end + + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0.04, z=0}, + expirationtime = 6, + collisiondetection = true, + texture = tex, + animation = anim, + size = 4, + glow = math.random(0, 5), + }) + end, +}) + diff --git a/games/minimal/mods/experimental/mod.conf b/games/minimal/mods/experimental/mod.conf index 018e761b3..cf0f9cb42 100644 --- a/games/minimal/mods/experimental/mod.conf +++ b/games/minimal/mods/experimental/mod.conf @@ -1,3 +1,2 @@ name = experimental -description = Minimal mod to test features -depends = default, stairs +description = Chaotic mod containing unstructured tests for testing out engine features. The features in this mod should be moved to other mods. diff --git a/games/minimal/mods/experimental/modchannels.lua b/games/minimal/mods/experimental/modchannels.lua deleted file mode 100644 index 8fce6cfc4..000000000 --- a/games/minimal/mods/experimental/modchannels.lua +++ /dev/null @@ -1,16 +0,0 @@ --- --- Mod channels experimental handlers --- -local mod_channel = core.mod_channel_join("experimental_preview") - -core.register_on_modchannel_message(function(channel, sender, message) - print("[minimal][modchannels] Server received message `" .. message - .. "` on channel `" .. channel .. "` from sender `" .. sender .. "`") - - if mod_channel:is_writeable() then - mod_channel:send_all("experimental answers to preview") - mod_channel:leave() - end -end) - -print("[minimal][modchannels] Code loaded!") diff --git a/games/minimal/mods/experimental/textures/experimental_callback_node.png b/games/minimal/mods/experimental/textures/experimental_callback_node.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d87434c04e6c7c9791b0ef469c41615a66b0ce GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|L7py-Ar*{kC$cg!C=qVQd1x)a`c3r4)d*rJPS<<4&7U~Qf}LExhL{fqAdxIgi& nQV!K9U-7;3{}vC`84-*cuP;7kyuM&E&~ye*S3j3^P61b1|3VF=2%x#VB|(0{KpFwwdQ^A-d3QZs978H@m3F=LJE9=MdNuUMv|DRigARPJ z_doyF!t?J%Pmgyz&)>GifABvp@m%73_x$A|zc@>ZBM!W*5ZM0hapQlv2Rc0E-Ob#4 zuL`y>U*MhN@Mj+9kDn};MVx-{IOb)3U<o>Tw; diff --git a/games/minimal/mods/experimental/textures/experimental_particle_sheet.png b/games/minimal/mods/experimental/textures/experimental_particle_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..6d70394e48d6a2451598c9cd9cdb1947d0559f0c GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^20*O9#0(@gcM10cDb4_&5Z8bI{{8>|{~{aP0fk0G zpkR}yi(^OyWAAxJHfBSC)`unybCx_4v5jIiSRTRn(eGyci8U)OZPAhd>$41eISp(qEPCD+FS%uIwXWmMpZL3}N-F($_eJCV-!!dzR;RPR zYmj$VKk`Y=V1d}@#!C&CO%&okw5sR&A6Xpk)bRPaoxFnAoTCNvCYb_V!{F)a=d#Wz Gp$PzOI!(R+ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/experimental/textures/experimental_particle_vertical.png b/games/minimal/mods/experimental/textures/experimental_particle_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..0320b7545a55e89c7438a91c6fbf6a1b6590cc0c GIT binary patch literal 308 zcmV-40n7f0P)J+U(t5a@$ z(mz?V(v#q+82$ZHlD`kJh;e6F(!mBC#7p@03sKK`q=DTM^GS5zGi4M^vCbn>W0000UV24n5pL=;joQ6Va6f@h3l*{^cGfnEwN`{ Y&}CaLy4v^aU!dU(p00i_>zopr05vF1qPTwk} qg&o!xyG3+#qq;+(2^}I6PhbT-G@yGywn-bT6j> diff --git a/games/minimal/mods/experimental/textures/experimental_tiled.png b/games/minimal/mods/experimental/textures/experimental_tiled.png deleted file mode 100644 index 67397b902aa2ba191ae9307db56ac123cf599440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1041 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV7}q$;uunK>+RgYvd0QMuBm+1 zUe`pfJz1j}Ir+JA>8l@4Qe-YD818znK6joSGplF9{X%uYNS4-6F~OP7cb=-Tnj2@g z|LWhm}gLmtQ&$J~VFK7IBby$LHs-xVOA1%36Q<)%6Ka{rr>vWHW@w zGDoxX^Cz5ResjBx{l&}c97<1lrkxE_uxaQveDY54g<@6HCx-Vmci1`B{gIzv@IgM{ z(Sf8Wl*^{$kWI_XC6S+iwpTS>zV%d~ulh#!u5G56k9* z%wO{4z?fO@%AFoRp9~jQM0u4I1UeM)~B#+#J^4}jA_!hCt9oWF45dP>d z!@<9MbZvIb-`>jp9q8HbpX-2bzsE0dho4^{;sXPRoWdq~xr8JCw0}Qjbi4KTATx)J zL-ECS_6?u2Stb^-HM76CYiHBY{GyTFK!@?f)CY`BK!p(evzjr5;cm6ckK>;}CX*kO z|H=yr>{S(ZL@?+u9APRbxpeUUb%^s`6v`*muKTn0+VcxG{oB7@KX<>Fv1YNiX3^Z| zyRJQ8^!YnIXkPsK;u%@`23PL#`9}6RCjR;Tz*qO#Dp4N(gkLTN@<%=}>@}WH$ab6E z(8l5Yx8CC$&NJ*RW#uiMzT~S_^Y{OE?-a^6{AS>vT2xtAJa7F)Kaaz|`_IJRT=M_t zUBeA&k8D#}@rDGW*m5o{-1>hHV||M`&7g6HT} ZdFe;Cv61Z?{{yo+gQu&X%Q~loCIBTB^G*N& diff --git a/games/minimal/mods/give_initial_stuff/init.lua b/games/minimal/mods/give_initial_stuff/init.lua index 29b835c7d..491a531e4 100644 --- a/games/minimal/mods/give_initial_stuff/init.lua +++ b/games/minimal/mods/give_initial_stuff/init.lua @@ -1,16 +1,37 @@ +local give_if_not_gotten_already = function(inv, list, item) + if not inv:contains_item(list, item) then + inv:add_item(list, item) + end +end + +local give_initial_stuff = function(player) + local inv = player:get_inventory() + give_if_not_gotten_already(inv, "main", "basetools:pick_mese") + give_if_not_gotten_already(inv, "main", "basetools:axe_steel") + give_if_not_gotten_already(inv, "main", "basetools:shovel_steel") + give_if_not_gotten_already(inv, "main", "bucket:bucket") + give_if_not_gotten_already(inv, "main", "testnodes:light14") + give_if_not_gotten_already(inv, "main", "chest_of_everything:chest") + minetest.log("action", "[give_initial_stuff] Giving initial stuff to "..player:get_player_name()) +end + minetest.register_on_newplayer(function(player) - print("[minimal] giving initial stuff to player") - player:get_inventory():add_item('main', 'default:pick_stone') - player:get_inventory():add_item('main', 'default:torch 99') - player:get_inventory():add_item('main', 'default:cobble 99') - player:get_inventory():add_item('main', 'default:wood 99') - player:get_inventory():add_item('main', 'default:axe_steel') - player:get_inventory():add_item('main', 'default:shovel_steel') - player:get_inventory():add_item('main', 'default:pick_wood') - player:get_inventory():add_item('main', 'default:pick_steel') - player:get_inventory():add_item('main', 'default:pick_mese') - player:get_inventory():add_item('main', 'default:mese 99') - player:get_inventory():add_item('main', 'default:water_source 99') - player:get_inventory():add_item('main', 'experimental:tester_tool_1') + if minetest.settings:get_bool("give_initial_stuff", true) then + give_initial_stuff(player) + end end) +minetest.register_chatcommand("stuff", { + params = "", + privs = { give = true }, + description = "Give yourself initial items", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player or not player:is_player() then + return false, "No player." + end + give_initial_stuff(player) + return true + end, +}) + diff --git a/games/minimal/mods/give_initial_stuff/mod.conf b/games/minimal/mods/give_initial_stuff/mod.conf index bd293f418..1ba49f52a 100644 --- a/games/minimal/mods/give_initial_stuff/mod.conf +++ b/games/minimal/mods/give_initial_stuff/mod.conf @@ -1,3 +1,3 @@ name = give_initial_stuff description = Gives items to players on join -depends = default +depends = basetools, bucket, chest_of_everything, testnodes diff --git a/games/minimal/mods/initial_message/init.lua b/games/minimal/mods/initial_message/init.lua new file mode 100644 index 000000000..f92f4d3cf --- /dev/null +++ b/games/minimal/mods/initial_message/init.lua @@ -0,0 +1,9 @@ +minetest.register_on_joinplayer(function(player) + local cb = function(player) + if not player or not player:is_player() then + return + end + minetest.chat_send_player(player:get_player_name(), "This is the \"Minimal development Test\" [minimal], meant only for testing and development. Use Minetest Game for the real thing.") + end + minetest.after(2.0, cb, player) +end) diff --git a/games/minimal/mods/initial_message/mod.conf b/games/minimal/mods/initial_message/mod.conf new file mode 100644 index 000000000..32aa2ac4e --- /dev/null +++ b/games/minimal/mods/initial_message/mod.conf @@ -0,0 +1,2 @@ +name = initial_message +description = Show message to joining players explaining what this testing game is about diff --git a/games/minimal/mods/legacy/init.lua b/games/minimal/mods/legacy/init.lua deleted file mode 100644 index 98ad69be0..000000000 --- a/games/minimal/mods/legacy/init.lua +++ /dev/null @@ -1,128 +0,0 @@ --- legacy (Minetest 0.4 mod) --- Provides as much backwards-compatibility as feasible - --- --- Aliases to support loading 0.3 and old 0.4 worlds and inventories --- - -minetest.register_alias("stone", "default:stone") -minetest.register_alias("stone_with_coal", "default:stone_with_coal") -minetest.register_alias("stone_with_iron", "default:stone_with_iron") -minetest.register_alias("dirt_with_grass", "default:dirt_with_grass") -minetest.register_alias("dirt_with_grass_footsteps", "default:dirt_with_grass_footsteps") -minetest.register_alias("dirt", "default:dirt") -minetest.register_alias("sand", "default:sand") -minetest.register_alias("gravel", "default:gravel") -minetest.register_alias("sandstone", "default:sandstone") -minetest.register_alias("clay", "default:clay") -minetest.register_alias("brick", "default:brick") -minetest.register_alias("tree", "default:tree") -minetest.register_alias("jungletree", "default:jungletree") -minetest.register_alias("junglegrass", "default:junglegrass") -minetest.register_alias("leaves", "default:leaves") -minetest.register_alias("cactus", "default:cactus") -minetest.register_alias("papyrus", "default:papyrus") -minetest.register_alias("bookshelf", "default:bookshelf") -minetest.register_alias("glass", "default:glass") -minetest.register_alias("wooden_fence", "default:fence_wood") -minetest.register_alias("rail", "default:rail") -minetest.register_alias("ladder", "default:ladder") -minetest.register_alias("wood", "default:wood") -minetest.register_alias("mese", "default:mese") -minetest.register_alias("cloud", "default:cloud") -minetest.register_alias("water_flowing", "default:water_flowing") -minetest.register_alias("water_source", "default:water_source") -minetest.register_alias("lava_flowing", "default:lava_flowing") -minetest.register_alias("lava_source", "default:lava_source") -minetest.register_alias("torch", "default:torch") -minetest.register_alias("sign_wall", "default:sign_wall") -minetest.register_alias("furnace", "default:furnace") -minetest.register_alias("chest", "default:chest") -minetest.register_alias("locked_chest", "default:chest_locked") -minetest.register_alias("cobble", "default:cobble") -minetest.register_alias("mossycobble", "default:mossycobble") -minetest.register_alias("steelblock", "default:steelblock") -minetest.register_alias("nyancat", "default:nyancat") -minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow") -minetest.register_alias("sapling", "default:sapling") -minetest.register_alias("apple", "default:apple") - -minetest.register_alias("WPick", "default:pick_wood") -minetest.register_alias("STPick", "default:pick_stone") -minetest.register_alias("SteelPick", "default:pick_steel") -minetest.register_alias("MesePick", "default:pick_mese") -minetest.register_alias("WShovel", "default:shovel_wood") -minetest.register_alias("STShovel", "default:shovel_stone") -minetest.register_alias("SteelShovel", "default:shovel_steel") -minetest.register_alias("WAxe", "default:axe_wood") -minetest.register_alias("STAxe", "default:axe_stone") -minetest.register_alias("SteelAxe", "default:axe_steel") -minetest.register_alias("WSword", "default:sword_wood") -minetest.register_alias("STSword", "default:sword_stone") -minetest.register_alias("SteelSword", "default:sword_steel") - -minetest.register_alias("Stick", "default:stick") -minetest.register_alias("paper", "default:paper") -minetest.register_alias("book", "default:book") -minetest.register_alias("lump_of_coal", "default:coal_lump") -minetest.register_alias("lump_of_iron", "default:iron_lump") -minetest.register_alias("lump_of_clay", "default:clay_lump") -minetest.register_alias("steel_ingot", "default:steel_ingot") -minetest.register_alias("clay_brick", "default:clay_brick") -minetest.register_alias("scorched_stuff", "default:scorched_stuff") - --- --- Old items --- - -minetest.register_craftitem(":rat", { - description = "Rat", - inventory_image = "rat.png", - on_drop = function(item, dropper, pos) - item:take_item() - return item - end, - on_place = function(item, dropped, pointed) - pos = minetest.get_pointed_thing_position(pointed, true) - if pos ~= nil then - item:take_item() - return item - end - end -}) - -minetest.register_craftitem(":cooked_rat", { - description = "Cooked rat", - inventory_image = "cooked_rat.png", - on_use = minetest.item_eat(6), -}) - -minetest.register_craftitem(":firefly", { - description = "Firefly", - inventory_image = "firefly.png", - on_drop = function(item, dropper, pos) - item:take_item() - return item - end, - on_place = function(item, dropped, pointed) - pos = minetest.get_pointed_thing_position(pointed, true) - if pos ~= nil then - item:take_item() - return item - end - end -}) - -minetest.register_craft({ - type = "cooking", - output = "cooked_rat", - recipe = "rat", -}) - -minetest.register_craft({ - type = "cooking", - output = "scorched_stuff", - recipe = "cooked_rat", -}) - --- END diff --git a/games/minimal/mods/legacy/mod.conf b/games/minimal/mods/legacy/mod.conf deleted file mode 100644 index 12102e1ee..000000000 --- a/games/minimal/mods/legacy/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = legacy -description = Aliases allowing support for 0.3.x worlds -depends = default diff --git a/games/minimal/mods/legacy/textures/apple_iron.png b/games/minimal/mods/legacy/textures/apple_iron.png deleted file mode 100644 index db59458565a7ec35db083e15c671ed756e06710f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`cAhSdAr-gYPBi3VP~c&Hoc?Fo z{L^#vLwBY2H7m&7nb90nGcQeVisd5?J`HoJ$vKNX`0wf{tlTTW;df&H2F7ypu!sLX StcU}e#Ng@b=d#Wzp$P!ZJtran diff --git a/games/minimal/mods/legacy/textures/cooked_rat.png b/games/minimal/mods/legacy/textures/cooked_rat.png deleted file mode 100644 index 776dc4ee0111507fc57b6d2206e281ec81d2a1dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 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 LuJAr9lqCHdyOPwF diff --git a/games/minimal/mods/legacy/textures/fireball.png b/games/minimal/mods/legacy/textures/fireball.png deleted file mode 100644 index 124469ce4325ff525a55db2c2de41da83f0ec1a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmV+y0qFjTP)e%^ zfB?Y%0RNl-|KtGw^NGA(n|c5M0KiE^K~#9!eUd>Az#s?&U2*>Z!qVB6%zG+V zZFG53I9YJ@uLCiHpCq0zF06WOdhi#M%tMa-T;@9!nPmev#5#jq=IQF^vd$@?2>?yj BLr?$! diff --git a/games/minimal/mods/legacy/textures/rat.png b/games/minimal/mods/legacy/textures/rat.png deleted file mode 100644 index 04cf9b86589557248bac317a9ec0c3beb613e77a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2r1%4TLR^8giV6sMdNTa~?>RqI zG#eJPxMY|NcLl#J0;kWI@t5<^HQv8HA-j44$rjF6*2UngA*1D1!h1 diff --git a/games/minimal/mods/mapgen/init.lua b/games/minimal/mods/mapgen/init.lua new file mode 100644 index 000000000..13a186a50 --- /dev/null +++ b/games/minimal/mods/mapgen/init.lua @@ -0,0 +1,81 @@ +-- +-- Aliases for map generator outputs +-- + +-- ESSENTIAL node aliases +-- Basic nodes +minetest.register_alias("mapgen_stone", "basenodes:stone") +minetest.register_alias("mapgen_water_source", "basenodes:water_source") +minetest.register_alias("mapgen_river_water_source", "basenodes:river_water_source") + +-- Additional essential aliases for v6 +minetest.register_alias("mapgen_lava_source", "basenodes:lava_source") +minetest.register_alias("mapgen_dirt", "basenodes:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "basenodes:dirt_with_grass") +minetest.register_alias("mapgen_sand", "basenodes:sand") +minetest.register_alias("mapgen_tree", "basenodes:tree") +minetest.register_alias("mapgen_leaves", "basenodes:leaves") +minetest.register_alias("mapgen_apple", "basenodes:apple") + +-- Essential alias for dungeons +minetest.register_alias("mapgen_cobble", "basenodes:cobble") + +-- Optional aliases for v6 (they all have fallback values in the engine) +if minetest.settings:get_bool("devtest_v6_mapgen_aliases", false) then + minetest.register_alias("mapgen_gravel", "basenodes:gravel") + minetest.register_alias("mapgen_desert_stone", "basenodes:desert_stone") + minetest.register_alias("mapgen_desert_sand", "basenodes:desert_sand") + minetest.register_alias("mapgen_dirt_with_snow", "basenodes:dirt_with_snow") + minetest.register_alias("mapgen_snowblock", "basenodes:snowblock") + minetest.register_alias("mapgen_snow", "basenodes:snow") + minetest.register_alias("mapgen_ice", "basenodes:ice") + minetest.register_alias("mapgen_junglegrass", "basenodes:junglegrass") + minetest.register_alias("mapgen_jungletree", "basenodes:jungletree") + minetest.register_alias("mapgen_jungleleaves", "basenodes:jungleleaves") + minetest.register_alias("mapgen_pine_tree", "basenodes:pine_tree") + minetest.register_alias("mapgen_pine_needles", "basenodes:pine_needles") +end +-- Optional alias for mossycobble (should fall back to cobble) +if minetest.settings:get_bool("devtest_dungeon_mossycobble", false) then + minetest.register_alias("mapgen_mossycobble", "basenodes:mossycobble") +end +-- Optional aliases for dungeon stairs (should fall back to full nodes) +if minetest.settings:get_bool("devtest_dungeon_stairs", false) then + minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") + if minetest.settings:get_bool("devtest_v6_mapgen_aliases", false) then + minetest.register_alias("mapgen_stair_desert_stone", "stairs:stair_desert_stone") + end +end + +-- +-- Register biomes for biome API +-- + +minetest.clear_registered_biomes() +minetest.clear_registered_decorations() + +if minetest.settings:get_bool("devtest_register_biomes", true) then + minetest.register_biome({ + name = "mapgen:grassland", + node_top = "basenodes:dirt_with_grass", + depth_top = 1, + node_filler = "basenodes:dirt", + depth_filler = 1, + y_min = 5, + y_max = 31000, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "mapgen:grassland_ocean", + node_top = "basenodes:sand", + depth_top = 1, + node_filler = "basenodes:sand", + depth_filler = 2, + y_min = -31000, + y_max = 4, + heat_point = 50, + humidity_point = 50, + }) +end diff --git a/games/minimal/mods/mapgen/mod.conf b/games/minimal/mods/mapgen/mod.conf new file mode 100644 index 000000000..15750ccbe --- /dev/null +++ b/games/minimal/mods/mapgen/mod.conf @@ -0,0 +1,3 @@ +name = mapgen +description = Minimal map generator +depends = basenodes diff --git a/games/minimal/mods/modchannels/init.lua b/games/minimal/mods/modchannels/init.lua new file mode 100644 index 000000000..ee925f09b --- /dev/null +++ b/games/minimal/mods/modchannels/init.lua @@ -0,0 +1,14 @@ +-- +-- Mod channels experimental handlers +-- +local mod_channel = minetest.mod_channel_join("experimental_preview") + +minetest.register_on_modchannel_message(function(channel, sender, message) + minetest.log("action", "[modchannels] Server received message `" .. message + .. "` on channel `" .. channel .. "` from sender `" .. sender .. "`") + + if mod_channel:is_writeable() then + mod_channel:send_all("experimental answers to preview") + mod_channel:leave() + end +end) diff --git a/games/minimal/mods/modchannels/mod.conf b/games/minimal/mods/modchannels/mod.conf new file mode 100644 index 000000000..7c13aadfb --- /dev/null +++ b/games/minimal/mods/modchannels/mod.conf @@ -0,0 +1,2 @@ +name = modchannels +description = Add experimental mod channel handlers diff --git a/games/minimal/mods/soundstuff/init.lua b/games/minimal/mods/soundstuff/init.lua new file mode 100644 index 000000000..22012ba14 --- /dev/null +++ b/games/minimal/mods/soundstuff/init.lua @@ -0,0 +1,170 @@ +local simple_nodes = { + footstep = { "Footstep Sound Node", "soundstuff_node_footstep.png" }, + dig = { "Dig Sound Node", "soundstuff_node_dig.png" }, + dug = { "Dug Sound Node", "soundstuff_node_dug.png" }, + place = { "Place Sound Node", "soundstuff_node_place.png" }, + place_failed = { "Place Failed Sound Node", "soundstuff_node_place_failed.png" }, +} + +for k,v in pairs(simple_nodes) do + minetest.register_node("soundstuff:"..k, { + description = v[1], + tiles = {"soundstuff_node_sound.png","soundstuff_node_sound.png",v[2]}, + groups = {dig_immediate=2}, + sounds = { + [k] = { name = "soundstuff_mono", gain = 1.0 }, + } + }) +end + +minetest.register_node("soundstuff:place_failed_attached", { + description = "Attached Place Failed Sound Node", + tiles = {"soundstuff_node_sound.png", "soundstuff_node_sound.png", "soundstuff_node_place_failed.png"}, + groups = {dig_immediate=2, attached_node=1}, + drawtype = "nodebox", + paramtype = "light", + node_box = { type = "fixed", fixed = { + { -7/16, -7/16, -7/16, 7/16, 7/16, 7/16 }, + { -0.5, -0.5, -0.5, 0.5, -7/16, 0.5 }, + }}, + sounds = { + place_failed = { name = "soundstuff_mono", gain = 1.0 }, + }, +}) + +minetest.register_node("soundstuff:fall", { + description = "Fall Sound Node", + tiles = {"soundstuff_node_sound.png", "soundstuff_node_sound.png", "soundstuff_node_fall.png"}, + groups = {dig_immediate=2, falling_node=1}, + sounds = { + fall = { name = "soundstuff_mono", gain = 1.0 }, + } +}) + +minetest.register_node("soundstuff:fall_attached", { + description = "Attached Fall Sound Node", + tiles = {"soundstuff_node_sound.png", "soundstuff_node_sound.png", "soundstuff_node_fall.png"}, + groups = {dig_immediate=2, attached_node=1}, + drawtype = "nodebox", + paramtype = "light", + node_box = { type = "fixed", fixed = { + { -7/16, -7/16, -7/16, 7/16, 7/16, 7/16 }, + { -0.5, -0.5, -0.5, 0.5, -7/16, 0.5 }, + }}, + sounds = { + fall = { name = "soundstuff_mono", gain = 1.0 }, + } +}) + +minetest.register_node("soundstuff:footstep_liquid", { + description = "Liquid Footstep Sound Node", + drawtype = "liquid", + tiles = { + "soundstuff_node_sound.png^[colorize:#0000FF:127", + }, + special_tiles = { + {name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = false}, + {name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = true}, + }, + liquids_pointable = true, + liquidtype = "source", + liquid_alternative_flowing = "soundstuff:footstep_liquid", + liquid_alternative_source = "soundstuff:footstep_liquid", + liquid_renewable = false, + liquid_range = 0, + liquid_viscosity = 0, + alpha = 190, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + post_effect_color = {a = 64, r = 0, g = 0, b = 200}, + sounds = { + footstep = { name = "soundstuff_mono", gain = 1.0 }, + } +}) + +minetest.register_node("soundstuff:footstep_climbable", { + description = "Climbable Footstep Sound Node", + drawtype = "allfaces", + tiles = { + "soundstuff_node_climbable.png", + }, + alpha = 120, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + groups = { dig_immediate = 2 }, + sounds = { + footstep = { name = "soundstuff_mono", gain = 1.0 }, + } +}) + + + +minetest.register_craftitem("soundstuff:eat", { + description = "Eat Sound Item", + inventory_image = "soundstuff_eat.png", + on_use = minetest.item_eat(0), + sound = { + eat = { name = "soundstuff_mono", gain = 1.0 }, + } +}) + +minetest.register_tool("soundstuff:breaks", { + description = "Break Sound Tool", + inventory_image = "soundstuff_node_dug.png", + sound = { + breaks = { name = "soundstuff_mono", gain = 1.0 }, + }, + tool_capabilities = { + max_drop_level=0, + groupcaps={ + cracky={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, + choppy={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, + snappy={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, + crumbly={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, + }, + }, +}) + +-- Plays sound repeatedly +minetest.register_node("soundstuff:positional", { + description = "Positional Sound Node", + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + timer:start(0) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + local dist = node.param2 + if dist == 0 then + dist = nil + end + minetest.sound_play("soundstuff_mono", { pos = pos, max_hear_distance = dist }) + local timer = minetest.get_node_timer(pos) + timer:start(0.7) + end, + on_rightclick = function(pos, node, clicker) + node.param2 = (node.param2 + 1) % 64 + minetest.set_node(pos, node) + if clicker and clicker:is_player() then + local dist = node.param2 + local diststr + if dist == 0 then + diststr = "" + else + diststr = tostring(dist) + end + minetest.chat_send_player(clicker:get_player_name(), "max_hear_distance = " .. diststr) + end + end, + + groups = { dig_immediate = 2 }, + tiles = { "soundstuff_node_sound.png" }, +}) + diff --git a/games/minimal/mods/soundstuff/mod.conf b/games/minimal/mods/soundstuff/mod.conf new file mode 100644 index 000000000..2c631e2da --- /dev/null +++ b/games/minimal/mods/soundstuff/mod.conf @@ -0,0 +1,2 @@ +name = soundstuff +description = Example items and nodes for testing sound effects diff --git a/games/minimal/mods/soundstuff/sounds/soundstuff_mono.ogg b/games/minimal/mods/soundstuff/sounds/soundstuff_mono.ogg new file mode 100644 index 0000000000000000000000000000000000000000..43428d5664cbb98fe197b7b04330bf0abfd23abf GIT binary patch literal 4362 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 Kb6Mw<&;$U~cp97l literal 0 HcmV?d00001 diff --git a/games/minimal/mods/soundstuff/textures/soundstuff_node_blank.png b/games/minimal/mods/soundstuff/textures/soundstuff_node_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..4dffacc4ca3cd9579c07f170de41ca4ffa9ddca9 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ql2i3Ar*|t5mN3_Ou?!yiyE&P ftV#@F&g5WFo+e!wloI_U<-ohR2cURcd^*{+uyV17paQ5hSnT8=WGyWiq( h~DYuCG^|OMwP5c)I$ztaD0e0s!p6CRYFe literal 0 HcmV?d00001 diff --git a/games/minimal/mods/soundstuff/textures/soundstuff_node_dug.png b/games/minimal/mods/soundstuff/textures/soundstuff_node_dug.png new file mode 100644 index 0000000000000000000000000000000000000000..bab5fbe516cf878f5bd81987458df8556cd85cd0 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|-kvUwAr*{MFEX+*D2lLLuzfi% zY5kV(Z@A+hE|qjP(7*C|f8_IzvD+P0na$YJgKswWHu|zMurVxiz7X3Ke#wgM5Bpu- f22BR82_+0X+h1}qocrMoG?u~B)z4*}Q$iB}Yyv5Q literal 0 HcmV?d00001 diff --git a/games/minimal/mods/soundstuff/textures/soundstuff_node_fall.png b/games/minimal/mods/soundstuff/textures/soundstuff_node_fall.png new file mode 100644 index 0000000000000000000000000000000000000000..17b14f1e4aa456f652b0f55b50acc82f12c65577 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|+MX_sAr*|t5mN3_Ou?!yN?KVA x%x|RJOdl{*D81>#fouk5pTb>BRWAuJq}si+s7Z?|1De9% M>FVdQ&MBb@05g;ud;kCd literal 0 HcmV?d00001 diff --git a/games/minimal/mods/soundstuff/textures/soundstuff_node_place_failed.png b/games/minimal/mods/soundstuff/textures/soundstuff_node_place_failed.png new file mode 100644 index 0000000000000000000000000000000000000000..780ba946d28da2347913ddd350da00a47d698946 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u1n(>mX-iH41DYiHcbzA z09kgPE{-7;jL8hl7cX28;7}B^`^we);_FL?yq_@&g3(+e(Ndh_GGsPzX2q mt2bdrovel+TS(6ZZYBmRR*@G@JFAjGhI+dCxvX?{wo$!WzlT+uX3Wo)ZR~)367)-35?oSt;v;k-g NgQu&X%Q~loCIDhg9Gn0E literal 0 HcmV?d00001 diff --git a/games/minimal/mods/stairs/init.lua b/games/minimal/mods/stairs/init.lua index 74b7890ee..2701cabab 100644 --- a/games/minimal/mods/stairs/init.lua +++ b/games/minimal/mods/stairs/init.lua @@ -18,15 +18,6 @@ function stairs.register_stair(subname, recipeitem, groups, images, description) }, }, }) - - minetest.register_craft({ - output = 'stairs:stair_' .. subname .. ' 4', - recipe = { - {recipeitem, "", ""}, - {recipeitem, recipeitem, ""}, - {recipeitem, recipeitem, recipeitem}, - }, - }) end -- Node will be called stairs:slab_ @@ -47,13 +38,6 @@ function stairs.register_slab(subname, recipeitem, groups, images, description) fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, }, }) - - minetest.register_craft({ - output = 'stairs:slab_' .. subname .. ' 3', - recipe = { - {recipeitem, recipeitem, recipeitem}, - }, - }) end -- Nodes will be called stairs:{stair,slab}_ @@ -62,32 +46,20 @@ function stairs.register_stair_and_slab(subname, recipeitem, groups, images, des stairs.register_slab(subname, recipeitem, groups, images, desc_slab) end -stairs.register_stair_and_slab("wood", "default:wood", - {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - {"default_wood.png"}, - "Wooden stair", - "Wooden slab") - -stairs.register_stair_and_slab("stone", "default:stone", +stairs.register_stair_and_slab("stone", "basenodes:stone", {cracky=3}, {"default_stone.png"}, - "Stone stair", - "Stone slab") + "Stone Stair", + "Stone Slab") -stairs.register_stair_and_slab("cobble", "default:cobble", +stairs.register_stair_and_slab("desert_stone", "basenodes:desert_stone", + {cracky=3}, + {"default_desert_stone.png"}, + "Desert Stone Stair", + "Desert Stone Slab") + +stairs.register_stair_and_slab("cobble", "basenodes:cobble", {cracky=3}, {"default_cobble.png"}, - "Cobble stair", - "Cobble slab") - -stairs.register_stair_and_slab("brick", "default:brick", - {cracky=3}, - {"default_brick.png"}, - "Brick stair", - "Brick slab") - -stairs.register_stair_and_slab("sandstone", "default:sandstone", - {crumbly=2,cracky=2}, - {"default_sandstone.png"}, - "Sandstone stair", - "Sandstone slab") + "Cobblestone Stair", + "Cobblestone Slab") diff --git a/games/minimal/mods/stairs/mod.conf b/games/minimal/mods/stairs/mod.conf index 32bda004a..724bff881 100644 --- a/games/minimal/mods/stairs/mod.conf +++ b/games/minimal/mods/stairs/mod.conf @@ -1,3 +1,3 @@ name = stairs description = Adds stairs and slabs -depends = default +depends = basenodes diff --git a/games/minimal/mods/test/crafting.lua b/games/minimal/mods/test/crafting.lua deleted file mode 100644 index 8964bd25a..000000000 --- a/games/minimal/mods/test/crafting.lua +++ /dev/null @@ -1,71 +0,0 @@ -local function test_clear_craft() - minetest.log("info", "Testing clear_craft") - -- Clearing by output - minetest.register_craft({ - output = "foo", - recipe = {{"bar"}} - }) - minetest.register_craft({ - output = "foo 4", - recipe = {{"foo", "bar"}} - }) - assert(#minetest.get_all_craft_recipes("foo") == 2) - minetest.clear_craft({output="foo"}) - assert(minetest.get_all_craft_recipes("foo") == nil) - -- Clearing by input - minetest.register_craft({ - output = "foo 4", - recipe = {{"foo", "bar"}} - }) - assert(#minetest.get_all_craft_recipes("foo") == 1) - minetest.clear_craft({recipe={{"foo", "bar"}}}) - assert(minetest.get_all_craft_recipes("foo") == nil) -end -test_clear_craft() - -local function test_get_craft_result() - minetest.log("info", "test_get_craft_result()") - -- normal - local input = { - method = "normal", - width = 2, - items = {"", "default:coal_lump", "", "default:stick"} - } - minetest.log("info", "torch crafting input: "..dump(input)) - local output, decremented_input = minetest.get_craft_result(input) - minetest.log("info", "torch crafting output: "..dump(output)) - minetest.log("info", "torch crafting decremented input: "..dump(decremented_input)) - assert(output.item) - minetest.log("info", "torch crafting output.item:to_table(): "..dump(output.item:to_table())) - assert(output.item:get_name() == "default:torch") - assert(output.item:get_count() == 4) - -- fuel - local input = { - method = "fuel", - width = 1, - items = {"default:coal_lump"} - } - minetest.log("info", "coal fuel input: "..dump(input)) - local output, decremented_input = minetest.get_craft_result(input) - minetest.log("info", "coal fuel output: "..dump(output)) - minetest.log("info", "coal fuel decremented input: "..dump(decremented_input)) - assert(output.time) - assert(output.time > 0) - -- cook - local input = { - method = "cooking", - width = 1, - items = {"default:cobble"} - } - minetest.log("info", "cobble cooking input: "..dump(output)) - local output, decremented_input = minetest.get_craft_result(input) - minetest.log("info", "cobble cooking output: "..dump(output)) - minetest.log("info", "cobble cooking decremented input: "..dump(decremented_input)) - assert(output.time) - assert(output.time > 0) - assert(output.item) - minetest.log("info", "cobble cooking output.item:to_table(): "..dump(output.item:to_table())) - assert(output.item:get_name() == "default:stone") - assert(output.item:get_count() == 1) -end -test_get_craft_result() diff --git a/games/minimal/mods/test/formspec.lua b/games/minimal/mods/test/formspec.lua deleted file mode 100644 index a5d3074cd..000000000 --- a/games/minimal/mods/test/formspec.lua +++ /dev/null @@ -1,298 +0,0 @@ -local color = minetest.colorize - -local hypertext = minetest.formspec_escape([[ - -
Furnace
- are crafted and used by the player for the purpose of cooking food and smelting various items. - - Solid block - Itself - No - Inactive:No Active:Yes (8) - No - No - Yes - Yes (99) - default:furnace default:furnace_active - Usage - The furnace menu can be accessed by using the furnace. - The furnace has 3 inventories: An input slot, a fuel slot and 4 output slots. The fire in the furnace will automatically start when there is a smeltable item in the input slot and a fuel in the fuel slot. - As long as the fire is on, the furnace will smelt any smeltable item in the input slot, one by one, until it is empty. When the fire goes off, it will smelt the next item until there are no smeltable items and no fuel items left. - The current stage of cooking can be seen by pointing the furnace or by viewing the furnace menu. In the furnace menu, the flame symbol roughly shows the remaining burning time. The arrow symbol shows the progress of the current smelting process. - Renewing - Furnaces can be crafted from e.g. cobblestone, a renewable resource. - Crafting - Sorry no way to display crafting yet in formspec pages. - Fuel - See Smelting for a list of furnace fuels. - Recipes - See the Smelting page. -]]) - - -local clip_fs = [[ - style_type[label,button,image_button,item_image_button, - tabheader,scrollbar,table,animated_image - ,field,textarea,checkbox,dropdown;noclip=%c] - - label[0,0;A clipping test] - button[0,1;3,0.8;x;A clipping test] - image_button[0,2;3,0.8;bubble.png;x2;A clipping test] - item_image_button[0,3;3,0.8;default:sword_steel;x3;A clipping test] - tabheader[0,4.7;3,0.63;x4;Clip,Test,Text,Tabs;1;false;false] - field[0,5;3,0.8;x5;Title;] - textarea[0,6;3,1;x6;Title;] - checkbox[0,7.5;x7;This is a test;true] - dropdown[0,8;3,0.8;x8;Select An Item,One,Two,Three,Four,Five;1] - scrollbar[0,9;3,0.8;horizontal;x9;3] - tablecolumns[text;text] - table[0,10;3,1;x10;one,two,three,four;1] - animated_image[-0.5,11;4.5,1;;test_animation.png;4;100] -]] - - -local style_fs = [[ - style[one_btn1;bgcolor=red;textcolor=yellow;bgcolor_hovered=orange; - bgcolor_pressed=purple] - button[0,0;2.5,0.8;one_btn1;Button] - - style[one_btn2;border=false;textcolor=cyan] ]].. - "button[0,1.05;2.5,0.8;one_btn2;Text " .. color("#FF0", "Yellow") .. [[] - - style[one_btn3;bgimg=bubble.png;bgimg_hovered=default_apple.png; - bgimg_pressed=heart.png] - button[0,2.1;1,1;one_btn3;Bor] - - style[one_btn4;bgimg=bubble.png;bgimg_hovered=default_apple.png; - bgimg_pressed=heart.png;border=false] - button[1.25,2.1;1,1;one_btn4;Bub] - - style[one_btn5;bgimg=bubble.png;bgimg_hovered=default_apple.png; - bgimg_pressed=heart.png;border=false;alpha=false] - button[0,3.35;1,1;one_btn5;Alph] - - style[one_btn6;border=true] - image_button[0,4.6;1,1;bubble.png;one_btn6;Border] - - style[one_btn7;border=false] - image_button[1.25,4.6;1,1;bubble.png;one_btn7;NoBor] - - style[one_btn8;border=false] - image_button[0,5.85;1,1;bubble.png;one_btn8;Border;false;true;heart.png] - - style[one_btn9;border=true] - image_button[1.25,5.85;1,1;bubble.png;one_btn9;NoBor;false;false;heart.png] - - style[one_btn10;alpha=false] - image_button[0,7.1;1,1;bubble.png;one_btn10;NoAlpha] - - style[one_btn11;alpha=true] - image_button[1.25,7.1;1,1;bubble.png;one_btn11;Alpha] - - style[one_btn12;border=true] - item_image_button[0,8.35;1,1;default:sword_steel;one_btn12;Border] - - style[one_btn13;border=false] - item_image_button[1.25,8.35;1,1;default:sword_steel;one_btn13;NoBor] - - style[one_btn14;border=false;bgimg=test_bg.png;fgimg=bubble.png;padding=8] - style[one_btn14:hovered;bgimg=test_bg_hovered.png;fgimg=default_apple.png;textcolor=red] - style[one_btn14:pressed;bgimg=test_bg_pressed.png;fgimg=heart.png;textcolor=green] - style[one_btn14:hovered+pressed;textcolor=blue] - image_button[0,9.6;1,1;bubble.png;one_btn14;Bg] - - style[one_btn15;border=false;bgimg=test_bg.png;bgimg_hovered=test_bg_hovered.png;bgimg_pressed=test_bg_pressed.png] - item_image_button[1.25,9.6;1,1;default:sword_steel;one_btn15;Bg] - - style[one_btn16;border=false;bgimg=test_bg_9slice.png;bgimg_hovered=test_bg_9slice_hovered.png;bgimg_pressed=test_bg_9slice_pressed.png;bgimg_middle=4,6] - style[one_btn16:pressed;content_offset=0,1] - button[2.5,9.6;2,1;one_btn16;9-Slice Bg] - - - - container[2.75,0] - - style[one_tb1;textcolor=Yellow] - tabheader[0,3;2.5,0.63;one_tb1;Yellow,Text,Tabs;1;false;false] - - style[one_f1;textcolor=yellow] - field[0,4.25;2.5,0.8;one_f1;Field One;Yellow Text] - - style[one_f2;border=false;textcolor=cyan] - field[0,5.75;2.5,0.8;one_f2;Field Two;Borderless Cyan Text] - - style[one_f3;textcolor=yellow] - textarea[0,7.025;2.5,0.8;one_f3;Label;]] .. - minetest.formspec_escape("Yellow Text\nLine two") .. [[ ] - - style[one_f4;border=false;textcolor=cyan] - textarea[0,8.324999999999999;2.5,0.8;one_f4;Label;]] .. - minetest.formspec_escape("Borderless Cyan Text\nLine two") .. [[ ] - - container_end[] -]] - ---style_type[label;textcolor=green] ---label[0,0;Green] ---style_type[label;textcolor=blue] ---label[0,1;Blue] ---style_type[label;textcolor=;border=true] ---label[1.2,0;Border] ---style_type[label;border=true;bgcolor=red] ---label[1.2,1;Background] ---style_type[label;border=;bgcolor=] ---label[0.75,2;Reset] - - -local pages = { - [[ - formspec_version[3] - size[12,12] - image_button[0,0;1,1;logo.png;;1x1] - image_button[1,0;2,2;logo.png;;2x2] - button[0,2;1,1;;1x1] - button[1,2;2,2;;2x2] - item_image[0,4;1,1;air] - item_image[1,4;2,2;air] - item_image_button[0,6;1,1;test:node;;1x1] - item_image_button[1,6;2,2;test:node;;2x2] - field[3,.5;3,.5;name;Field;text] - pwdfield[6,.5;3,1;name;Password Field] - field[3,1;3,1;;Read-Only Field;text] - textarea[3,2;3,.5;name;Textarea;text] - textarea[6,2;3,2;name;Textarea;text\nmore text] - textarea[3,3;3,1;;Read-Only Textarea;text\nmore text] - textlist[3,4;3,2;name;Textlist,Perfect Coordinates;1;false] - tableoptions[highlight=#ABCDEF75;background=#00000055;border=false] - table[6,4;3,2;name;Table,Cool Stuff,Foo,Bar;2] - dropdown[3,6;3,1;name;This,is,a,dropdown;1] - dropdown[6,6;3,2;name;I,am,a,bigger,dropdown;5] - image[0,8;3,2;ignore.png] - box[3,7;3,1;#00A3FF] - checkbox[3,8;name;Check me!;false] - checkbox[3,9;name;Uncheck me now!;true] - scrollbar[0,11.5;11.5,.5;horizontal;name;500] - scrollbar[11.5,0;.5,11.5;vertical;name;0] - list[current_player;main;6,8;3,2;1] - button[9,0;2.5,1;name;] - button[9,1;2.5,1;name;] - button[9,2;2.5,1;name;] ]].. - "label[9,0.5;This is a label.\nLine\nLine\nLine\nEnd]".. - [[button[9,3;1,1;name;] - vertlabel[9,4;VERT] - label[10,3;HORIZ] - tabheader[6.5,0;6,0.65;name;Tab 1,Tab 2,Tab 3,Secrets;1;false;false] - ]], - - "formspec_version[3]size[12,12]" .. - ("label[0.375,0.375;Styled - %s %s]"):format( - color("#F00", "red text"), - color("#77FF00CC", "green text")) .. - "label[6.375,0.375;Unstyled]" .. - "box[0,0.75;12,0.1;#999]" .. - "box[6,0.85;0.1,11.15;#999]" .. - "container[0.375,1.225]" .. - style_fs .. - "container_end[]container[6.375,1.225]" .. - style_fs:gsub("one_", "two_"):gsub("style%[[^%]]+%]", ""):gsub("style_type%[[^%]]+%]", "") .. - "container_end[]", - - "formspec_version[3]size[12,13]" .. - "label[0.1,0.5;Clip]" .. - "container[-2.5,1]" .. clip_fs:gsub("%%c", "false") .. "container_end[]" .. - "label[11,0.5;Noclip]" .. - "container[11.5,1]" .. clip_fs:gsub("%%c", "true") .. "container_end[]", - - [[ - formspec_version[3] - size[12,12] - animated_image[0.5,0.5;1,1;;test_animation.png;4;100] - animated_image[0.5,1.75;1,1;;test_animation.jpg;4;100] - animated_image[1.75,0.5;1,1;;test_animation.png;100;100] - animated_image[3,0.5;1,1;ani_img_1;test_animation.png;4;1000] - button[4.25,0.5;1,1;ani_btn_1;Current -Number] - animated_image[3,1.75;1,1;ani_img_2;test_animation.png;4;1000;2] - button[4.25,1.75;1,1;ani_btn_2;Current -Number] - animated_image[3,3;1,1;;test_animation.png;4;0] - animated_image[3,4.25;1,1;;test_animation.png;4;0;3] - animated_image[5.5,0.5;5,2;;test_animation.png;4;100] - animated_image[5.5,2.75;5,2;;test_animation.jpg;4;100] - ]], - - "formspec_version[3]".. - "size[12,12]".. - "button[8.5,1;1,1;bla;Bla]".. - "box[1,1;8,6;#00aa]".. - "scroll_container[1,1;8,6;scrbar;vertical]".. - "button[0,1;1,1;lorem;Lorem]".. - "button[0,10;1,1;ipsum;Ipsum]".. - "pwdfield[2,2;1,1;lorem2;Lorem]".. - "list[current_player;main;4,4;1,5;]".. - "box[2,5;3,2;#ffff00]".. - "image[1,10;3,2;bubble.png]".. - "image[3,1;bubble.png]".. - "item_image[2,6;3,2;default:mese]".. - "label[2,15;bla Bli\nfoo bar]".. - "item_image_button[2,3;1,1;default:dirt_with_grass;itemimagebutton;ItemImageButton]".. - "tooltip[0,11;3,2;Buz;#f00;#000]".. - "box[0,11;3,2;#00ff00]".. - "hypertext[3,13;3,3;;" .. hypertext .. "]" .. - "container[0,18]".. - "box[1,2;3,2;#0a0a]".. - "scroll_container[1,2;3,2;scrbar2;horizontal;0.06]".. - "button[0,0;6,1;butnest;Nest]".. - "label[10,0.5;nest]".. - "scroll_container_end[]".. - "scrollbar[1,0;3.5,0.3;horizontal;scrbar2;0]".. - "container_end[]".. - "dropdown[0,6;2;hmdrpdwn;apple,bulb;1]".. - "image_button[0,4;2,2;bubble.png;bubblebutton;bbbbtt;false;true;heart.png]".. - "box[1,22.5;4,1;#a00a]".. - "scroll_container_end[]".. - "scrollbaroptions[max=170]".. -- lowest seen pos is: 0.1*170+6=23 (factor*max+height) - "scrollbar[7.5,0;0.3,4;vertical;scrbar;20]".. - "scrollbar[8,0;0.3,4;vertical;scrbarhmmm;0]".. - "dropdown[0,6;2;hmdrpdwnnn;apple,bulb;1]", -} - -local function show_test_formspec(pname, page_id) - page_id = page_id or 2 - - local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,MiscEle,Scroll Container;" .. page_id .. ";false;false]" - - minetest.show_formspec(pname, "test:formspec", fs) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "test:formspec" then - return false - end - - if fields.maintabs then - show_test_formspec(player:get_player_name(), tonumber(fields.maintabs)) - return true - end - - if fields.ani_img_1 and fields.ani_btn_1 then - minetest.chat_send_all(fields.ani_img_1) - elseif fields.ani_img_2 and fields.ani_btn_2 then - minetest.chat_send_all(fields.ani_img_2) - end -end) - -minetest.register_node("test:node", { - tiles = { "air.png" } -}) - -minetest.register_chatcommand("formspec", { - func = function(name) - if not minetest.get_player_by_name(name) then - return false, "You need to be online!" - end - - show_test_formspec(name) - return true, "Opened formspec" - end, -}) diff --git a/games/minimal/mods/test/init.lua b/games/minimal/mods/test/init.lua deleted file mode 100644 index 4e2a51086..000000000 --- a/games/minimal/mods/test/init.lua +++ /dev/null @@ -1,15 +0,0 @@ --- --- Minimal Development Test --- Mod: test --- - - --- Try out PseudoRandom -pseudo = PseudoRandom(13) -assert(pseudo:next() == 22290) -assert(pseudo:next() == 13854) - -local modpath = minetest.get_modpath("test") -dofile(modpath .. "/player.lua") -dofile(modpath .. "/formspec.lua") -dofile(modpath .. "/crafting.lua") diff --git a/games/minimal/mods/test/mod.conf b/games/minimal/mods/test/mod.conf deleted file mode 100644 index ae6387e09..000000000 --- a/games/minimal/mods/test/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = test -description = Adds unit tests for the engine -optional_depends = default diff --git a/games/minimal/mods/test/textures/test_animation.png b/games/minimal/mods/test/textures/test_animation.png deleted file mode 100644 index 1752362ff0db7d622f92f7a9ab42c6ed0fc699a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3161 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 Aod5s; diff --git a/games/minimal/mods/test/textures/test_bg.png b/games/minimal/mods/test/textures/test_bg.png deleted file mode 100644 index f0f3929265734de57382ff9decb2363e670692c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR3mE?5sDH|z(I2hM}Y3->|fgZH~;y_*eW xNqD+AhDc0JPH@XUIx7GG diff --git a/games/minimal/mods/test/textures/test_bg_9slice.png b/games/minimal/mods/test/textures/test_bg_9slice.png deleted file mode 100644 index f9fe6870b690bbf7d4f1b8f3ff24c56975848fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL332`Z|9_x=Xl{1=-05vV zsZlT*0wXE}lGfk<3G^^yNswPKgTu2MX+REtiEBhjaDG}zd16s2gL_e8T7}VqMZsA> zDUakLzjPqYWMB^>9sEILKs<;{$On-H^&qmLA4E==4X-Da34fIc)x4byV*dNxu=U`h(&L5f&x#(2Zjwc!p43FSb`27I&-9h*}%|Q^a0Ca uE;mu0KvtH|tm|SJnXUvn7d1&e~SfKndGMSkf(n#sT(L^}9`$bfhdnUD`63+h2+LqCX|FdsxNSPvpM><5tt z&V$Gc_d(=?_q%4jn+;@{d%8G=So9_*EMQ7F$b8_F&lw9wVGmYrV_{{!14np58-#nb tBti{bL?B|mLR^y)((7vSmo1zO6dwhn zAuvKhAU8L6)v8th|Nj?XX*C__XZ{k`h?3y^w370~qErU=qQtZcqXmnCvw%__$whwY zK$^+G9z;6$gUEn*5Sfq3mE?5sDH|z(I2hM}Y3->|fgZH~;y_*eW xNqD+AhDc0JPH@v8IZ*%r diff --git a/games/minimal/mods/test/textures/test_bg_pressed.png b/games/minimal/mods/test/textures/test_bg_pressed.png deleted file mode 100644 index 76aafb8c13d322982670af732140c5d029a04afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR?*)y%OVsdRq&C;-g?R z1V%^*SAkx7fL= 5 then + self._phase = 0 + end + self.object:set_sprite({x=0, y=self._phase}) + self.object:set_armor_groups(phasearmor[self._phase]) + end, +}) diff --git a/games/minimal/mods/testentities/callbacks.lua b/games/minimal/mods/testentities/callbacks.lua new file mode 100644 index 000000000..711079f87 --- /dev/null +++ b/games/minimal/mods/testentities/callbacks.lua @@ -0,0 +1,75 @@ +-- Entities that test their callbacks + +local message = function(msg) + minetest.log("action", msg) + minetest.chat_send_all(msg) +end + +local get_object_name = function(obj) + local name = "" + if obj then + if obj:is_player() then + name = obj:get_player_name() + else + name = "" + end + end + return name +end + +local spos = function(self) + return minetest.pos_to_string(vector.round(self.object:get_pos())) +end + +-- Callback test entity (all callbacks except on_step) +minetest.register_entity("testentities:callback", { + initial_properties = { + visual = "upright_sprite", + textures = { "testentities_callback.png" }, + }, + + on_activate = function(self, staticdata, dtime_s) + message("Callback entity: on_activate! pos="..spos(self).."; dtime_s="..dtime_s) + end, + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) + local name = get_object_name(puncher) + message( + "Callback entity: on_punch! ".. + "pos="..spos(self).."; puncher="..name.."; ".. + "time_from_last_punch="..time_from_last_punch.."; ".. + "tool_capabilities="..tostring(dump(tool_capabilities)).."; ".. + "dir="..tostring(dump(dir)).."; damage="..damage) + end, + on_rightclick = function(self, clicker) + local name = get_object_name(clicker) + message("Callback entity: on_rightclick! pos="..spos(self).."; clicker="..name) + end, + on_death = function(self, killer) + local name = get_object_name(killer) + message("Callback entity: on_death! pos="..spos(self).."; killer="..name) + end, + on_attach_child = function(self, child) + local name = get_object_name(child) + message("Callback entity: on_attach_child! pos="..spos(self).."; child="..name) + end, + on_detach_child = function(self, child) + local name = get_object_name(child) + message("Callback entity: on_detach_child! pos="..spos(self).."; child="..name) + end, + on_detach = function(self, parent) + local name = get_object_name(parent) + message("Callback entity: on_detach! pos="..spos(self).."; parent="..name) + end, + get_staticdata = function(self) + message("Callback entity: get_staticdata! pos="..spos(self)) + end, +}) + +-- Only test on_step callback +minetest.register_entity("testentities:callback_step", { + visual = "upright_sprite", + textures = { "testentities_callback_step.png" }, + on_step = function(self, dtime) + message("on_step callback entity: on_step! pos="..spos(self).."; dtime="..dtime) + end, +}) diff --git a/games/minimal/mods/testentities/init.lua b/games/minimal/mods/testentities/init.lua new file mode 100644 index 000000000..df8c72ea7 --- /dev/null +++ b/games/minimal/mods/testentities/init.lua @@ -0,0 +1,3 @@ +dofile(minetest.get_modpath("testentities").."/visuals.lua") +dofile(minetest.get_modpath("testentities").."/armor.lua") +dofile(minetest.get_modpath("testentities").."/callbacks.lua") diff --git a/games/minimal/mods/testentities/mod.conf b/games/minimal/mods/testentities/mod.conf new file mode 100644 index 000000000..7a8cb5a3e --- /dev/null +++ b/games/minimal/mods/testentities/mod.conf @@ -0,0 +1,2 @@ +name = testentities +description = Example entities for testing diff --git a/games/minimal/mods/testentities/textures/testentities_armorball.png b/games/minimal/mods/testentities/textures/testentities_armorball.png new file mode 100644 index 0000000000000000000000000000000000000000..88147bd1f77c3cb377158ee2df87f547f0b795f7 GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^0ze$V!3-qTOIhuK)U*Jf5LY1m|NsB}uU<{Pa|ejx zPo1({y*lc|i7(Ik-rWdzc~D z)&2GfuU9)DyN>fi+kJ)i*RuIbK2PC29`Z3sSLNG1(|fk&>o@bdsvle}Ej2mHkIP@F zXITPM^3NGsI~Fpm`XbB9p5V*!$)@-1cIg>6G*($yoch*X^T7GUkIqL&jf;<@x9HCi ze$~#loIgWHe#PX;oo<)8l8xT#e^DSE978YL!Pb}!l#P~ovkh~LEKNQZRO z`Z<5*)^LX{TmOG)tl0{I<^4{AQzeA|Upc<9#wO#9?7>ePqcx|0xxMtq`Px5>@dxv# T+inlK0}4V5ZQFn?f^SOhrLo^ z*ejWZyO@6JcQbsHS6;d9ao&OXr@!7m$o|J;^1Oqqm^F^9+bfX&;}+0522WQ%mvv4F FO#s?uIivsp literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_callback_step.png b/games/minimal/mods/testentities/textures/testentities_callback_step.png new file mode 100644 index 0000000000000000000000000000000000000000..b67506a9723c6f93c7fb917c0904b6429e2e307f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|xt=bLAr*{CKh7WcFkgfr=Uc|6og>=LF~Ut?57cJu4Z6^?Ro=N3ZAr PTFl_->gTe~DWM4f&5=HQ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_cube1.png b/games/minimal/mods/testentities/textures/testentities_cube1.png new file mode 100644 index 0000000000000000000000000000000000000000..c667e425f451aae2c5d859d1f32428bb4c361f5b GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|o}Mm_Ar*|tKh7VR;Ks$U^4#n^ zcNM3MAN*_zY)vj4hi-E4o)D_=DB(5P#&|R2keNWI#$|@>vo^4$Ty@E8Sgm%G&B!#s dc8UiJgUY{7d9@u?!9YV9JYD@<);T3K0RXmoCei=^ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_cube2.png b/games/minimal/mods/testentities/textures/testentities_cube2.png new file mode 100644 index 0000000000000000000000000000000000000000..481823420c1030ae7be3944b1ed0115b7ddb9198 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|?w&4=Ar*|tKh7VR;Ks$Ua$U?b zCl#lRAN*_zY)vj4hi-E4o)D_=DB(5P#&|R2keNWI#-)Y=o{druZe^q~$7n7!3y||t bVPcpXyJ-2*J?6)NMlyK1`njxgN@xNAZIdR( literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_cube3.png b/games/minimal/mods/testentities/textures/testentities_cube3.png new file mode 100644 index 0000000000000000000000000000000000000000..03b5daa15f10cc7bbc998db2dc75f7c7cd40addf GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|&YmugAr*|tKh7VR;Ks$UGVks? zUlpf}AN*_zY)vj4hi-E4o)D_=DB(5P#&|R2keNWI#-)Y=o{druZn5p>ozgDU$-ofc Wuzj|l*+LJXaSWcWelF{r5}E+!G9@Jd literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_cube4.png b/games/minimal/mods/testentities/textures/testentities_cube4.png new file mode 100644 index 0000000000000000000000000000000000000000..639204896232e73ba5cb54c9a4a2ed4b632009a9 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|uAVNAAr*|tKh7VR;Ks$Ua$bp1 zheykW5Ar+?JS?38Et>_UCa8Xx@Iophhk4V=mRtp)z$J_i!)|3ZFkbrO(8so_U8s|R ZLB8&^_UCa8Xx@Iophhk4V=mRtp)z$J_iC4@{a++f>b=9Rm^W{L+3 ZgQD%tPs(eR@_+_1c)I$ztaD0e0su&ACPM%K literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_cube6.png b/games/minimal/mods/testentities/textures/testentities_cube6.png new file mode 100644 index 0000000000000000000000000000000000000000..5f81a64d91be219377841be129da41e48db7856a GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|uAVNAAr*|tKh7VR;Ks$UGVYtn zG>?`GALMx)cvw0GS~d$xO;G(X;e}L24)dm!Ex8IpflC-4N(h-;ILa1ea)9BgbEgXf ZLrCXGRoR`_<^c_4@O1TaS?83{1OQxYCh!0N literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_dungeon_master.png b/games/minimal/mods/testentities/textures/testentities_dungeon_master.png new file mode 100644 index 0000000000000000000000000000000000000000..1e31077464eaf2b7e39a24f21687e15b723fb5f1 GIT binary patch literal 2855 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 L^>bP0l+XkKkyj%p literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testentities/textures/testentities_upright_sprite2.png b/games/minimal/mods/testentities/textures/testentities_upright_sprite2.png new file mode 100644 index 0000000000000000000000000000000000000000..a79a760e341eb96412b298df8fc072249bfda002 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|cAhSdAr*{U`y1I93^-VSKd#&L ze@ElB1AENowm+D|^ICY_Iu?aJe0(8^J2sRH3$0an=dAEjv|%HY!T;t>;$kh_PP!Z9 SM3{jlF?hQAxvX|*ddEN^0$*sz9iy0HGj z^aF!HJmC}$G?T&8)z4*}Q$iB}^Die( literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testfood/textures/testfood_good2.png b/games/minimal/mods/testfood/textures/testfood_good2.png new file mode 100644 index 0000000000000000000000000000000000000000..e43dda209b1361c4d465ced4d962d551181b87dd GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5uPrNAr*|t3(S8oA5M{8P}KR* zzC-PDS_`8APk4j0a*o?^fyzT%9J?8UnGUK8u+0$KF=xeJ{;R41cFPzI%=E+^3=_o# rUb8kedVJ1UVxf3ZS2MY4Y824M&x?Hck4y^#+QH!I>gTe~DWM4fIj$@2 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testformspec/callbacks.lua b/games/minimal/mods/testformspec/callbacks.lua new file mode 100644 index 000000000..559380580 --- /dev/null +++ b/games/minimal/mods/testformspec/callbacks.lua @@ -0,0 +1,51 @@ +local callback_test = 0 + +local out = function(player, formname, fields, number) + local snum = "" + if number then + snum = " "..number + end + local msg = "Formspec callback"..snum..": player="..player:get_player_name()..", formname=\""..tostring(formname).."\", fields="..dump(fields) + minetest.chat_send_player(player:get_player_name(), msg) + minetest.log("action", msg) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if callback_test == 1 then + out(player, formname, fields) + elseif callback_test == 2 then + out(player, formname, fields, 1) + end +end) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if callback_test == 2 then + out(player, formname, fields, 2) + return true -- Disable the first callback + end +end) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if callback_test == 2 then + out(player, formname, fields, 3) + end +end) + +minetest.register_chatcommand("test_formspec_callbacks", { + params = "[ 0 | 1 | 2 ]", + description = "Test: Change formspec callbacks testing mode", + func = function(name, param) + local mode = tonumber(param) + if not mode then + callback_test = (callback_test + 1 % 3) + else + callback_test = mode + end + if callback_test == 1 then + minetest.chat_send_player(name, "Formspec callback test mode 1 enabled: Logging only") + elseif callback_test == 2 then + minetest.chat_send_player(name, "Formspec callback test mode 2 enabled: Three callbacks, disable pre-registered callbacks") + else + callback_test = 0 + minetest.chat_send_player(name, "Formspec callback test disabled!") + end + end +}) diff --git a/games/minimal/mods/testformspec/dummy_items.lua b/games/minimal/mods/testformspec/dummy_items.lua new file mode 100644 index 000000000..2037ae9cf --- /dev/null +++ b/games/minimal/mods/testformspec/dummy_items.lua @@ -0,0 +1,14 @@ +-- This code adds dummy items that are supposed to be used in formspecs +-- for testing item_image formspec elements. + +minetest.register_node("testformspec:node", { + description = "Formspec Test Node", + tiles = { "testformspec_node.png" }, + groups = { dig_immediate = 3, dummy = 1 }, +}) + +minetest.register_craftitem("testformspec:item", { + description = "Formspec Test Item", + inventory_image = "testformspec_item.png", + groups = { dummy = 1 }, +}) diff --git a/games/minimal/mods/testformspec/formspec.lua b/games/minimal/mods/testformspec/formspec.lua new file mode 100644 index 000000000..08c1b6dc0 --- /dev/null +++ b/games/minimal/mods/testformspec/formspec.lua @@ -0,0 +1,381 @@ +local color = minetest.colorize + +local clip_fs = [[ + style_type[label,button,image_button,item_image_button, + tabheader,scrollbar,table,animated_image + ,field,textarea,checkbox,dropdown;noclip=%c] + + label[0,0;A clipping test] + button[0,1;3,0.8;clip_button;A clipping test] + image_button[0,2;3,0.8;testformspec_button_image.png;clip_image_button;A clipping test] + item_image_button[0,3;3,0.8;testformspec:item;clip_item_image_button;A clipping test] + tabheader[0,4.7;3,0.63;clip_tabheader;Clip,Test,Text,Tabs;1;false;false] + field[0,5;3,0.8;clip_field;Title;] + textarea[0,6;3,1;clip_textarea;Title;] + checkbox[0,7.5;clip_checkbox;This is a test;true] + dropdown[0,8;3,0.8;clip_dropdown;Select An Item,One,Two,Three,Four,Five;1] + scrollbar[0,9;3,0.8;horizontal;clip_scrollbar;3] + tablecolumns[text;text] + table[0,10;3,1;clip_table;one,two,three,four;1] + animated_image[-0.5,11;4.5,1;clip_animated_image;testformspec_animation.png;4;100] +]] + +local tabheaders_fs = [[ + tabheader[0,0;10,0.63;tabs_opaque;Opaque,Without,Border;1;false;false] + tabheader[0,1;10,0.63;tabs_opaque_border;Opaque,With,Border;1;false;true] + tabheader[0,2;10,0.63;tabs_transparent;Transparent,Without,Border;1;true;false] + tabheader[0,3;10,0.63;tabs_transparent_border;Transparent,With,Border;1;true;true] + tabheader[0,4;tabs_default;Default,Tabs;1] + tabheader[0,6;10,0.5;tabs_size1;Height=0.5;1;false;false] + tabheader[2,6;10,0.75;tabs_size1;Height=0.75;1;false;false] + tabheader[4,6;10,1;tabs_size2;Height=1;1;false;false] + tabheader[6,6;10,1.25;tabs_size2;Height=1.25;1;false;false] + tabheader[8,6;10,1.5;tabs_size2;Height=1.5;1;false;false] +]] + +local hypertext_basic = [[ +Normal test +This is a normal text. + +style test + + . + + +Tag test +normal +mono +bold +italic +underlined +big +bigger +left +
center
+right +justify. Here comes a blind text: Lorem testum dolor sit amet consecutor celeron fiftifahivus e shadoninia e smalus jokus anrus relsocutoti rubenwardus. Erasputinus hara holisti dominus wusi. Grumarinsti erltusmuate ol fortitusti fla flo, blani burki e sfani fahif. Ultae ratii, e megus gigae don anonimus. Grinus dimondus krockus e nore. Endus finalus nowus comus endus o blindus tekstus. + +Custom tag test + + + + + +color=green +Action: color=green +Action: hovercolor=yellow +size=24 +font=mono +color=green font=mono size=24 + +action test +action + +img test +Normal: + +width=48 height=48: + +float=left: + +float=right: + + +item test +Normal: + +width=48 height=48 + +angle=30,0,0: + +angle=0,30,0: + +angle=0,0,30: + +rotate=yes: + +rotate=100,0,0: + +rotate=0,100,0: + +rotate=0,0,100: + +rotate=50,75,100: + +angle=-30,-45,90 rotate=100,150,-50: +]] + +local hypertext_global = [[ + +This is a test of the global tag. The parameters are: +background=gray margin=20 valign=bottom halign=right color=pink hovercolor=purple size=12 font=mono +action]] + +local hypertext_fs = "hypertext[0,0;11,9;hypertext;"..minetest.formspec_escape(hypertext_basic).."]".. + "hypertext[0,9.5;11,2.5;hypertext;"..minetest.formspec_escape(hypertext_global).."]" + +local style_fs = [[ + style[one_btn1;bgcolor=red;textcolor=yellow;bgcolor_hovered=orange; + bgcolor_pressed=purple] + button[0,0;2.5,0.8;one_btn1;Button] + + style[one_btn2;border=false;textcolor=cyan] ]].. + "button[0,1.05;2.5,0.8;one_btn2;Text " .. color("#FF0", "Yellow") .. [[] + + style[one_btn3;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png; + bgimg_pressed=testformspec_pressed.png] + button[0,2.1;1,1;one_btn3;Border] + + style[one_btn4;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png; + bgimg_pressed=testformspec_pressed.png;border=false] + button[1.25,2.1;1,1;one_btn4;NoBor] + + style[one_btn5;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png; + bgimg_pressed=testformspec_pressed.png;border=false;alpha=false] + button[0,3.35;1,1;one_btn5;Alph] + + style[one_btn6;border=true] + image_button[0,4.6;1,1;testformspec_button_image.png;one_btn6;Border] + + style[one_btn7;border=false] + image_button[1.25,4.6;1,1;testformspec_button_image.png;one_btn7;NoBor] + + style[one_btn8;border=false] + image_button[0,5.85;1,1;testformspec_button_image.png;one_btn8;Border;false;true;testformspec_pressed.png] + + style[one_btn9;border=true] + image_button[1.25,5.85;1,1;testformspec_button_image.png;one_btn9;NoBor;false;false;testformspec_pressed.png] + + style[one_btn10;alpha=false] + image_button[0,7.1;1,1;testformspec_button_image.png;one_btn10;NoAlpha] + + style[one_btn11;alpha=true] + image_button[1.25,7.1;1,1;testformspec_button_image.png;one_btn11;Alpha] + + style[one_btn12;border=true] + item_image_button[0,8.35;1,1;testformspec:item;one_btn12;Border] + + style[one_btn13;border=false] + item_image_button[1.25,8.35;1,1;testformspec:item;one_btn13;NoBor] + + style[one_btn14;border=false;bgimg=testformspec_bg.png;fgimg=testformspec_button_image.png] + style[one_btn14:hovered;bgimg=testformspec_bg_hovered.png;fgimg=testformspec_hovered.png;textcolor=yellow] + style[one_btn14:pressed;bgimg=testformspec_bg_pressed.png;fgimg=testformspec_pressed.png;textcolor=blue] + style[one_btn14:hovered+pressed;textcolor=purple] + image_button[0,9.6;1,1;testformspec_button_image.png;one_btn14;Bg] + + style[one_btn15;border=false;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png] + item_image_button[1.25,9.6;1,1;testformspec:item;one_btn15;Bg] + + style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_hovered=testformspec_bg_9slice_hovered.png;bgimg_pressed=testformspec_bg_9slice_pressed.png;bgimg_middle=4,6] + button[2.5,9.6;2,1;one_btn16;9-Slice Bg] + + + + container[2.75,0] + + style[one_tb1;textcolor=Yellow] + tabheader[0,3;2.5,0.63;one_tb1;Yellow,Text,Tabs;1;false;false] + + style[one_f1;textcolor=yellow] + field[0,4.25;2.5,0.8;one_f1;Field One;Yellow Text] + + style[one_f2;border=false;textcolor=cyan] + field[0,5.75;2.5,0.8;one_f2;Field Two;Borderless Cyan Text] + + style[one_f3;textcolor=yellow] + textarea[0,7.025;2.5,0.8;one_f3;Label;]] .. + minetest.formspec_escape("Yellow Text\nLine two") .. [[ ] + + style[one_f4;border=false;textcolor=cyan] + textarea[0,8.324999999999999;2.5,0.8;one_f4;Label;]] .. + minetest.formspec_escape("Borderless Cyan Text\nLine two") .. [[ ] + + container_end[] +]] + +local scroll_fs = + "button[8.5,1;4,1;outside;Outside of container]".. + "box[1,1;8,6;#00aa]".. + "scroll_container[1,1;8,6;scrbar;vertical]".. + "button[0,1;1,1;lorem;Lorem]".. + "button[0,10;1,1;ipsum;Ipsum]".. + "pwdfield[2,2;1,1;lorem2;Lorem]".. + "list[current_player;main;4,4;1,5;]".. + "box[2,5;3,2;#ffff00]".. + "image[1,10;3,2;testformspec_item.png]".. + "image[3,1;testformspec_item.png]".. + "item_image[2,6;3,2;testformspec:node]".. + "label[2,15;bla Bli\nfoo bar]".. + "item_image_button[2,3;1,1;testformspec:node;itemimagebutton;ItemImageButton]".. + "tooltip[0,11;3,2;Buz;#f00;#000]".. + "box[0,11;3,2;#00ff00]".. + "hypertext[3,13;3,3;;" .. hypertext_basic .. "]" .. + "container[0,18]".. + "box[1,2;3,2;#0a0a]".. + "scroll_container[1,2;3,2;scrbar2;horizontal;0.06]".. + "button[0,0;6,1;butnest;Nest]".. + "label[10,0.5;nest]".. + "scroll_container_end[]".. + "scrollbar[1,0;3.5,0.3;horizontal;scrbar2;0]".. + "container_end[]".. + "dropdown[0,6;2;hmdrpdwn;apple,bulb;1]".. + "image_button[0,4;2,2;testformspec_button_image.png;imagebutton;bbbbtt;false;true;testformspec_pressed.png]".. + "box[1,22.5;4,1;#a00a]".. + "scroll_container_end[]".. + "scrollbaroptions[max=170]".. -- lowest seen pos is: 0.1*170+6=23 (factor*max+height) + "scrollbar[7.5,0;0.3,4;vertical;scrbar;0]".. + "scrollbar[8,0;0.3,4;vertical;scrbarhmmm;0]".. + "dropdown[0,6;2;hmdrpdwnnn;Outside,of,container;1]" + +--style_type[label;textcolor=green] +--label[0,0;Green] +--style_type[label;textcolor=blue] +--label[0,1;Blue] +--style_type[label;textcolor=;border=true] +--label[1.2,0;Border] +--style_type[label;border=true;bgcolor=red] +--label[1.2,1;Background] +--style_type[label;border=;bgcolor=] +--label[0.75,2;Reset] + + +local pages = { + -- Real Coordinates + [[ + formspec_version[3] + size[12,13] + image_button[0,0;1,1;logo.png;rc_image_button_1x1;1x1] + image_button[1,0;2,2;logo.png;rc_image_button_2x2;2x2] + button[0,2;1,1;rc_button_1x1;1x1] + button[1,2;2,2;rc_button_2x2;2x2] + item_image[0,4;1,1;air] + item_image[1,4;2,2;air] + item_image_button[0,6;1,1;testformspec:node;rc_item_image_button_1x1;1x1] + item_image_button[1,6;2,2;testformspec:node;rc_item_image_button_2x2;2x2] + field[3,.5;3,.5;rc_field;Field;text] + pwdfield[6,.5;3,1;rc_pwdfield;Password Field] + field[3,1;3,1;;Read-Only Field;text] + textarea[3,2;3,.5;rc_textarea_small;Textarea;text] + textarea[6,2;3,2;rc_textarea_big;Textarea;text\nmore text] + textarea[3,3;3,1;;Read-Only Textarea;text\nmore text] + textlist[3,4;3,2;rc_textlist;Textlist,Perfect Coordinates;1;false] + tableoptions[highlight=#ABCDEF75;background=#00000055;border=false] + table[6,4;3,2;rc_table;Table,Cool Stuff,Foo,Bar;2] + dropdown[3,6;3,1;rc_dropdown_small;This,is,a,dropdown;1] + dropdown[6,6;3,2;rc_dropdown_big;I,am,a,bigger,dropdown;5] + image[0,8;3,2;ignore.png] + box[3,7;3,1;#00A3FF] + checkbox[3,8;rc_checkbox_1;Check me!;false] + checkbox[3,9;rc_checkbox_2;Uncheck me now!;true] + scrollbar[0,11.5;11.5,.5;horizontal;rc_scrollbar_horizontal;500] + scrollbar[11.5,0;.5,11.5;vertical;rc_scrollbar_vertical;0] + list[current_player;main;6,8;3,2;1] + button[9,0;2.5,1;rc_empty_button_1;] + button[9,1;2.5,1;rc_empty_button_2;] + button[9,2;2.5,1;rc_empty_button_3;] ]].. + "label[9,0.5;This is a label.\nLine\nLine\nLine\nEnd]".. + [[button[9,3;1,1;rc_empty_button_4;] + vertlabel[9,4;VERT] + label[10,3;HORIZ] + tabheader[8,0;6,0.65;rc_tabheader;Tab 1,Tab 2,Tab 3,Secrets;1;false;false] + ]], + -- Style + + "formspec_version[3]size[12,13]" .. + ("label[0.375,0.375;Styled - %s %s]"):format( + color("#F00", "red text"), + color("#77FF00CC", "green text")) .. + "label[6.375,0.375;Unstyled]" .. + "box[0,0.75;12,0.1;#999]" .. + "box[6,0.85;0.1,11.15;#999]" .. + "container[0.375,1.225]" .. + style_fs .. + "container_end[]container[6.375,1.225]" .. + style_fs:gsub("one_", "two_"):gsub("style%[[^%]]+%]", ""):gsub("style_type%[[^%]]+%]", "") .. + "container_end[]", + + -- Noclip + "formspec_version[3]size[12,13]" .. + "label[0.1,0.5;Clip]" .. + "container[-2.5,1]" .. clip_fs:gsub("%%c", "false") .. "container_end[]" .. + "label[11,0.5;Noclip]" .. + "container[11.5,1]" .. clip_fs:gsub("%%c", "true") .. "container_end[]", + + -- Hypertext + "size[12,13]real_coordinates[true]" .. + "container[0.5,0.5]" .. hypertext_fs .. "container_end[]", + + -- Tabheaders + "size[12,13]real_coordinates[true]" .. + "container[0.5,1.5]" .. tabheaders_fs .. "container_end[]", + + -- Animation + [[ + formspec_version[3] + size[12,13] + animated_image[0.5,0.5;1,1;;testformspec_animation.png;4;100] + animated_image[0.5,1.75;1,1;;testformspec_animation.jpg;4;100] + animated_image[1.75,0.5;1,1;;testformspec_animation.png;100;100] + animated_image[3,0.5;1,1;ani_img_1;testformspec_animation.png;4;1000] + button[4.25,0.5;1,1;ani_btn_1;Current +Number] + animated_image[3,1.75;1,1;ani_img_2;testformspec_animation.png;4;1000;2] + button[4.25,1.75;1,1;ani_btn_2;Current +Number] + animated_image[3,3;1,1;;testformspec_animation.png;4;0] + animated_image[3,4.25;1,1;;testformspec_animation.png;4;0;3] + animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100] + animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100] + ]], + + -- Scroll containers + "formspec_version[3]size[12,13]" .. + scroll_fs, +} + +local function show_test_formspec(pname, page_id) + page_id = page_id or 2 + + local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Anim,ScrollC;" .. page_id .. ";false;false]" + + minetest.show_formspec(pname, "testformspec:formspec", fs) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "testformspec:formspec" then + return false + end + + + if fields.maintabs then + show_test_formspec(player:get_player_name(), tonumber(fields.maintabs)) + return true + end + + if fields.ani_img_1 and fields.ani_btn_1 then + minetest.chat_send_player(player:get_player_name(), "ani_img_1 = " .. tostring(fields.ani_img_1)) + return true + elseif fields.ani_img_2 and fields.ani_btn_2 then + minetest.chat_send_player(player:get_player_name(), "ani_img_2 = " .. tostring(fields.ani_img_2)) + return true + end + + if fields.hypertext then + minetest.chat_send_player(player:get_player_name(), "Hypertext action received: " .. tostring(fields.hypertext)) + return true + end +end) + +minetest.register_chatcommand("test_formspec", { + params = "", + description = "Open the test formspec", + func = function(name) + if not minetest.get_player_by_name(name) then + return false, "You need to be online!" + end + + show_test_formspec(name) + return true + end, +}) diff --git a/games/minimal/mods/testformspec/init.lua b/games/minimal/mods/testformspec/init.lua new file mode 100644 index 000000000..23b565f08 --- /dev/null +++ b/games/minimal/mods/testformspec/init.lua @@ -0,0 +1,3 @@ +dofile(minetest.get_modpath("testformspec").."/dummy_items.lua") +dofile(minetest.get_modpath("testformspec").."/formspec.lua") +dofile(minetest.get_modpath("testformspec").."/callbacks.lua") diff --git a/games/minimal/mods/testformspec/mod.conf b/games/minimal/mods/testformspec/mod.conf new file mode 100644 index 000000000..00eac307a --- /dev/null +++ b/games/minimal/mods/testformspec/mod.conf @@ -0,0 +1,2 @@ +name = testformspec +description = Contains an example formspec to test all the features of formspecs diff --git a/games/minimal/mods/test/textures/test_animation.jpg b/games/minimal/mods/testformspec/textures/testformspec_animation.jpg similarity index 100% rename from games/minimal/mods/test/textures/test_animation.jpg rename to games/minimal/mods/testformspec/textures/testformspec_animation.jpg diff --git a/games/minimal/mods/testformspec/textures/testformspec_animation.png b/games/minimal/mods/testformspec/textures/testformspec_animation.png new file mode 100644 index 0000000000000000000000000000000000000000..b972e5dbbb6e6bfa4af0f88c5fd0b334f318672c GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*#0(_!gymU*6lZ`>h${obivR!r19|LCauq;| zu_VYZn8D%MjWi&q+SA1`q=K=xmyzvofPl;YL-Q7J7R|DCy3l%0!P58QJq5?&Q|G*O zG@aP{pX{HR>#oC6&&52$k^c|ZU+(w8FW$YKlXvCWo>Oozp)WsLIcn0|rbC({Qm-GXhFf1U%K!QkoY K=d#Wzp$P!m%}>Pu literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testformspec/textures/testformspec_bg.png b/games/minimal/mods/testformspec/textures/testformspec_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1e50900354b48dfeadd44e74fb2926399e96b4 GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|%APKcAr*|tGpzUaR!o^Kd!Auo phfCwXh0MznLk_QC<8ZZMVsJcTmus{sG#03w!PC{xWt~$(69C7B7{CAk literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testformspec/textures/testformspec_bg_9slice.png b/games/minimal/mods/testformspec/textures/testformspec_bg_9slice.png new file mode 100644 index 0000000000000000000000000000000000000000..34433ac82a89114e0be99fd1f2a9bd1bfdfd0a2e GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*Z=?j1DUzm@pGrQ1^S1s zuk85)zhDN3XE)M-979hR$B+ufWCbRUMGS0gZmG#C2`UE;WISnNnc~Rg<_;P7vKN@ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testformspec/textures/testformspec_bg_pressed.png b/games/minimal/mods/testformspec/textures/testformspec_bg_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb5fc21ecd7d0ac75f0bb293d91269c4fdc33f0 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|N}eu`Ar*|t1*PAV1Z?cV1 zTwv#+upOL-IAS#EHn8 zH+$IF7>^&1JaHn5ot=@9k>THa1{M}ZOG{=xpi;(?AirP+hi5m^fE-&-7srqa#$*R( zCnkYeCtVm136u#oa9JdZCI~ff8L%A;QE?76=rDK8ICp5Nz~yZ+2~6IGmCkFELmW2C ZGkh^&|C2f?B?f2^gQu&X%Q~loCIB4yG;06= literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testformspec/textures/testformspec_node.png b/games/minimal/mods/testformspec/textures/testformspec_node.png new file mode 100644 index 0000000000000000000000000000000000000000..c107f28a31020c89606f4e8b7882bac829aed00e GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|7M?DSAr*|t7cN}bQ5V}>F^RDw z-S@RB+tsVn7``^-G!$?wdb6gcgI6U(BGIhp7Q;gU7Y=C;uZIjfSQ2M{&S*XgG=ss@ L)z4*}Q$iB}*NP+k literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testformspec/textures/testformspec_pressed.png b/games/minimal/mods/testformspec/textures/testformspec_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..45c504f275aa726991eb2b327792aa2855187d37 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar*|t761Ngx=Q%u{MrA_ zUf{o?;D2|s2mH5_+x{E%t9Bkz*s5Tw!FE8UMeg&XLkX2DTqAfJG!L~qW_1`hG&Vlm zzhsFD$K+H7C*>yJdS;DpOh+3#PBYwcRrXzO%0!~fKjbhR!6hQvczTZG*f#{unS N@O1TaS?83{1OQtbI&%O3 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/README.md b/games/minimal/mods/testnodes/README.md new file mode 100644 index 000000000..13ed972c0 --- /dev/null +++ b/games/minimal/mods/testnodes/README.md @@ -0,0 +1,11 @@ +# Test Nodes + +This mod contains a bunch of basic nodes to test development stuff. +Most nodes are kept as minimal as possible in order to show off one particular feature of the engine, to make testing stuff easier. + +This mod includes tests for: + +* drawtypes +* paramtype2's +* node properties such as damage, drowning, falling, etc. +* other random stuff diff --git a/games/minimal/mods/testnodes/drawtypes.lua b/games/minimal/mods/testnodes/drawtypes.lua new file mode 100644 index 000000000..35fda960f --- /dev/null +++ b/games/minimal/mods/testnodes/drawtypes.lua @@ -0,0 +1,517 @@ +--[[ Drawtype Test: This file tests out and provides examples for +all drawtypes in Minetest. It is attempted to keep the node +definitions as simple and minimal as possible to keep +side-effects to a minimum. + +How to read the node definitions: +There are two parts which are separated by 2 newlines: +The first part contains the things that are more or less essential +for defining the drawtype (except description, which is +at the top for readability). +The second part (after the 2 newlines) contains stuff that are +unrelated to the drawtype, stuff that is mostly there to make +testing this node easier and more convenient. +]] + +local S = minetest.get_translator("testnodes") + +-- If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0. +-- This is due to . +-- This is only added to make the items more visible to avoid confusion, but you will no longer see +-- the default inventory images for these items. When you want to test the default inventory image of drawtypes, +-- this should be turned off. +-- TODO: Remove support for fallback inventory image as soon #9209 is fixed. +local SHOW_FALLBACK_IMAGE = minetest.settings:get_bool("testnodes_show_fallback_image", false) + +local fallback_image = function(img) + if SHOW_FALLBACK_IMAGE then + return img + else + return nil + end +end + +-- A regular cube +minetest.register_node("testnodes:normal", { + description = S("Normal Drawtype Test Node"), + drawtype = "normal", + tiles = { "testnodes_normal.png" }, + + groups = { dig_immediate = 3 }, +}) + +-- Standard glasslike node +minetest.register_node("testnodes:glasslike", { + description = S("Glasslike Drawtype Test Node"), + drawtype = "glasslike", + paramtype = "light", + tiles = { "testnodes_glasslike.png" }, + + groups = { dig_immediate = 3 }, +}) + +-- Glasslike framed with the two textures (normal and "detail") +minetest.register_node("testnodes:glasslike_framed", { + description = S("Glasslike Framed Drawtype Test Node"), + drawtype = "glasslike_framed", + paramtype = "light", + tiles = { + "testnodes_glasslike_framed.png", + "testnodes_glasslike_detail.png", + }, + + + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + +-- Like the one above, but without the "detail" texture (texture 2). +-- This node was added to see how the engine behaves when the "detail" texture +-- is missing. +minetest.register_node("testnodes:glasslike_framed_no_detail", { + description = S("Glasslike Framed without Detail Drawtype Test Node"), + drawtype = "glasslike_framed", + paramtype = "light", + tiles = { "testnodes_glasslike_framed2.png" }, + + + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + + +minetest.register_node("testnodes:glasslike_framed_optional", { + description = S("Glasslike Framed Optional Drawtype Test Node"), + drawtype = "glasslike_framed_optional", + paramtype = "light", + tiles = { + "testnodes_glasslike_framed_optional.png", + "testnodes_glasslike_detail.png", + }, + + + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + + + +minetest.register_node("testnodes:allfaces", { + description = S("Allfaces Drawtype Test Node"), + drawtype = "allfaces", + paramtype = "light", + tiles = { "testnodes_allfaces.png" }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:allfaces_optional", { + description = S("Allfaces Optional Drawtype Test Node"), + drawtype = "allfaces_optional", + paramtype = "light", + tiles = { "testnodes_allfaces_optional.png" }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:allfaces_optional_waving", { + description = S("Waving Allfaces Optional Drawtype Test Node"), + drawtype = "allfaces_optional", + paramtype = "light", + tiles = { "testnodes_allfaces_optional.png^[brighten" }, + waving = 2, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:firelike", { + description = S("Firelike Drawtype Test Node"), + drawtype = "firelike", + paramtype = "light", + tiles = { "testnodes_firelike.png" }, + + + walkable = false, + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:fencelike", { + description = S("Fencelike Drawtype Test Node"), + drawtype = "fencelike", + paramtype = "light", + tiles = { "testnodes_fencelike.png" }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:torchlike", { + description = S("Wallmounted Torchlike Drawtype Test Node"), + drawtype = "torchlike", + paramtype = "light", + paramtype2 = "wallmounted", + tiles = { + "testnodes_torchlike_floor.png", + "testnodes_torchlike_ceiling.png", + "testnodes_torchlike_wall.png", + }, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, + inventory_image = fallback_image("testnodes_torchlike_floor.png"), +}) + +minetest.register_node("testnodes:signlike", { + description = S("Wallmounted Signlike Drawtype Test Node"), + drawtype = "signlike", + paramtype = "light", + paramtype2 = "wallmounted", + tiles = { "testnodes_signlike.png" }, + + + walkable = false, + groups = { dig_immediate = 3 }, + sunlight_propagates = true, + inventory_image = fallback_image("testnodes_signlike.png"), +}) + +minetest.register_node("testnodes:plantlike", { + description = S("Plantlike Drawtype Test Node"), + drawtype = "plantlike", + paramtype = "light", + tiles = { "testnodes_plantlike.png" }, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:plantlike_waving", { + description = S("Waving Plantlike Drawtype Test Node"), + drawtype = "plantlike", + paramtype = "light", + tiles = { "testnodes_plantlike_waving.png" }, + waving = 1, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + + + +-- param2 will rotate +minetest.register_node("testnodes:plantlike_degrotate", { + description = S("Degrotate Plantlike Drawtype Test Node"), + drawtype = "plantlike", + paramtype = "light", + paramtype2 = "degrotate", + tiles = { "testnodes_plantlike_degrotate.png" }, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + +-- param2 will change height +minetest.register_node("testnodes:plantlike_leveled", { + description = S("Leveled Plantlike Drawtype Test Node"), + drawtype = "plantlike", + paramtype = "light", + paramtype2 = "leveled", + tiles = { + { name = "testnodes_plantlike_leveled.png", tileable_vertical = true }, + }, + + + -- We set a default param2 here only for convenience, to make the "plant" visible after placement + place_param2 = 8, + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + +-- param2 changes shape +minetest.register_node("testnodes:plantlike_meshoptions", { + description = S("Meshoptions Plantlike Drawtype Test Node"), + drawtype = "plantlike", + paramtype = "light", + paramtype2 = "meshoptions", + tiles = { "testnodes_plantlike_meshoptions.png" }, + + + walkable = false, + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:plantlike_rooted", { + description = S("Rooted Plantlike Drawtype Test Node"), + drawtype = "plantlike_rooted", + paramtype = "light", + tiles = { "testnodes_plantlike_rooted_base.png" }, + special_tiles = { "testnodes_plantlike_rooted.png" }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:plantlike_rooted_waving", { + description = S("Waving Rooted Plantlike Drawtype Test Node"), + drawtype = "plantlike_rooted", + paramtype = "light", + tiles = { + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base_side_waving.png", + }, + special_tiles = { "testnodes_plantlike_rooted_waving.png" }, + waving = 1, + + groups = { dig_immediate = 3 }, +}) + +-- param2 changes height +minetest.register_node("testnodes:plantlike_rooted_leveled", { + description = S("Leveled Rooted Plantlike Drawtype Test Node"), + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "leveled", + tiles = { + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base_side_leveled.png", + }, + special_tiles = { + { name = "testnodes_plantlike_rooted_leveled.png", tileable_vertical = true }, + }, + + + -- We set a default param2 here only for convenience, to make the "plant" visible after placement + place_param2 = 8, + groups = { dig_immediate = 3 }, +}) + +-- param2 changes shape +minetest.register_node("testnodes:plantlike_rooted_meshoptions", { + description = S("Meshoptions Rooted Plantlike Drawtype Test Node"), + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "meshoptions", + tiles = { + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base_side_meshoptions.png", + }, + special_tiles = { + "testnodes_plantlike_rooted_meshoptions.png", + }, + + groups = { dig_immediate = 3 }, +}) + +-- param2 changes rotation +minetest.register_node("testnodes:plantlike_rooted_degrotate", { + description = S("Degrotate Rooted Plantlike Drawtype Test Node"), + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "degrotate", + tiles = { + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base_side_degrotate.png", + }, + special_tiles = { + "testnodes_plantlike_rooted_degrotate.png", + }, + + groups = { dig_immediate = 3 }, +}) + +-- Demonstrative liquid nodes, source and flowing form. This is only the +-- drawtype, no physical liquid properties are used +minetest.register_node("testnodes:liquid", { + description = S("Source Liquid Drawtype Test Node"), + drawtype = "liquid", + paramtype = "light", + tiles = { + "testnodes_liquidsource.png", + }, + special_tiles = { + {name="testnodes_liquidsource.png", backface_culling=false}, + {name="testnodes_liquidsource.png", backface_culling=true}, + }, + use_texture_alpha = true, + + + walkable = false, + liquid_alternative_flowing = "testnodes:liquid_flowing", + liquid_alternative_source = "testnodes:liquid", + groups = { dig_immediate = 3 }, +}) +minetest.register_node("testnodes:liquid_flowing", { + description = S("Flowing Liquid Drawtype Test Node"), + drawtype = "flowingliquid", + paramtype = "light", + paramtype2 = "flowingliquid", + tiles = { + "testnodes_liquidflowing.png", + }, + special_tiles = { + {name="testnodes_liquidflowing.png", backface_culling=false}, + {name="testnodes_liquidflowing.png", backface_culling=false}, + }, + use_texture_alpha = true, + + + walkable = false, + liquid_alternative_flowing = "testnodes:liquid_flowing", + liquid_alternative_source = "testnodes:liquid", + groups = { dig_immediate = 3 }, +}) +minetest.register_node("testnodes:liquid_waving", { + description = S("Waving Source Liquid Drawtype Test Node"), + drawtype = "liquid", + paramtype = "light", + tiles = { + "testnodes_liquidsource.png^[brighten", + }, + special_tiles = { + {name="testnodes_liquidsource.png^[brighten", backface_culling=false}, + {name="testnodes_liquidsource.png^[brighten", backface_culling=true}, + }, + use_texture_alpha = true, + waving = 3, + + + walkable = false, + liquid_alternative_flowing = "testnodes:liquid_flowing", + liquid_alternative_source = "testnodes:liquid", + groups = { dig_immediate = 3 }, +}) +minetest.register_node("testnodes:liquid_flowing_waving", { + description = S("Waving Flowing Liquid Drawtype Test Node"), + drawtype = "flowingliquid", + paramtype = "light", + paramtype2 = "flowingliquid", + tiles = { + "testnodes_liquidflowing.png^[brighten", + }, + special_tiles = { + {name="testnodes_liquidflowing.png^[brighten", backface_culling=false}, + {name="testnodes_liquidflowing.png^[brighten", backface_culling=false}, + }, + use_texture_alpha = true, + waving = 3, + + + walkable = false, + liquid_alternative_flowing = "testnodes:liquid_flowing", + liquid_alternative_source = "testnodes:liquid", + groups = { dig_immediate = 3 }, +}) + + + +-- Invisible node +minetest.register_node("testnodes:airlike", { + description = S("Airlike Drawtype Test Node"), + drawtype = "airlike", + paramtype = "light", + + + walkable = false, + groups = { dig_immediate = 3 }, + sunlight_propagates = true, + inventory_image = fallback_image("testnodes_airlike.png"), +}) + +-- param2 changes liquid height +minetest.register_node("testnodes:glassliquid", { + description = S("Glasslike Liquid Level Drawtype Test Node"), + drawtype = "glasslike_framed", + paramtype = "light", + paramtype2 = "glasslikeliquidlevel", + tiles = { + "testnodes_glasslikeliquid.png", + }, + special_tiles = { + "testnodes_liquid.png", + }, + + groups = { dig_immediate = 3 }, +}) + +-- Adding many raillike examples, primarily to demonstrate the behavior of +-- "raillike groups". Nodes of the same type (rail, groupless, line, street) +-- should connect to nodes of the same "rail type" (=same shape, different +-- color) only. +local rails = { + { "rail", {"testnodes_rail_straight.png", "testnodes_rail_curved.png", "testnodes_rail_t_junction.png", "testnodes_rail_crossing.png"} }, + { "line", {"testnodes_line_straight.png", "testnodes_line_curved.png", "testnodes_line_t_junction.png", "testnodes_line_crossing.png"}, }, + { "street", {"testnodes_street_straight.png", "testnodes_street_curved.png", "testnodes_street_t_junction.png", "testnodes_street_crossing.png"}, }, + -- the "groupless" nodes are nodes in which the "connect_to_raillike" group is not set + { "groupless", {"testnodes_rail2_straight.png", "testnodes_rail2_curved.png", "testnodes_rail2_t_junction.png", "testnodes_rail2_crossing.png"} }, +} +local colors = { "", "cyan", "red" } + +for r=1, #rails do + local id = rails[r][1] + local tiles = rails[r][2] + local raillike_group + if id ~= "groupless" then + raillike_group = minetest.raillike_group(id) + end + for c=1, #colors do + local color + if colors[c] ~= "" then + color = colors[c] + end + minetest.register_node("testnodes:raillike_"..id..c, { + description = S("Raillike Drawtype Test Node: @1 @2", id, c), + drawtype = "raillike", + paramtype = "light", + tiles = tiles, + groups = { connect_to_raillike = raillike_group, dig_immediate = 3 }, + + + color = color, + selection_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4, 0.5}}, + }, + sunlight_propagates = true, + walkable = false, + }) + end +end + + + +-- Add visual_scale variants of previous nodes for half and double size +local scale = function(subname, desc_double, desc_half) + local original = "testnodes:"..subname + local def = table.copy(minetest.registered_items[original]) + def.visual_scale = 2.0 + def.description = desc_double + minetest.register_node("testnodes:"..subname.."_double", def) + def = table.copy(minetest.registered_items[original]) + def.visual_scale = 0.5 + def.description = desc_half + minetest.register_node("testnodes:"..subname.."_half", def) +end + +scale("plantlike", + S("Double-sized Plantlike Drawtype Test Node"), + S("Half-sized Plantlike Drawtype Test Node")) +scale("torchlike", + S("Double-sized Wallmounted Torchlike Drawtype Test Node"), + S("Half-sized Wallmounted Torchlike Drawtype Test Node")) +scale("signlike", + S("Double-sized Wallmounted Signlike Drawtype Test Node"), + S("Half-sized Wallmounted Signlike Drawtype Test Node")) +scale("firelike", + S("Double-sized Firelike Drawtype Test Node"), + S("Half-sized Firelike Drawtype Test Node")) diff --git a/games/minimal/mods/testnodes/init.lua b/games/minimal/mods/testnodes/init.lua new file mode 100644 index 000000000..92e2c5630 --- /dev/null +++ b/games/minimal/mods/testnodes/init.lua @@ -0,0 +1,10 @@ +local path = minetest.get_modpath(minetest.get_current_modname()) + +dofile(path.."/drawtypes.lua") +dofile(path.."/meshes.lua") +dofile(path.."/nodeboxes.lua") +dofile(path.."/param2.lua") +dofile(path.."/properties.lua") +dofile(path.."/liquids.lua") +dofile(path.."/light.lua") +dofile(path.."/textures.lua") diff --git a/games/minimal/mods/testnodes/light.lua b/games/minimal/mods/testnodes/light.lua new file mode 100644 index 000000000..94409e83f --- /dev/null +++ b/games/minimal/mods/testnodes/light.lua @@ -0,0 +1,48 @@ +-- Test Nodes: Light test + +local S = minetest.get_translator("testnodes") + +-- All possible light levels +for i=1, minetest.LIGHT_MAX do + minetest.register_node("testnodes:light"..i, { + description = S("Light Source (@1)", i), + paramtype = "light", + light_source = i, + + + tiles ={"testnodes_light_"..i..".png"}, + drawtype = "glasslike", + walkable = false, + sunlight_propagates = true, + is_ground_content = false, + groups = {dig_immediate=3}, + }) +end + +-- Lets light through, but not sunlight, leading to a +-- reduction in light level when light passes through +minetest.register_node("testnodes:sunlight_filter", { + description = S("Sunlight Filter"), + paramtype = "light", + + + drawtype = "glasslike", + tiles = { + "testnodes_sunlight_filter.png", + }, + groups = { dig_immediate = 3 }, +}) + +-- Lets light and sunlight through without obstruction +minetest.register_node("testnodes:sunlight_propagator", { + description = S("Sunlight Propagator"), + paramtype = "light", + sunlight_propagates = true, + + + drawtype = "glasslike", + tiles = { + "testnodes_sunlight_filter.png^[brighten", + }, + groups = { dig_immediate = 3 }, +}) diff --git a/games/minimal/mods/testnodes/liquids.lua b/games/minimal/mods/testnodes/liquids.lua new file mode 100644 index 000000000..e316782ad --- /dev/null +++ b/games/minimal/mods/testnodes/liquids.lua @@ -0,0 +1,91 @@ +-- Add liquids for ranges and viscosity levels 0-8 + +for d=0, 8 do + minetest.register_node("testnodes:rliquid_"..d, { + description = "Test Liquid Source, Range "..d, + drawtype = "liquid", + tiles = {"testnodes_liquidsource_r"..d..".png"}, + special_tiles = { + {name = "testnodes_liquidsource_r"..d..".png", backface_culling = false}, + {name = "testnodes_liquidsource_r"..d..".png", backface_culling = true}, + }, + alpha = 192, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + liquidtype = "source", + liquid_alternative_flowing = "testnodes:rliquid_flowing_"..d, + liquid_alternative_source = "testnodes:rliquid_"..d, + liquid_range = d, + }) + + minetest.register_node("testnodes:rliquid_flowing_"..d, { + description = "Flowing Test Liquid, Range "..d, + drawtype = "flowingliquid", + tiles = {"testnodes_liquidflowing_r"..d..".png"}, + special_tiles = { + {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, + {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, + }, + alpha = 192, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + liquidtype = "flowing", + liquid_alternative_flowing = "testnodes:rliquid_flowing_"..d, + liquid_alternative_source = "testnodes:rliquid_"..d, + liquid_range = d, + }) + + local mod = "^[colorize:#000000:127" + minetest.register_node("testnodes:vliquid_"..d, { + description = "Test Liquid Source, Viscosity "..d, + drawtype = "liquid", + tiles = {"testnodes_liquidsource_r"..d..".png"..mod}, + special_tiles = { + {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false}, + {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true}, + }, + alpha = 192, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + liquidtype = "source", + liquid_alternative_flowing = "testnodes:vliquid_flowing_"..d, + liquid_alternative_source = "testnodes:vliquid_"..d, + liquid_viscosity = d, + }) + + minetest.register_node("testnodes:vliquid_flowing_"..d, { + description = "Flowing Test Liquid, Viscosity "..d, + drawtype = "flowingliquid", + tiles = {"testnodes_liquidflowing_r"..d..".png"..mod}, + special_tiles = { + {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, + {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, + }, + alpha = 192, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + liquidtype = "flowing", + liquid_alternative_flowing = "testnodes:vliquid_flowing_"..d, + liquid_alternative_source = "testnodes:vliquid_"..d, + liquid_viscosity = d, + }) + +end diff --git a/games/minimal/mods/testnodes/meshes.lua b/games/minimal/mods/testnodes/meshes.lua new file mode 100644 index 000000000..900abc180 --- /dev/null +++ b/games/minimal/mods/testnodes/meshes.lua @@ -0,0 +1,145 @@ +-- Meshes + +local S = minetest.get_translator("testnodes") + +local ocorner_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.25, 0, 0.5}, + {-0.5, 0, 0, 0, 0.25, 0.5}, + {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5} + } +} + +local tall_pyr_cbox = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }, + { -0.375, -0.25, -0.375, 0.375, 0, 0.375}, + { -0.25, 0, -0.25, 0.25, 0.25, 0.25}, + { -0.125, 0.25, -0.125, 0.125, 0.5, 0.125} + } +} + +-- Normal mesh +minetest.register_node("testnodes:mesh", { + description = S("Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes2.png"}, + paramtype = "light", + collision_box = tall_pyr_cbox, + + groups = {dig_immediate=3}, +}) + +-- Facedir mesh: outer corner slope +minetest.register_node("testnodes:mesh_facedir", { + description = S("Facedir Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_ocorner.obj", + tiles = {"testnodes_mesh_stripes.png"}, + paramtype = "light", + paramtype2 = "facedir", + collision_box = ocorner_cbox, + + groups = {dig_immediate=3}, +}) + +minetest.register_node("testnodes:mesh_colorfacedir", { + description = S("Color Facedir Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_ocorner.obj", + tiles = {"testnodes_mesh_stripes3.png"}, + paramtype = "light", + paramtype2 = "colorfacedir", + palette = "testnodes_palette_facedir.png", + collision_box = ocorner_cbox, + + groups = {dig_immediate=3}, +}) + +-- Wallmounted mesh: pyramid +minetest.register_node("testnodes:mesh_wallmounted", { + description = S("Wallmounted Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes2.png"}, + paramtype = "light", + paramtype2 = "wallmounted", + collision_box = tall_pyr_cbox, + + groups = {dig_immediate=3}, +}) + +minetest.register_node("testnodes:mesh_colorwallmounted", { + description = S("Color Wallmounted Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes3.png"}, + paramtype = "light", + paramtype2 = "colorwallmounted", + palette = "testnodes_palette_wallmounted.png", + collision_box = tall_pyr_cbox, + + groups = {dig_immediate=3}, +}) + + +minetest.register_node("testnodes:mesh_double", { + description = S("Double-sized Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes2.png"}, + paramtype = "light", + collision_box = tall_pyr_cbox, + visual_scale = 2, + + groups = {dig_immediate=3}, +}) +minetest.register_node("testnodes:mesh_half", { + description = S("Half-sized Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes2.png"}, + paramtype = "light", + collision_box = tall_pyr_cbox, + visual_scale = 0.5, + + groups = {dig_immediate=3}, +}) + +minetest.register_node("testnodes:mesh_waving1", { + description = S("Plantlike-waving Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes4.png^[multiply:#B0FFB0"}, + paramtype = "light", + collision_box = tall_pyr_cbox, + waving = 1, + + groups = {dig_immediate=3}, +}) +minetest.register_node("testnodes:mesh_waving2", { + description = S("Leaflike-waving Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes4.png^[multiply:#FFFFB0"}, + paramtype = "light", + collision_box = tall_pyr_cbox, + waving = 2, + + groups = {dig_immediate=3}, +}) +minetest.register_node("testnodes:mesh_waving3", { + description = S("Liquidlike-waving Mesh Test Node"), + drawtype = "mesh", + mesh = "testnodes_pyramid.obj", + tiles = {"testnodes_mesh_stripes4.png^[multiply:#B0B0FF"}, + paramtype = "light", + collision_box = tall_pyr_cbox, + waving = 3, + + groups = {dig_immediate=3}, +}) diff --git a/games/minimal/mods/testnodes/mod.conf b/games/minimal/mods/testnodes/mod.conf new file mode 100644 index 000000000..4824c6ed0 --- /dev/null +++ b/games/minimal/mods/testnodes/mod.conf @@ -0,0 +1,2 @@ +name = testnodes +description = Contains a bunch of basic example nodes for demonstrative purposes, development and testing diff --git a/games/minimal/mods/testnodes/models/testnodes_ocorner.obj b/games/minimal/mods/testnodes/models/testnodes_ocorner.obj new file mode 100644 index 000000000..231d7056b --- /dev/null +++ b/games/minimal/mods/testnodes/models/testnodes_ocorner.obj @@ -0,0 +1,23 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.blend' +# www.blender.org +o Cube_Cube.002 +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 +v 0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.707100 0.707100 0.000000 +vn 0.000000 0.707100 -0.707100 +s off +f 3/1/1 2/2/1 4/3/1 5/4/1 +f 1/2/2 3/3/2 5/4/2 +f 1/1/3 2/3/3 3/4/3 +f 1/1/4 4/3/4 2/4/4 +f 1/2/5 5/3/5 4/4/5 diff --git a/games/minimal/mods/testnodes/models/testnodes_pyramid.obj b/games/minimal/mods/testnodes/models/testnodes_pyramid.obj new file mode 100644 index 000000000..b305af2f8 --- /dev/null +++ b/games/minimal/mods/testnodes/models/testnodes_pyramid.obj @@ -0,0 +1,24 @@ +# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_onetexture.blend' +# www.blender.org +o Cube +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 +v -0.000000 0.500000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.894400 0.447200 -0.000000 +vn 0.000000 0.447200 -0.894400 +vn 0.894400 0.447200 0.000000 +vn -0.000000 0.447200 0.894400 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 3/4/2 5/5/2 4/3/2 +f 5/5/3 1/3/3 4/4/3 +f 1/4/4 5/5/4 2/3/4 +f 2/4/5 5/5/5 3/3/5 diff --git a/games/minimal/mods/testnodes/nodeboxes.lua b/games/minimal/mods/testnodes/nodeboxes.lua new file mode 100644 index 000000000..ebd858337 --- /dev/null +++ b/games/minimal/mods/testnodes/nodeboxes.lua @@ -0,0 +1,80 @@ +local S = minetest.get_translator("testnodes") + +-- Nodebox examples and tests. + +-- An simple example nodebox with one centered box +minetest.register_node("testnodes:nodebox_fixed", { + description = S("Fixed Nodebox Test Node"), + tiles = {"testnodes_nodebox.png"}, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + }, + + groups = {dig_immediate=3}, +}) + +-- 50% higher than a regular node +minetest.register_node("testnodes:nodebox_overhigh", { + description = S("Overhigh Nodebox Test Node"), + tiles = {"testnodes_nodebox.png"}, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 1, 0.5}, + }, + + groups = {dig_immediate=3}, +}) + +-- 100% higher than a regular node +minetest.register_node("testnodes:nodebox_overhigh2", { + description = S("Double-height Nodebox Test Node"), + tiles = {"testnodes_nodebox.png"}, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}, + }, + + groups = {dig_immediate=3}, +}) + +-- Height of nodebox changes with its param2 value +minetest.register_node("testnodes:nodebox_leveled", { + description = S("Leveled Nodebox Test Node"), + tiles = {"testnodes_nodebox.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "leveled", + node_box = { + type = "leveled", + fixed = {-0.5, 0.0, -0.5, 0.5, -0.499, 0.5}, + }, + + groups = {dig_immediate=3}, +}) + +-- Wall-like nodebox that connects to neighbors +minetest.register_node("testnodes:nodebox_connected", { + description = S("Connected Nodebox Test Node"), + tiles = {"testnodes_nodebox.png"}, + groups = {connected_nodebox=1, dig_immediate=3}, + drawtype = "nodebox", + paramtype = "light", + connects_to = {"group:connected_nodebox"}, + connect_sides = {"front", "back", "left", "right"}, + node_box = { + type = "connected", + fixed = {-0.125, -0.500, -0.125, 0.125, 0.500, 0.125}, + connect_front = {-0.125, -0.500, -0.500, 0.125, 0.400, -0.125}, + connect_back = {-0.125, -0.500, 0.125, 0.125, 0.400, 0.500}, + connect_left = {-0.500, -0.500, -0.125, -0.125, 0.400, 0.125}, + connect_right = {0.125, -0.500, -0.125, 0.500, 0.400, 0.125}, + }, +}) + diff --git a/games/minimal/mods/testnodes/param2.lua b/games/minimal/mods/testnodes/param2.lua new file mode 100644 index 000000000..5d64376fa --- /dev/null +++ b/games/minimal/mods/testnodes/param2.lua @@ -0,0 +1,168 @@ +-- This file is for misc. param2 tests that aren't covered in drawtypes.lua already. + +local S = minetest.get_translator("testnodes") + +minetest.register_node("testnodes:facedir", { + description = S("Facedir Test Node"), + paramtype2 = "facedir", + tiles = { + "testnodes_1.png", + "testnodes_2.png", + "testnodes_3.png", + "testnodes_4.png", + "testnodes_5.png", + "testnodes_6.png", + }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:facedir_nodebox", { + description = S("Facedir Nodebox Test Node"), + tiles = { + "testnodes_1.png", + "testnodes_2.png", + "testnodes_3.png", + "testnodes_4.png", + "testnodes_5.png", + "testnodes_6.png", + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.2, 0.2, 0.2}, + }, + + groups = {dig_immediate=3}, +}) + +minetest.register_node("testnodes:wallmounted", { + description = S("Wallmounted Test Node"), + paramtype2 = "wallmounted", + tiles = { + "testnodes_1w.png", + "testnodes_2w.png", + "testnodes_3w.png", + "testnodes_4w.png", + "testnodes_5w.png", + "testnodes_6w.png", + }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:wallmounted_nodebox", { + description = S("Wallmounted Nodebox Test Node"), + paramtype2 = "wallmounted", + paramtype = "light", + tiles = { + "testnodes_1w.png", + "testnodes_2w.png", + "testnodes_3w.png", + "testnodes_4w.png", + "testnodes_5w.png", + "testnodes_6w.png", + }, + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_top = { -0.5, 0, -0.5, 0.5, 0.5, 0.5 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, + wall_side = { -0.5, -0.5, -0.5, 0, 0.5, 0.5 }, + }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:color", { + description = S("Color Test Node"), + paramtype2 = "color", + palette = "testnodes_palette_full.png", + tiles = { + "testnodes_node.png", + }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:colorfacedir", { + description = S("Color Facedir Test Node"), + paramtype2 = "colorfacedir", + palette = "testnodes_palette_facedir.png", + tiles = { + "testnodes_1g.png", + "testnodes_2g.png", + "testnodes_3g.png", + "testnodes_4g.png", + "testnodes_5g.png", + "testnodes_6g.png", + }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:colorfacedir_nodebox", { + description = S("Color Facedir Nodebox Test Node"), + tiles = { + "testnodes_1g.png", + "testnodes_2g.png", + "testnodes_3g.png", + "testnodes_4g.png", + "testnodes_5g.png", + "testnodes_6g.png", + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "colorfacedir", + palette = "testnodes_palette_facedir.png", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.2, 0.2, 0.2}, + }, + + groups = {dig_immediate=3}, +}) + +minetest.register_node("testnodes:colorwallmounted", { + description = S("Color Wallmounted Test Node"), + paramtype2 = "colorwallmounted", + paramtype = "light", + palette = "testnodes_palette_wallmounted.png", + tiles = { + "testnodes_1wg.png", + "testnodes_2wg.png", + "testnodes_3wg.png", + "testnodes_4wg.png", + "testnodes_5wg.png", + "testnodes_6wg.png", + }, + + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:colorwallmounted_nodebox", { + description = S("Color Wallmounted Nodebox Test Node"), + paramtype2 = "colorwallmounted", + paramtype = "light", + palette = "testnodes_palette_wallmounted.png", + tiles = { + "testnodes_1wg.png", + "testnodes_2wg.png", + "testnodes_3wg.png", + "testnodes_4wg.png", + "testnodes_5wg.png", + "testnodes_6wg.png", + }, + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_top = { -0.5, 0, -0.5, 0.5, 0.5, 0.5 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, + wall_side = { -0.5, -0.5, -0.5, 0, 0.5, 0.5 }, + }, + + groups = { dig_immediate = 3 }, +}) + diff --git a/games/minimal/mods/testnodes/properties.lua b/games/minimal/mods/testnodes/properties.lua new file mode 100644 index 000000000..e169d4b08 --- /dev/null +++ b/games/minimal/mods/testnodes/properties.lua @@ -0,0 +1,270 @@ +-- Test Nodes: Node property tests + +local S = minetest.get_translator("testnodes") + +-- Is supposed to fall when it doesn't rest on solid ground +minetest.register_node("testnodes:falling", { + description = S("Falling Node"), + tiles = { + "testnodes_node.png", + "testnodes_node.png", + "testnodes_node_falling.png", + }, + groups = { falling_node = 1, dig_immediate = 3 }, +}) + +-- Same as falling node, but will stop falling on top of liquids +minetest.register_node("testnodes:falling_float", { + description = S("Falling+Floating Node"), + groups = { falling_node = 1, float = 1, dig_immediate = 3 }, + + + tiles = { + "testnodes_node.png", + "testnodes_node.png", + "testnodes_node_falling.png", + }, + color = "cyan", +}) + +-- This node attaches to the floor and drops as item +-- when the floor is gone. +minetest.register_node("testnodes:attached", { + description = S("Floor-Attached Node"), + tiles = { + "testnodes_attached_top.png", + "testnodes_attached_bottom.png", + "testnodes_attached_side.png", + }, + groups = { attached_node = 1, dig_immediate = 3 }, +}) + +-- This node attaches to the side of a node and drops as item +-- when the node it attaches to is gone. +minetest.register_node("testnodes:attached_wallmounted", { + description = S("Wallmounted Attached Node"), + paramtype2 = "wallmounted", + tiles = { + "testnodes_attachedw_top.png", + "testnodes_attachedw_bottom.png", + "testnodes_attachedw_side.png", + }, + groups = { attached_node = 1, dig_immediate = 3 }, +}) + +-- Jump disabled +minetest.register_node("testnodes:nojump", { + description = S("Non-jumping Node"), + groups = {disable_jump=1, dig_immediate=3}, + + + tiles = {"testnodes_nojump_top.png", "testnodes_nojump_side.png"}, +}) + +-- Climbable up and down with jump and sneak keys +minetest.register_node("testnodes:climbable", { + description = S("Climbable Node"), + climbable = true, + walkable = false, + + + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + tiles ={"testnodes_climbable_side.png"}, + drawtype = "glasslike", + groups = {dig_immediate=3}, +}) + +-- Climbable only downwards with sneak key +minetest.register_node("testnodes:climbable_nojump", { + description = S("Downwards-climbable Node"), + climbable = true, + walkable = false, + + groups = {disable_jump=1, dig_immediate=3}, + drawtype = "glasslike", + tiles ={"testnodes_climbable_nojump_side.png"}, + paramtype = "light", + sunlight_propagates = true, +}) + +-- A liquid in which you can't rise +minetest.register_node("testnodes:liquid_nojump", { + description = S("Non-jumping Liquid Source Node"), + liquidtype = "source", + liquid_range = 1, + liquid_viscosity = 0, + liquid_alternative_flowing = "testnodes:liquidflowing_nojump", + liquid_alternative_source = "testnodes:liquid_nojump", + liquid_renewable = false, + groups = {disable_jump=1, dig_immediate=3}, + walkable = false, + + drawtype = "liquid", + tiles = {"testnodes_liquidsource.png^[colorize:#FF0000:127"}, + special_tiles = { + {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = false}, + {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = true}, + }, + use_texture_alpha = true, + paramtype = "light", + pointable = false, + liquids_pointable = true, + diggable = false, + buildable_to = true, + is_ground_content = false, + post_effect_color = {a = 70, r = 255, g = 0, b = 200}, +}) + +-- A liquid in which you can't rise (flowing variant) +minetest.register_node("testnodes:liquidflowing_nojump", { + description = S("Non-jumping Flowing Liquid Node"), + liquidtype = "flowing", + liquid_range = 1, + liquid_viscosity = 0, + liquid_alternative_flowing = "testnodes:liquidflowing_nojump", + liquid_alternative_source = "testnodes:liquid_nojump", + liquid_renewable = false, + groups = {disable_jump=1, dig_immediate=3}, + walkable = false, + + + drawtype = "flowingliquid", + tiles = {"testnodes_liquidflowing.png^[colorize:#FF0000:127"}, + special_tiles = { + {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, + {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, + }, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "flowingliquid", + pointable = false, + liquids_pointable = true, + diggable = false, + buildable_to = true, + is_ground_content = false, + post_effect_color = {a = 70, r = 255, g = 0, b = 200}, +}) + +-- Nodes that modify fall damage (various damage modifiers) +for i=-100, 100, 25 do + if i ~= 0 then + local subname, descnum + if i < 0 then + subname = "m"..math.abs(i) + descnum = tostring(i) + else + subname = tostring(i) + descnum = S("+@1", i) + end + local tex, color, desc + if i > 0 then + local val = math.floor((i/100)*255) + tex = "testnodes_fall_damage_plus.png" + color = { b=0, g=255-val, r=255, a=255 } + desc = S("Fall Damage Node (+@1%)", i) + else + tex = "testnodes_fall_damage_minus.png" + if i == -100 then + color = { r=0, b=0, g=255, a=255 } + else + local val = math.floor((math.abs(i)/100)*255) + color = { r=0, b=255, g=255-val, a=255 } + end + desc = S("Fall Damage Node (-@1%)", math.abs(i)) + end + minetest.register_node("testnodes:damage"..subname, { + description = desc, + groups = {fall_damage_add_percent=i, dig_immediate=3}, + + + tiles = { tex }, + is_ground_content = false, + color = color, + }) + end +end + +-- Bouncy nodes (various bounce levels) +for i=20, 180, 20 do + local val = math.floor(((i-20)/200)*255) + minetest.register_node("testnodes:bouncy"..i, { + description = S("Bouncy Node (@1%)", i), + groups = {bouncy=i, dig_immediate=3}, + + + tiles ={"testnodes_bouncy.png"}, + is_ground_content = false, + color = { r=255, g=255-val, b=val, a=255 }, + }) +end + +-- Slippery nodes (various slippery levels) +for i=1, 5 do + minetest.register_node("testnodes:slippery"..i, { + description = S("Slippery Node (@1)", i), + tiles ={"testnodes_slippery.png"}, + is_ground_content = false, + groups = {slippery=i, dig_immediate=3}, + color = { r=0, g=255, b=math.floor((i/5)*255), a=255 }, + }) +end + +-- By placing something on the node, the node itself will be replaced +minetest.register_node("testnodes:buildable_to", { + description = S("Replacable Node"), + buildable_to = true, + tiles = {"testnodes_buildable_to.png"}, + is_ground_content = false, + groups = {dig_immediate=3}, +}) + +-- Nodes that deal damage to players that are inside them. +-- Negative damage nodes should heal. +for d=-3,3 do + if d ~= 0 then + local sub, tile + if d > 0 then + sub = tostring(d) + tile = "testnodes_damage.png" + else + sub = "m" .. tostring(math.abs(d)) + tile = "testnodes_damage_neg.png" + end + if math.abs(d) == 2 then + tile = tile .. "^[colorize:#000000:70" + elseif math.abs(d) == 3 then + tile = tile .. "^[colorize:#000000:140" + end + minetest.register_node("testnodes:damage_"..sub, { + description = S("Damage Node (@1 damage per second)", d), + damage_per_second = d, + + + walkable = false, + is_ground_content = false, + drawtype = "allfaces", + paramtype = "light", + sunlight_propagates = true, + tiles = { tile }, + groups = {dig_immediate=3}, + }) + end +end + +-- Causes drowning damage +minetest.register_node("testnodes:drowning_1", { + description = S("Drowning Node (@1 damage)", 1), + drowning = 1, + + + walkable = false, + is_ground_content = false, + drawtype = "allfaces", + paramtype = "light", + sunlight_propagates = true, + tiles = { "testnodes_drowning.png" }, + groups = {dig_immediate=3}, +}) + diff --git a/games/minimal/mods/testnodes/settingtypes.txt b/games/minimal/mods/testnodes/settingtypes.txt new file mode 100644 index 000000000..7f753bf3e --- /dev/null +++ b/games/minimal/mods/testnodes/settingtypes.txt @@ -0,0 +1,4 @@ +# If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0. +# This is due to . +# This is only added to make the items more visible to avoid confusion, but you will no longer see the default inventory images for these items. When you want to test the default inventory image of drawtypes, this should be turned off. +testnodes_show_fallback_image (Use fallback inventory images) bool false diff --git a/games/minimal/mods/testnodes/textures.lua b/games/minimal/mods/testnodes/textures.lua new file mode 100644 index 000000000..f5db9ccbf --- /dev/null +++ b/games/minimal/mods/testnodes/textures.lua @@ -0,0 +1,67 @@ +-- Node texture tests + +local S = minetest.get_translator("testnodes") + +minetest.register_node("testnodes:6sides", { + description = S("Six Textures Test Node"), + tiles = { + "testnodes_normal1.png", + "testnodes_normal2.png", + "testnodes_normal3.png", + "testnodes_normal4.png", + "testnodes_normal5.png", + "testnodes_normal6.png", + }, + + groups = { dig_immediate = 2 }, +}) + +minetest.register_node("testnodes:anim", { + description = S("Animated Test Node"), + tiles = { + { name = "testnodes_anim.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 4.0, + }, }, + }, + + groups = { dig_immediate = 2 }, +}) + +-- Node texture transparency test + +local alphas = { 64, 128, 191 } + +for a=1,#alphas do + local alpha = alphas[a] + + -- Transparency taken from texture + minetest.register_node("testnodes:alpha_texture_"..alpha, { + description = S("Texture Alpha Test Node (@1)", alpha), + drawtype = "glasslike", + paramtype = "light", + tiles = { + "testnodes_alpha"..alpha..".png", + }, + use_texture_alpha = true, + + groups = { dig_immediate = 3 }, + }) + + -- Transparency set via "alpha" parameter + minetest.register_node("testnodes:alpha_"..alpha, { + description = S("Alpha Test Node (@1)", alpha), + -- It seems that only the liquid drawtype supports the alpha parameter + drawtype = "liquid", + paramtype = "light", + tiles = { + "testnodes_alpha.png", + }, + alpha = alpha, + + groups = { dig_immediate = 3 }, + }) +end diff --git a/games/minimal/mods/testnodes/textures/testnodes_1.png b/games/minimal/mods/testnodes/textures/testnodes_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6730997e2db9623daa1bb458e2b2a7e9156a8093 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9>;Dfx76a#Wr#K*`;OXKR zQo)$)(7@()tcqf?4)78&qol`;+04y{Z AZ2$lO literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_1g.png b/games/minimal/mods/testnodes/textures/testnodes_1g.png new file mode 100644 index 0000000000000000000000000000000000000000..529298ece1d50bbfab913ac99e6a68c388d8bc0a GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|`kpS1Ar*|t72Zk`4!k@(JU5OO zu2gemcF}a?<+!S1o#~R5;J|vtLyE_RxhRK$LGwo;+lH)}tU#>{p00i_>zopr04(np A-v9sr literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_1w.png b/games/minimal/mods/testnodes/textures/testnodes_1w.png new file mode 100644 index 0000000000000000000000000000000000000000..d24e571cc90265d6dd09a15d3e8cb20bde91745a GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|4xTQKAr*{g&oZ(da1e1mxbuHz zb@P3v4GF=z-xQg8cAg2|Tluw4{92jQp(T46wlLk}SSfZXv*`-=O2IXM)xT6TH^=AC Ud;iH)251(8r>mdKI;Vst0AkQ89{>OV literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_1wg.png b/games/minimal/mods/testnodes/textures/testnodes_1wg.png new file mode 100644 index 0000000000000000000000000000000000000000..b2eba0e9a60e0337062d4896c2bb6b781523b258 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|j-D=#Ar*{g&oZ(#Fo-li{Qs}K zHa+6VBKBymzY@&y#>y+>ul4_qieP=nHQ_W<`dS7X!5H-&@?1Mq)_65m-{-F6Psrb) Ux9;A$MxbE~p00i_>zopr0L0}c82|tP literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_2.png b/games/minimal/mods/testnodes/textures/testnodes_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c87c868df0db96160b5fadaef616a5db8ee3ff4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|=AJH&Ar*|tKk_p@g`}jUBm@{{ z>nzJM(Myzmv4XK*o@2FJ$KxR1s11_@_<1B6qzunGm?#`)V{l&M^nr!Vs1;}ggQu&X J%Q~loCIDWb96$g7 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_2g.png b/games/minimal/mods/testnodes/textures/testnodes_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9060f7b9f45b814a0f00b7eb13dfe95d897a09 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|rk*a2Ar*|t72Zk`Qc@BE46}8X zWtr$DO21ga*e}nq+O6YpkZ;t6Ndo*l5)D#@XB|uwjU5fdinu6;4R_>Z62$75x&TR6+&AGO)5?bEvRtG@AD$OK!Fl=H2>9x<5- h-ck_BY394q#(p%g-uj-Kg&xpg22WQ%mvv4FO#sisFH-;j literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_2wg.png b/games/minimal/mods/testnodes/textures/testnodes_2wg.png new file mode 100644 index 0000000000000000000000000000000000000000..108dc87bb7e2a89f110ce607604b6e9b279d452a GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|ex5FlAr*{U`x)673%deiNt56bi%PMV)k jTfFU4yhDrlhKI~aQM;In-reN{n#|zo>gTe~DWM4fhUhQV literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_3.png b/games/minimal/mods/testnodes/textures/testnodes_3.png new file mode 100644 index 0000000000000000000000000000000000000000..05b45629afb1547e6c062c465e3305f2385e7ae7 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9>lw@cK<38E-E2Tg&eO#) zq=GTof$a=0j}9LXj{-}Iv!qUfnZT9*%t8!aS}gs?^abVtRWf+G`njxgN@xNA;o=qW literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_3g.png b/games/minimal/mods/testnodes/textures/testnodes_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..5c84f5882b9a185af33e59270ff59ae890f0bc39 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|dY&$hAr*|t72Zk`Qc@BL4Exzy yvP{epr8CwrUgrN&F0@R^>KEg3Hnv5KmLTC literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_3w.png b/games/minimal/mods/testnodes/textures/testnodes_3w.png new file mode 100644 index 0000000000000000000000000000000000000000..8b435cf013556c82faea0d69b3e3901ac7f71c47 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QtrC{y&3Z+LPAJTkW;$hf=yNmJgou(-K@Q>6IdCX8u+LGy&0hhRL$V&>gTe~ HDWM4fDn}p} literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_3wg.png b/games/minimal/mods/testnodes/textures/testnodes_3wg.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee9006674e2192e3826177046228cff06c41391 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QuHjefx^x=P4jd z$~) zdAc};R4^tBJbCdVK_Db3C`o{IqlBZ5n?N_C4qJMug9MkJ!Zhv@2?8NOK}iCv8zmfd+yuHAb=cBN9VEE)6sB=^h%zN@Y>3b)xGBKk Xl);~0>@>L?sGGsl)z4*}Q$iB}R~;kl literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_5.png b/games/minimal/mods/testnodes/textures/testnodes_5.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef1c728ca262766ed4d4e897dbcf3844e75246f GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|nw~C>Ar*|t2|wy*tC)zGEMQt> wqEP&DRb!ET!lHwV7)1lLmvyo|xxv7&f5%LxHIp~q1!`jOboFyt=akR{0CFN6$N&HU literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_5g.png b/games/minimal/mods/testnodes/textures/testnodes_5g.png new file mode 100644 index 0000000000000000000000000000000000000000..30da4793a153a639f718467ac465032117c34f15 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|nw~C>Ar*|t72Zk`Oi~g7jDb=U vc9vXq*eP$o7;7@&Is2*PS&bPEeY^}icc#8dw%o-B)WqQF>gTe~DWM4f^PCxH literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_5w.png b/games/minimal/mods/testnodes/textures/testnodes_5w.png new file mode 100644 index 0000000000000000000000000000000000000000..b4cb42426ab0ae0d26f35c3badefe4cac2cf8cf0 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QnG{-~Lk)UkqfZ zd%8G=R4^tBJbm#ZK_DO~sA+@5Lmjq|F!q*(0!&Gk2O@P6#GJ$!eBSXt+BTo%CrGoW LtDnm{r-UW|(r+RX literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_5wg.png b/games/minimal/mods/testnodes/textures/testnodes_5wg.png new file mode 100644 index 0000000000000000000000000000000000000000..fac9db28edfbf19a5bc2b6fceb8128b23a283651 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QuHjefx^x=P4jd z-P6S}q=GS7;OUDO2?7B@K}{PZ9_p}#gt50Q6ktlSJP@gqAm${-;Pa0E(YE<4KY>~p NJYD@<);T3K0RSy_BWeHu literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_6.png b/games/minimal/mods/testnodes/textures/testnodes_6.png new file mode 100644 index 0000000000000000000000000000000000000000..805813e57509bf2bb6f7b4cbef5bfa5267243580 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|+MX_sAr*|t9Df&i2}wywNdzzk xN{vW}QAUu=+(W?0x@=I3@@Ar*|t72Zk`Qc@BDjDb=Q va*|9ZyiwWpJMn?(0;a4ZCd?NbWTYAXoQygb$RYk4sENVT)z4*}Q$iB}8_XJd literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_6w.png b/games/minimal/mods/testnodes/textures/testnodes_6w.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bbf97d977a3fd3091bcdeb0dbd3af99752890b GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QovysOo>(`UA*P z_jGX#sbEYNc>3Z+fmdKI;Vst0N0ozUH||9 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_6wg.png b/games/minimal/mods/testnodes/textures/testnodes_6wg.png new file mode 100644 index 0000000000000000000000000000000000000000..29ca933e0aa8bb5307d63c289aaaff44821a9794 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QuHjefx^x=P4jd z-P6S}q=GS7;OUDO2?7B@K}{Q29_p}#gt50Q6ktlSJP@guAm${-5b{pI=<)l`J3uWA Mp00i_>zopr04&8LmH+?% literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_airlike.png b/games/minimal/mods/testnodes/textures/testnodes_airlike.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5664a2ae2458eaff7ff3038b0278cb3f637fb2 GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~OeH~n!3+##lh0ZJd7_>!jv*C{ m$q`$-8XG4rY;4ppG7({zpupNzTxdBNq|MXS&t;ucLK6UCCl(?A literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_allfaces.png b/games/minimal/mods/testnodes/textures/testnodes_allfaces.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a7dc550c077d44a79e87a1b5ef72c8e98d344f GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1XA9fE{-7; zj8iX#iaIEYuwJ}uFU7cmd4D;tmH&s{bd|lG>zAzKKX|vG&NNk`#4!{-APz?J^B*Jcu!Y9mvv4FO#sKbZR;5g!S sJEVG|u-h?-mwyG5{X?qvMtoqOr1$L}kA1*jflQDEp00i_>zopr04K05-v9sr literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_alpha.png b/games/minimal/mods/testnodes/textures/testnodes_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..157fa7386865f5ec8a4cc616809dea4085890a2d GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>Ygr+Ar*|t2_3v_3z=7QD6R0? tk(Kn7L37fD6>KsYA#gQu&X%Q~loCIJ0)8S?-D literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_alpha128.png b/games/minimal/mods/testnodes/textures/testnodes_alpha128.png new file mode 100644 index 0000000000000000000000000000000000000000..16babf6c774bd887c6004f23702490b4c9fdf5ea GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{+=$5Ar*|t4?Gfn@E=mzE+OS{ z(4dy*#H^EsEsRGNu<+M2yYXK5!M}K+#N>VhhJ_4s+Y;Y=;xS-z5|q?CaK&Yh_kx+6 jciA4rFkJF3EMsGMIH}CY@wi(x&}arvS3j3^P6fIprkTdZZS7ly`GBXzEX6SfYP)+JYz0h0I#$9p(nz_t<(DJwe7_2EI^)pTKk|4Nqw#uZf)|62tm& z$4@99&40n(L%OdZ@QqXmD5@G@Dui0<6?h%!Fg=J*&>fC1pp+nlpkIyn%NLA(`;fDw zk&wm_DZ`||Yo@wGSil$+uTb&+2aaS+rNC;hz-l4zSN}N(PPY%QTqKQzXEqLS9g`L| zvKDyPJq6TNkoF%*Kc%+kAUNGV%uA6p67cMAmx;`aX<>8MT?8Xqz}&jS@dfWWD7x*# Y7a!BrN=(AEk^lez07*qoM6N<$f;qi&^Z)<= literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_attached_bottom.png b/games/minimal/mods/testnodes/textures/testnodes_attached_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e01ae576f5df74b8c0ce885a63826e94fdda2839 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|vYsxEAr*|tJMPzOoi%K$n8bKU jX`YOgSgTe~DWM4fDkK)i literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_attached_side.png b/games/minimal/mods/testnodes/textures/testnodes_attached_side.png new file mode 100644 index 0000000000000000000000000000000000000000..9459cbb0568dde882a4082a42a50eec9b7dc9c9a GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|nw~C>Ar*|tKlVSd^yFBQSbNY$ wNzl}^CrjdL!T$dtvyyo}sxY^>+Hf+QdVcHB>1%Q;fSMRQUHx3vIVCg!0GAIPX#fBK literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_attached_top.png b/games/minimal/mods/testnodes/textures/testnodes_attached_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0148b41e069734f5937e4976e2dd95f9b3c35e85 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|a-J@ZAr*|tKlVSd^yFBQSbNY$ k>7qln#8rb;jVde*Hi2(toTrIi2dZT7boFyt=akR{07OX^;s5{u literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_attachedw_bottom.png b/games/minimal/mods/testnodes/textures/testnodes_attachedw_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..488ad23a90e3675a73e6e95d7dfd9c3f0983b06d GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u7~>XM>?j>ELh)~H1mH$ z?H-`Gp{I*uNCjiE01FeFxI)8*J7H_H60Hs&IB@#Gw=C11t-obkj;4J2c_!U}dm-OK c@iR;e3Nu8kFVdQ&MBb@0E7H1%m4rY literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_attachedw_side.png b/games/minimal/mods/testnodes/textures/testnodes_attachedw_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a02facbc721cdb6e041a4f5467c65febcf542683 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|j-D=#Ar*|tJN7@Z_vBcTn0ByA z>7u}e3$sjw&$)>&iD7nlK^u%1; UqHsXH5NH^Kr>mdKI;Vst094B&Q%58^j@*QkjzBAu66X12r@?mB;F#W4JqwGgXpk@Y7S3j3^P6GAr*|tKh8I_)EyA?`{=lm m@t~sH=Y%T;QvA)%%nUWs)dGIXKXw7tGI+ZBxvXcw?T&VTTJgIQ_BDJNtvD@dc|Oi>b0f8)HJ#9Rr6Q4He88Pn!O> zJen<}FW{rTrI67{SZ($K?g^sFmuBcGyr^fI$-Agyg5r-S8t2Y21e?DLyZ=*fJMh(P7{ryYh1JYRV$P6d`(oZubP0l+XkKkKH6} literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_drowning.png b/games/minimal/mods/testnodes/textures/testnodes_drowning.png new file mode 100644 index 0000000000000000000000000000000000000000..57ffc8fcf996e68f091dcc05e758e8eaaf2fa132 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E6b$kK<2#}-!y;}Q%R6t z@PCG<+YP*cJT*@j$B+ufzopr03jzKWB>pF literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_fall_damage_minus.png b/games/minimal/mods/testnodes/textures/testnodes_fall_damage_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..88d3bdf58598e14081f21d398ee50f0fefedb24f GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|)}AhoAr*|tD^vv=O#Zkt@klU4 ziY;uE*!*%O0u+RK+_VB;W QKyw&8UHx3vIVCg!0MyeZ82|tP literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_fencelike.png b/games/minimal/mods/testnodes/textures/testnodes_fencelike.png new file mode 100644 index 0000000000000000000000000000000000000000..84dea1b7c2ee318672987049eec68475bfc42820 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|ik>cxAr*|t89viBxt=S{OIhKc npx^sMZJvykSgTe~DWM4feG?d* literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_firelike.png b/games/minimal/mods/testnodes/textures/testnodes_firelike.png new file mode 100644 index 0000000000000000000000000000000000000000..ee59b0db1be0b51619ad304cb17f44e41e4af283 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uGi)>T(f1UP-3{2$1poW zp#&)I;_2cTQo)!kz{|^&@pF}Jz?*;Z3W5JcJy;qz v%@hn9->N%bWBWJVf$7NI^g4)z4*}Q$iB}oT@G$ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_glasslike.png b/games/minimal/mods/testnodes/textures/testnodes_glasslike.png new file mode 100644 index 0000000000000000000000000000000000000000..cf3e35414dbcb42b1d0b52990f97d2fe095251b9 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5a_E{-7; zjLARFANcU)fBhptW)5LqjjIg_$*Y_%Is}-W^pjGPa(mpU!oqMT`B3H+^_WK>-JY&~ JF6*2UngA0mAgTZW literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_glasslike_detail.png b/games/minimal/mods/testnodes/textures/testnodes_glasslike_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..30c9586e84022c1817fb88f90fafad462589a706 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr*{gCo{4+81gt5zhtz& z`Oe7U{KtJkbq6l=|GhBPMSGg>nNBvY3-_W!&U3}xGkw0)Q7@34vD9SZ=G4O{Kf7JO z9wqcZiScj7Eakt z!I=Ex{DBX9C$O*_`rpYmC3{9%yH2lK-vx&N)02Kua#C)O8%FVdQ&MBb@0P8Ly{r~^~ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_glasslike_framed_optional.png b/games/minimal/mods/testnodes/textures/testnodes_glasslike_framed_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..37de77dd1aa7e6d027ade771dc898f4fcd8bf6b7 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar*|tKh7WcaR1W`^_w#o zT^JadEhUaNEI%RPtJr3v$Lvt@_W!*9GuRSNB}*|(bbP0l+XkK90Mnf literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_glasslikeliquid.png b/games/minimal/mods/testnodes/textures/testnodes_glasslikeliquid.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e96ffb9f62b37173e542bf05a0d84b58d2ef2f GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar*|tKh7Wcu)p$py@6fr zFB4{t=ARrr;qw@MCUCAuVmRSBqiF@hbQ=%-84AwEhZ-9Bngf~LE;Alt=-On=(9U+| V!ig*Y)q#dFc)I$ztaD0e0svo?C-wjU literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light.png b/games/minimal/mods/testnodes/textures/testnodes_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba0081c3dc0544e0fc5b3c3a692b3744ab52f1e GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5a_E{-7; zjLAR#|F>t}$gu3kRpAuJ4vw;eg4_c4)YtTs@G6T=nDfKK?;b<@Q^mOlSEO78>GpK> Kb6Mw<&;$SqK_OcJ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_1.png b/games/minimal/mods/testnodes/textures/testnodes_light_1.png new file mode 100644 index 0000000000000000000000000000000000000000..57adf5a4a89572114625655181540ac70574685e GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*|tKloXAo-nrD3-_0} zz}wjUcyhAD9EK-rd8N$^PMkW`WN>4?gOrNfmNbKH+qSV~A2Vs#plHB+z(kQ*K+)?4 zw?q|(Btv;)Umsr{vp~ZJ#up9O*b>?fK41|^SL@nr%&_*$ft189ZJ6T-G@y GGywoSv@(ML literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_10.png b/games/minimal/mods/testnodes/textures/testnodes_light_10.png new file mode 100644 index 0000000000000000000000000000000000000000..483834770e84a3072c88a2a20d48d423b5c1d50f GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`QJyZ2Ar*{gCo{4gFyL|h|JQ%A zGp|njiER%bDyO9WT5+L@Uv-sqEz5VCCxY*Go4@r8T^TpSU?QhW%RJ`<0moO&-xkZA v@L_tlh0*hj9z!$39|40cs;5tH*>g@@q3@Pjq4$LVpe+oZu6{1-oD!M7c&cgqa^Z81LJ+CtAB5sOPSD5XvC<_cc?x x9P0;r*(4tQ%s-k8mpCf?lk@h>KDm3YwcPtl3v4g_{{Xay!PC{xWt~$(69AaTHR%8V literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_12.png b/games/minimal/mods/testnodes/textures/testnodes_light_12.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7946d09ec5a15edcceb96fda9590dd3cc9833c GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr*|tKloXAo-nrD3-_0} zz}wjUcyh8t3d2MF4fh31m;}~KCNgwcSn4U{FetfjRx`%($1y+n*dw4U(%Zu8z;0sB kV9dj&y1>FXaL!!DElY1b4l)Vk1RBoZ>FVdQ&MBb@0AdIx4gdfE literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_13.png b/games/minimal/mods/testnodes/textures/testnodes_light_13.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63c84a65bd79fd05e5f57e84fac1eadaf57f14 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar*|tKloXAo-nrD3-_0} zz}wjUcyh8t3d2MF4fh31m;}~KCNgwcSn4U{FetfjRx`%($1!i%*%e?SWX8aI;SR$Y k1BodOkIuLhma#Fcy?OD?9J^(&fMzpzy85}Sb4q9e0GZY)&j0`b literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_14.png b/games/minimal/mods/testnodes/textures/testnodes_light_14.png new file mode 100644 index 0000000000000000000000000000000000000000..a817bd3946eea313015daca3408ca40310ceca13 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-kvUwAr*|tKloXAo-nrD3-_0} zz}wjUcyh8t3d2MF4fhjFHc4pC;*@sS$!*{)a+$%TVIBK=#v3uN8d99n4SX;14=i92 eNmuLIY|Ow_bo7Vg*^&gHu?(KBelF{r5}E)J!6(81 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_2.png b/games/minimal/mods/testnodes/textures/testnodes_light_2.png new file mode 100644 index 0000000000000000000000000000000000000000..852eaeff17dd01be999daad14b8829005ba934bc GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*|tKloXAo-nrD3-_0} zz}wjUcyhAD9EK-rd8N%5GD8?dl%tF#qNAe^-;`hzFk?w%5O`q9Ah@VyZ^Od&21X8F zD=RAnL#K-#HyBDBvY8DICloMs84Dl1Dar7|dVl}lPp+qcRxx4T z4@?!*)Y=%&vbHRmxPkFS!!ovp#r(EX?CJ|Fj05M)WeoG$;dfta{ac`Y44$rjF6*2U FngG^JHGKd8 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_5.png b/games/minimal/mods/testnodes/textures/testnodes_light_5.png new file mode 100644 index 0000000000000000000000000000000000000000..b6eede0ae902569625cfecbc4a64a3ee519bd53a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr*|tKloXAo-nrD3-_0} zz}wjUcyhAD9EK-rd8N%5GD8?dl%tIAFi7m)xKYq$@;jy#YJ1oeoTh9LH~8|vR6$LR xEl)d+S)gG9N#X6B`_$ta8@%0^EWx~;TEXU_{OxB l_W)1xK~9ZxJ|gMq49CMR^d9wyP6wLK;OXk;vd$@?2>_TsC#(Pf literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_light_9.png b/games/minimal/mods/testnodes/textures/testnodes_light_9.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa9023585aba2055ec03f3ab5f34f89b01897d6 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr*|tKloXAo-nrD3-_0} zz}wjUcyhAD9EK-rd8N%5GD8?dl%tIAFqoKi>N#W_%4Se<;jCtK=8t1;VDNiv-cY13 v(8pTD+mN_JLX+Vx>lW{ABI#;fn~fR1dELvMuQ7iK&>jX)S3j3^P6%KW@e4PR>dp^ji1d1qPz`B cn>HCUeAvOg`bbC>C(uv^Pgg&ebxsLQ07FbC)Bpeg literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_line_curved.png b/games/minimal/mods/testnodes/textures/testnodes_line_curved.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9f8e7208af8577ebd5df34f7a1d2749b5a95d9 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*|tKl)ideg5ouOoPo} z0>=lbf>&2GQ+h5la4@nqpJQ;Ev4HV^=KjjoAV!UCni*d&lMusCd Wmz>)Cz@8Ck8iS{+pUXO@geCx7YA3`1 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_line_straight.png b/games/minimal/mods/testnodes/textures/testnodes_line_straight.png new file mode 100644 index 0000000000000000000000000000000000000000..4f33d9c6d9e53ee5ae0b33099fc5995faabc6809 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*|tKl)ideg6FL$CZ`A zCnU7`IsNgEN;ICy8kMY&H<(ZAjX* a$(SLP>4->jjF%mdKI;Vst03c`@!~g&Q literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidflowing.png b/games/minimal/mods/testnodes/textures/testnodes_liquidflowing.png new file mode 100644 index 0000000000000000000000000000000000000000..1736b89ba5501f6f87ae94546d71249c29948010 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-kvUwAr*|t2_2SuS$nwa8w^+0 zoZ@wut}wIT*YWM0`MmlXVlbP0(e%&{mv%-U=9`HP$4}1qbJ1YI4Te8) f5{oJuL+lusj*9axK5RD!Xe@)LtDnm{r-UW|`Uotr literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r0.png b/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r0.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a61039d7d4e5a725cf6d54c26e56c335757ed5 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar*|tFAP#|@EkflM`1>Y z-BY#&-V=@;PdqTOX#d&QT}_S>N7_Cc@*a4{TGCr!x6J#4v_qN1gOX1f5)L1JO)8LJ z`*hOaL5Ado)N^MPq)w>c7Fi*Ar*|tFFcZN@Ekg=r8pzR z?kU>>?+M3_CmxtsSvUK-F9%zqfb_ZJCJej9FPI+s;nL3N$2+6uPuzi(g(f^R96vdj z84FC#W4Mz&_oM=|$9E z+nLB?Jck09J-#t@ai2KFt%0oIjKR~@&t;ucLK6U4 CW;Ij* literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r3.png b/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r3.png new file mode 100644 index 0000000000000000000000000000000000000000..bef77396844b1a924c2d32af9941ddecfc5b8691 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*|t9Pbit@Ep=StuQ0R z?kU>>?+M3_CmwjCTsQmob=GEs4&LXyy1<(f!9wi8ZewbXfVOQ zjWP4|3`dD9hLdp)g^ZPzifblIJ`-)KY}{j@FqNO7ap}>$3>qtr0&QdPboFyt=akR{ E0G$3g4*&oF literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r4.png b/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r4.png new file mode 100644 index 0000000000000000000000000000000000000000..de1001b2d9ebd15eb417b4ba002dc2025c6d7f5f GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`iJmTwAr*|t0k0Eo@EqE8T46?r z-BY#&-V=@;Pjombxc_YH>n2BuBW<4zc@Ml}E$J<=Tju>i+M!J1LFuOq35O><(+rz4 z6y_%}dwgf|kZC)4ntRsVGX~QqOci%HcU+!r$tT7Pg{guE*&1_!mN9s``njxgN@xNA DQCK(J literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r5.png b/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r5.png new file mode 100644 index 0000000000000000000000000000000000000000..97b422e9a181b08932b7a4362ac976d75cd2e16e GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*|t2`>_E^Bg;Ead1Y6 z-BY#&-V@FoUv}Vq$Ngs$N)IaVBpv=?!E?YwGFG|AzeM7I$pl%pA9HP_*c2=!*gl># zZm5*}p7zWyPhftEzQXQ?HG3E~OC~bN^*(83Tv@{~c~gm*pVP6|K-(BRUHx3vIVCg! E0B5E*o&W#< literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r6.png b/games/minimal/mods/testnodes/textures/testnodes_liquidflowing_r6.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd8e4e8e551a3c8881ce47e3bcf788fdc065c2e GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*|t2`>!p@ffnqJ zyQgdmyeFJFzU;vJ6LZcUeErKo;z--aLWzbgTe~DWM4fPvI)? literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r0.png b/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r0.png new file mode 100644 index 0000000000000000000000000000000000000000..da0a99623d8f84189d3d46914f0b8e3f8b34bdac GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr*|t8Rm&MdU~c?E=+Rz z)O@8u`DtCjo_#7ZZ5yQ=s)iq0&y27{e!38$DD?t89|zrC&{8)y%Mr>mdKI;Vst0A?yO-v9sr literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r1.png b/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r1.png new file mode 100644 index 0000000000000000000000000000000000000000..66bf2be8f9ff80d2e3d76840a16e8d7315d46eec GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*|t8U86ZdU~dZE=qFx z)O@8u`SYI#6@QNuNF2*!5R;y0x=^C+rP3a@gj*i<%pBE?TO3rZrB>!L%Vz?N< zJmaJ{yKLtfg+hT|Td@z-okh$S_PX3)aQei+yz_cqjQ*Mcpj8Z>u6{1-oD!M{`KlV9UgRYy#hyG8;Y0OoGlbl)Rrfo$r}m zGFzg+{52&Fi3-e}p5p5^?rfgP!>m!xxXgxOY5gxQr`@HyfmShiy85}Sb4q9e0CCtg AH2?qr literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r3.png b/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f46e291e81e7da98816774f0d0994cb99afae91 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*|t9C_(CdU}GVFHCa! z)O@AE(*4haich}^B#z}Vh)GX0T`1A^QfUuc!Yz+_W{&E{Eee{ji5+@w8F7dukVC$Tm$?#O~z!Y|d>32`RpRi-=5};KKp00i_>zopr0BO%R A7ytkO literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r4.png b/games/minimal/mods/testnodes/textures/testnodes_liquidsource_r4.png new file mode 100644 index 0000000000000000000000000000000000000000..0693a04d7fc89f7acdd7bfbb06a724348cea3912 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*|t0omy{dV0Q2TbShZ zsrgF7CFQz;m~D14Z5yQ|uzj9rH%uYL*wnB-9Oyx~#DTg=gl!>PRvl?ppP3=~aY8kIL3J!#TVB%W}JnL*%r^+9L(2cLl!F?hQAxvX|uzw*)onSJ{>+6pBaGL<)}r5xU{lcS$;hS{ZK45#)wR4NGdxvi3HcxSum661`t wxMv)PQkF8GF;FyodB|i^Cc{&`15?-;R-Rks^JTL}JJ4P?E^ja75FHq2;70L$Dk}p6bIv;F# z!oHHR&YkaY;g4UY20e!ve55CuDoVGVb*SE`# zj`EL3bk-zn+Oz1yWxY8!x^}Rha~9nGA=`Y(;hk+CUw)7UTEyV#>gTe~DWM4fCj>d} literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_mesh_stripes2.png b/games/minimal/mods/testnodes/textures/testnodes_mesh_stripes2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea65c1ec05dc1c2e71d35461b935b9ecc14ec40 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|;hrvzAr*{sPd2h1aNucuxZT0} z_}l*7uD2w)mTo`zx>J~6;QjYbmkmjlGkEiA&&NCweRD7DX_=sT@hheE31toGCtUqm sH*?lK&}q2Y9L8c?R&d0pNNc&gTH>zP-=D^O16sl0>FVdQ&MBb@001yGU;qFB literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_mesh_stripes3.png b/games/minimal/mods/testnodes/textures/testnodes_mesh_stripes3.png new file mode 100644 index 0000000000000000000000000000000000000000..96bc55ac5f3444eea6b725ec663f6a706ceed461 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|GM+AuAr*|t3hXipQVynn)TIK> hwgpPNGAr*|tKU|d(7!nsTIyvhK lGHh=PBNKfYA2vt22WQ%mvv4FO#m6}6{i3I literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_node_falling.png b/games/minimal/mods/testnodes/textures/testnodes_node_falling.png new file mode 100644 index 0000000000000000000000000000000000000000..44153185c23c46924729b8735bd4b47968f0012b GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|=AJH&Ar*|tKm3&v7!nsTIyvhK zGR$xLZ!gin;ad>G93van63eV-`y=PT73YcaCp@K|sM-lJGF%g#=A(Dls0?TXgQu&X J%Q~loCIE(79ispM literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_nodebox.png b/games/minimal/mods/testnodes/textures/testnodes_nodebox.png new file mode 100644 index 0000000000000000000000000000000000000000..66e8dd663e3a117d378b7b3eacd4e8bc0fc67b60 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|=AJH&Ar*|tJ8FJ@S|7i^LtWBg zMh3$b=0gr)Zf^iD|ix_T}13HnQ|qzHd-`nXj~$~$Dreo9QAObm=w?m22WQ% Jmvv4FO#uGx9+?0D literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_nojump_side.png b/games/minimal/mods/testnodes/textures/testnodes_nojump_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6a64cfff0fb1339f4b1daf2a94c088eac96ecc48 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|s-7;6Ar*|t3haNb2Pz9Gnh0d- rHMw4xw{Uf02y?1uvxke{B{qg%(@scw8ej1QYGCkm^>bP0l+XkKwOkl} literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_nojump_top.png b/games/minimal/mods/testnodes/textures/testnodes_nojump_top.png new file mode 100644 index 0000000000000000000000000000000000000000..fe770838f0cc6a6345c7c3308bc1ff89d7e8de0a GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0F%LqxRu&av_kV=jq}Y zQo)$a(DbXGhtG%S<9>-l@rEwV!yy;u pmbNG*hCJTIQf{UbrvLC@VVJX~#qaC_e+{5=22WQ%mvv4FO#s;08E*gp literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_normal1.png b/games/minimal/mods/testnodes/textures/testnodes_normal1.png new file mode 100644 index 0000000000000000000000000000000000000000..edaba77e4e602f12ec74e2a383e9a148838f52c0 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|mYyz-Ar*|tKh7WcFkj>V!yy;u zmbU-$97;}74Gk>34h~Ih3JM2-_^PLJFf*5f$Hb{7C%kJ^m>9$gm%Z2N-Y^qr2!p4q KpUXO@geCwWXdguY literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_normal2.png b/games/minimal/mods/testnodes/textures/testnodes_normal2.png new file mode 100644 index 0000000000000000000000000000000000000000..0080a9ee74ba07a7b0ba0f4c7f81c5548835a08e GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|j-D=#Ar*|tKh7WcFkj>V!yy;u zmbU-Xrm+ZqHBs2zxPi^bwIz4KVzxtd2SR)Un4S8zB&aIN8BAt&HS~>pq%6q5z_B## V&-2Ty`ar`NJYD@<);T3K0RRBHC2;@% literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_normal3.png b/games/minimal/mods/testnodes/textures/testnodes_normal3.png new file mode 100644 index 0000000000000000000000000000000000000000..0426ab216faf25f645c5b49d202c6f8f79f04318 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|mYyz-Ar*|tKh7WcFkj>V!yy;u zmNw&Q|2dUbWjgGbpusyM=aAWj5awm_Z1+4B%w+#ItZdwK#9fJj;aKs;s7?7tRe^>u Nc)I$ztaD0e0s!SZBo_bx literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_normal4.png b/games/minimal/mods/testnodes/textures/testnodes_normal4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1922eb6d383c17e8a9499a8fa7d64585dad665 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|hMq2tAr*|tKh7WcFkj>V!yy;u z7PkHe|5*e}O%B}Tcy}QC0K<~XswbHTuK2_~QWj)jaB`?Q^6;Y6G@xb%Pgg&ebxsLQ E0RP@1X8-^I literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_normal5.png b/games/minimal/mods/testnodes/textures/testnodes_normal5.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7dcd2da9d230c61c56d841a333ce36e3c297f3 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|CY~;iAr*|tKh7WcFkj>V!yy-D z72f~(!Y)@XHE?lcI|RFg^G^BAD9kIyyQ1OJ3^o0a6FC_2o=lY~F8=xisGq^p)z4*} HQ$iB}V!yy;u zmbMG}t5^i5nk?AaxPi^bERk2my7OI~LUTZn%?rCm3h~gQu&X J%Q~loCIDBLA_D*b literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_palette_facedir.png b/games/minimal/mods/testnodes/textures/testnodes_palette_facedir.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf47bbbe2693618e4d7851aa9837720df4deca6 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^96-#-!2~38k}5=il$@uFV@L&Ka>|Qe>yOoY_kN!y l^*=XsUvyT2%Hgjp40(q*UX?A<{Q*?T;OXk;vd$@?2>^*(8T9}F literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_palette_full.png b/games/minimal/mods/testnodes/textures/testnodes_palette_full.png new file mode 100644 index 0000000000000000000000000000000000000000..e0a5f8b349809a6a6d3febdca04f93a5b09ddebd GIT binary patch literal 568 zcmV-80>}M{P)3w&f$Iv9rqA>KLQFM?vn#O?xheA>$T~RDJszPs@-Y4PDymNTxp8tLM z?(|$5j6Z22wpVzX@QpQ*&XBH%?HI{776M%@W4^rt=9Fx2MY)PI8Rk=5s3?GUTPt%YbFEfz-=@7rv;FA<_P?-<(bc zh4N}S7xNnM6z0-xq+ctyW_~T*T84%0(uX6@TbtKDwGMSQwJu?atUTV?46<=}=V()V ztTTzuy?kkm%I=umNwZgW&&&a-%$_-|v;YIMdH}OJ<@Ac4TzoW`G#WG+Y!oz_ItQdd zx@L*id<>feqni&Oa7m<;kcv;ll_JUbvJ~T!f`KQbUNX9U{~i{k*jxYt;P+o@#+By#u%9iKQeqCdVTCz zZ?ewDN2F!pQ?>wybr$urZ(R80F^mp>I_Y9}TIE*KuV!c_w0xn2{9`s(YR9673C{bU1*EjR;WvFNyHE3xSc#*z1vjW z=jMi-Q#Y*tU!ERc_uo9yKui7uC$D@#h(q@p>oa#hwM4bpZ%9a8)MV4&GV#qUhy2{b e4%fP3HcRUj%RjyK?T;eR3IXLf<0XvLn;`P6GU1V*iw@X3{+-5%*c`8N^99UYZjB_)1ygA zhuYeBx{kIUJ9uoNgWJxHD~mHWC^mZ~E?lu;qe6ghV&~=sGn6MheDp@?jZV&q06tcR YL))dFYUI1S0F7txboFyt=akR{09*G#o&W#< literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_leveled.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_leveled.png new file mode 100644 index 0000000000000000000000000000000000000000..53504dbcdd6224baf262d39e82327788cc7ec45b GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|S)MMAAr*|tKMou)cqy>)#l1kb zw*UYC@Bgu1sHtfC&1-8D8wv%LRI9Vm@HtXVlugnK~L!S6vkU#>_A%? NJYD@<);T3K0RRupJlFsL literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_meshoptions.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_meshoptions.png new file mode 100644 index 0000000000000000000000000000000000000000..d504d459f30d387160543b1001824bcec1b56cf2 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|*`6+rAr*|tKh7U8c&NeI@$mou z|N8&ds|fLy@m}o~HV8eiG{D56zopr08^_t1^@s6 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted.png new file mode 100644 index 0000000000000000000000000000000000000000..79cf2125e1aacf3924774801deff8fd2b5cc3942 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|wVp1HAr*|tKh7U8c&NeI@z7pi zkAl#!H`{}JH}4a=;`XX~~!1~bnx31AjTjOxC?U?>{NKZjf8p%Mpgft?TQAt96J ziCGRBXXBo7Ja4)&L+U|Q!=-{vRfS9w7#&|MWHICnW)^UaXv literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png new file mode 100644 index 0000000000000000000000000000000000000000..85311cb2c388c32855fc67fe3c36f114a15da63f GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|5uPrNAr*|tKh7Tr5O!u_dYF(N znB=j8?a~*8kjIV|xebed`S@}iy26}#@ajR&9UOMj2EMHvk2W(lT`&>&z?^C3Afa-j t;i~P990!diavTE)IQ%i>Tzvy-WuZAFN(z}CMFD;wXLO%N#m;^nRuR)i0ZbE58FxWbkzLb6Mw<&;$V1wklQt literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png new file mode 100644 index 0000000000000000000000000000000000000000..d100023750f43debb379fcff8fbfc71f959f2e17 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|?w&4=Ar*|tKh7Tr5O!u_dYF(N znB=j8?a~*8kjIV|xhu|JaS3e~aNN$Q#~a-EKxhl2qfjcdTJxzo2M_)gyedaz_g)gp aQnxS_9RV81;OXk;vd$@?2>_CQC|Upj literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png new file mode 100644 index 0000000000000000000000000000000000000000..45e75bdd329f7ef429b53b89526f27ed0b310eeb GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{m;NK;V8p@Ab4>qdzEAL z;)L97wh7G)?mNzW1F8x3ba4!+U`$RBX<=YXO*Sx4nfWjyM}jM@W#_C}Op;HJCM6we zYvbuU+IsBZv4sw9J2$Q@&e)*X?3K81#fFUv0ltZyn-|Pbp78L|8>KfoIVS@6SQ!p& Wmwu{|@9qLLp25@A&t;ucLK6VX*+QTI literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png new file mode 100644 index 0000000000000000000000000000000000000000..8954b2c34c5870465d8f3ff3a09086bbcd633136 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|nVv3=Ar*|tKMou)cqy>)#l1kb zw*L+v9*M9#&D*>-`Y^*|C6};R)ElW);_3;j8oU=~G;ln;&fxOGEM>V00nl7d>%w_foRSeU4Ig&jtH>?!7x%G*a=E9jKEDQ?0&cah3=JEk8W$<+M Kb6Mw<&;$TK1vFRy literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png b/games/minimal/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png new file mode 100644 index 0000000000000000000000000000000000000000..112a0540f589690ab7bd58889c10fd8462c9b407 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|E}kxqAr*|tKh7U8c&NeI@z7pi zkA;4xt(<3TqA15<@1f+}{rKi)cKcx0&Y aGBPkqyO>sA2EeI zUiapal3wl;<}{IA5>t(@Xnfzv(Z#%!Wom4SIFoC`u9&`*T@pK)ugZM1V7kI;E|A#D o9bkRofGLm8sYku%-4 z(e352?d378Wih+EL%t>l5ta*)J{+yB%qR1lKP%pplg{otAUN$_Q^p?d;^w7?r3;0HeQWsZ*KIGH zwR1sKeL&Xlrpf6%HHSJ6ZdRQ0?dS~&FGCl$M=Ix%vpT(+@9v(Z@#UVUd_c$6t(Up| vR`zYn)ks~r_o-;Qq`bS_gOa!XQ}pEno0Wq?O~T!QE@AL=^>bP0l+XkK#LHg* literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_rail2_straight.png b/games/minimal/mods/testnodes/textures/testnodes_rail2_straight.png new file mode 100644 index 0000000000000000000000000000000000000000..8749330d85388acf6d84f0547b5eb4a69eafba7e GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZZ7YibqFsBpg@y;WmPU6} z#I=-0x0lDZm&de}M7Ng3bd<-omd3OL85ObhWzR1IH8Pe2`2{mLJiCzwFN&du5Jd`8&l77%FW@Js5N~L-$o~ui+5Kr moY9!W5%xLY!_JP0%nafD($c*imkt7*z~JfX=d#Wzp$PzZH&^rk literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_rail2_t_junction.png b/games/minimal/mods/testnodes/textures/testnodes_rail2_t_junction.png new file mode 100644 index 0000000000000000000000000000000000000000..0517f6570e8ee361ee9c4aa9cc719e4060c664e0 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=4M0F}wC|3k?r$EsgG| zh-)d0ZZD5*FOO+0i)k&5=>W3JVmc~fTS}t0EXWrDYG5o0@(X5gcy=QV$f@^qaSW+o zOil9x#z;hW2`3<0`F}K3=lXYAW}HRG>h?-mPlbaOVkV<%-Qx`IiGUfx*+&&t;ucLK6T$DJu8? literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_rail_curved.png b/games/minimal/mods/testnodes/textures/testnodes_rail_curved.png new file mode 100644 index 0000000000000000000000000000000000000000..e4441984858011cd8eaaee23dea9e2a7bea979e6 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=1^O%sW#wckSI48Xnx6 zc&P{|#8?vK7tG-B>_!@p35kuZ z$CvMqJ^#RG!r!*1m-LhQPRe+f2X;6-S;QfD*EueIWrS9quQ~Ul&K04rfyOa-y85}S Ib4q9e0OdD1wg3PC literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_rail_straight.png b/games/minimal/mods/testnodes/textures/testnodes_rail_straight.png new file mode 100644 index 0000000000000000000000000000000000000000..872d04fb9b6105e57f17f76c6e3cee0daf69f660 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=73rZVL?$UQuh_nX2=y z#{4Q!h_NKdFPOpM*^M+HN5#{{F@)oKa)Lk-1CuKoTbg3BLV!s^f?yFNlPf#h4iQ

zopr07%Cn@&Et; literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_rail_t_junction.png b/games/minimal/mods/testnodes/textures/testnodes_rail_t_junction.png new file mode 100644 index 0000000000000000000000000000000000000000..7e4af5182e1c185c5530ecd21cdddafea0fc31a3 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn;`P8yaJ)xBunm<^Oly zfuZ3_!<9uGdg~4U^BXgqIM%(8t>Nb0m$L+#8+axtL`vM{R!Lq}#i+xX^7ya>TS9N^ zr36a>d67pF8ynINBz$4ob=kY=spPE3S0$fKli*L&pVE5b@ZJr}4mKqw?$kW|$0)f+ zLW65cb7kYB7M8;))r{xVt*oE_KE0?Sk{4z BP9^{V literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_signlike.png b/games/minimal/mods/testnodes/textures/testnodes_signlike.png new file mode 100644 index 0000000000000000000000000000000000000000..33ffcba6ca0275756ea01876d6fb479931354013 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|v7RoDAr*|tKh7VRu=bp@P125? zRnG+TGnFRxTBz@o+O}+$qH>4H9PY&6G-iRn|NqOMbJ&o`;L7a6q~4jyJj=6yZ57+8 y+=fXle;q1q793@mvt%2ufasNuOa(PgMg~6VK&zRnI6HtAF?hQAxvX*m}&=L$4|!PC{x JWt~$(69BMNAYT9g literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_street_crossing.png b/games/minimal/mods/testnodes/textures/testnodes_street_crossing.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e35ad7a6f2e10882ea20effae88edd05bd31d5 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|0iG_7Ar*{gCo!@ea1dbr+`mWn zfBAZk*z1eJq8ndvuuIP2<(cq>Nq%M1lD|F&)tzq~Sp7*aL~pOA&w+;bEarO-`s)1o meEH?WPnl01PZl}*o1x{!=C_9zF>3Uv+{@ z!~X<^=Z8d(96M&jV7S**fx&mK$*cB2djvvZEIT<4b)W_iI>gTe~DWM4fCZ!(; literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_street_t_junction.png b/games/minimal/mods/testnodes/textures/testnodes_street_t_junction.png new file mode 100644 index 0000000000000000000000000000000000000000..713621e0661b1b65e2bb8f3e3c6fb76fb31c43c8 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|uAVNAAr*|tKh7Ue(AE9>Uv?zrCvE@$ literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_sunlight_filter.png b/games/minimal/mods/testnodes/textures/testnodes_sunlight_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..b38ea40729b0a336119a8ffd154baf9fd2df8d60 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X60AE{-7; zjL8~mf(<4=gm^DqzPwOMLPDZLv3+7&Nzj1@9qkt@7#K>IpOjDDelZ%P)6><@Wt~$( F696qV9qIr8 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_torchlike_ceiling.png b/games/minimal/mods/testnodes/textures/testnodes_torchlike_ceiling.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9862cc988af30c729428df42cf6731cdc5ac4e GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr*|tKh7WcFkk2Z1B-)@ z@C=Vnf7uh+Lo)@^4lw?6?s%Af;6J|v8^h5KV}?}|l$aGNwr{t&!JxoA%2n6&H8TxOXX37~xpp00i_>zopr E02vuD$p8QV literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_torchlike_floor.png b/games/minimal/mods/testnodes/textures/testnodes_torchlike_floor.png new file mode 100644 index 0000000000000000000000000000000000000000..adf1e002dd67b65035e93622ae3c93baef3f1c1d GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr*|tKh86_Oi2)6R5{7| zUy((Z_s9RnhxQzkGZ>tdBiR&8ls@F;|NOsXH^V~7{fsOohYemPCMca`zwWb%QQ@q@ on+00DhZGcNNg8AwsOMs2(A<1MX+t4P3($N9Pgg&ebxsLQ0Ny1m6951J literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testnodes/textures/testnodes_torchlike_wall.png b/games/minimal/mods/testnodes/textures/testnodes_torchlike_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..cb442b22d84150cad41d4181a7cdca7a9ad64f09 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*{g&urvu2oPv~=#!u? z7MAyb;alIEpgaN3k195SJ3{`&JXpowqBooA%L7UO4ZQky8A2Lrn2y_BW?ai;F^SoB zldiC`Lv}+LQ`BpV0OKXhOiOqygqZt|G;}e(k9ROBW!&Pn-?Jc)@deOA22WQ%mvv4F FO#r_LGkpL6 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testpathfinder/README.md b/games/minimal/mods/testpathfinder/README.md new file mode 100644 index 000000000..2b9d46e70 --- /dev/null +++ b/games/minimal/mods/testpathfinder/README.md @@ -0,0 +1,15 @@ +# Pathfinder Tester + +Usage: + +Use the Pathfinder Tester tool (`testpathfinder:testpathfinder`). +Here's how it works: + +* Place on node: Set destination position +* Punch: Find path +* Sneak+punch: Select pathfinding algorithm + +Information will be shown in chat. If a path was found, all waypoints +will be shown for a few seconds. + +See `init.lua` for config variables. diff --git a/games/minimal/mods/testpathfinder/init.lua b/games/minimal/mods/testpathfinder/init.lua new file mode 100644 index 000000000..f94848236 --- /dev/null +++ b/games/minimal/mods/testpathfinder/init.lua @@ -0,0 +1,132 @@ +local S = minetest.get_translator("testpathfinder") + +-- Config parameters + +-- Maximum direct distance between start and end +local MAX_DIRECT_DISTANCE = 64 +-- Maximum search distance +local MAX_SEARCH_DISTANCE = 32 +-- Maximum permitted jump height +local MAX_JUMP = 1 +-- Maximum permitted drop height +local MAX_DROP = 5 +-- If true, mod won't refuse to run pathfinder even at long distances +local IGNORE_MAX_DISTANCE_SAFEGUARD = false + +-- End of config parameters + +local timer = 0 +local algorithms = { + "A*_noprefetch", + "A*", + "Dijkstra", +} + +local function find_path_for_player(player, itemstack) + local meta = itemstack:get_meta() + if not meta then + return + end + local x = meta:get_int("pos_x") + local y = meta:get_int("pos_y") + local z = meta:get_int("pos_z") + local algo = meta:get_int("algorithm") + if x and y and z then + local pos2 = {x=x, y=y, z=z} + algo = algorithms[algo+1] + local pos1 = vector.round(player:get_pos()) + -- Don't bother calling pathfinder for high distance to avoid freezing + if (not IGNORE_MAX_DISTANCE_SAFEGUARD) and (vector.distance(pos1, pos2) > MAX_DIRECT_DISTANCE) then + minetest.chat_send_player(player:get_player_name(), S("Destination too far away! Set a destination (via placing) within a distance of @1 and try again!", MAX_DIRECT_DISTANCE)) + return + end + local str = S("Path from @1 to @2:", + minetest.pos_to_string(pos1), + minetest.pos_to_string(pos2)) + + minetest.chat_send_player(player:get_player_name(), str) + local time_start = minetest.get_us_time() + local path = minetest.find_path(pos1, pos2, MAX_SEARCH_DISTANCE, MAX_JUMP, MAX_DROP, algo) + local time_end = minetest.get_us_time() + local time_diff = time_end - time_start + str = "" + if not path then + minetest.chat_send_player(player:get_player_name(), S("No path!")) + minetest.chat_send_player(player:get_player_name(), S("Time: @1 ms", time_diff/1000)) + return + end + for s=1, #path do + str = str .. minetest.pos_to_string(path[s]) .. "\n" + local t + if s == #path then + t = "testpathfinder_waypoint_end.png" + elseif s == 1 then + t = "testpathfinder_waypoint_start.png" + else + local c = math.floor(((#path-s)/#path)*255) + t = string.format("testpathfinder_waypoint.png^[multiply:#%02x%02x00", 0xFF-c, c) + end + minetest.add_particle({ + pos = path[s], + expirationtime = 5 + 0.2 * s, + playername = player:get_player_name(), + glow = minetest.LIGHT_MAX, + texture = t, + size = 3, + }) + end + minetest.chat_send_player(player:get_player_name(), str) + minetest.chat_send_player(player:get_player_name(), S("Path length: @1", #path)) + minetest.chat_send_player(player:get_player_name(), S("Time: @1 ms", time_diff/1000)) + end +end + +local function set_destination(itemstack, user, pointed_thing) + if not (user and user:is_player()) then + return + end + local name = user:get_player_name() + local obj + local meta = itemstack:get_meta() + if pointed_thing.type == "node" then + local pos = pointed_thing.above + meta:set_int("pos_x", pos.x) + meta:set_int("pos_y", pos.y) + meta:set_int("pos_z", pos.z) + minetest.chat_send_player(user:get_player_name(), S("Destination set to @1", minetest.pos_to_string(pos))) + return itemstack + end +end + +local function find_path_or_set_algorithm(itemstack, user, pointed_thing) + if not (user and user:is_player()) then + return + end + local ctrl = user:get_player_control() + -- No sneak: Find path + if not ctrl.sneak then + find_path_for_player(user, itemstack) + else + -- Sneak: Set algorithm + local meta = itemstack:get_meta() + local algo = meta:get_int("algorithm") + algo = (algo + 1) % #algorithms + meta:set_int("algorithm", algo) + minetest.chat_send_player(user:get_player_name(), S("Algorithm: @1", algorithms[algo+1])) + return itemstack + end +end + +-- Punch: Find path +-- Sneak+punch: Select pathfinding algorithm +-- Place: Select destination node +minetest.register_tool("testpathfinder:testpathfinder", { + description = S("Pathfinder Tester"), + inventory_image = "testpathfinder_testpathfinder.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = find_path_or_set_algorithm, + on_secondary_use = set_destination, + on_place = set_destination, +}) + + diff --git a/games/minimal/mods/testpathfinder/mod.conf b/games/minimal/mods/testpathfinder/mod.conf new file mode 100644 index 000000000..e6034ae8c --- /dev/null +++ b/games/minimal/mods/testpathfinder/mod.conf @@ -0,0 +1,2 @@ +name = testpathfinder +description = Tool to test Minetest's pathfinder function diff --git a/games/minimal/mods/testpathfinder/textures/testpathfinder_testpathfinder.png b/games/minimal/mods/testpathfinder/textures/testpathfinder_testpathfinder.png new file mode 100644 index 0000000000000000000000000000000000000000..37eef0565458e2210ff0d048e4d79edf5182887e GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr*{s`xw~{I0!I*{_h{Z zP|^F@8tJgiRI93oEOmn0pL{>D#6f6&dtI4jdkEv7qxVy*lbo~F2vW5ESVHw|VrIq=swbQP`Iu>V^d&_)JNS3j3^ HP6=OqZvGJrUnZ`-?hK;kzL<+0d+BWy85}Sb4q9e0222ZV*mgE literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint_end.png b/games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint_end.png new file mode 100644 index 0000000000000000000000000000000000000000..41a1cc549a914cbf81ac93589f8c085df4dc4af9 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!3_UF&^$uA7AWH3>Eakt z!8mnNBO8N)fb;wR^}mE>-0Uh3+wnHAbaQiwxCZmL#SB~Wr!nz`sKuVQ3|?E=wrPID ro_kLi?1lE5)Q9~mtTFlV!BBR_bfG^Xb_c!!&1CR&^>bP0l+XkK4*xP| literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint_start.png b/games/minimal/mods/testpathfinder/textures/testpathfinder_waypoint_start.png new file mode 100644 index 0000000000000000000000000000000000000000..a22e31c3bcbf1cf62405a624430f5da27bbb7bb8 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar*{!CpWSkFyL`{zx(@V z^DBvWoW4cO7ZK`T)|ql*r`<8<4U4(gt#~VE^*nS!la^>ru6{1-oD!M math.pi*2 then + rot[axis] = rot[axis] - math.pi*2 + end + obj:set_rotation(rot) + end + end, +}) + +local mover_config = function(itemstack, user, pointed_thing) + if not (user and user:is_player()) then + return + end + local name = user:get_player_name() + local ctrl = user:get_player_control() + local meta = itemstack:get_meta() + local dist = 1.0 + if meta:contains("distance") then + dist = meta:get_int("distance") + end + if ctrl.sneak then + dist = dist - 1 + else + dist = dist + 1 + end + meta:set_int("distance", dist) + minetest.chat_send_player(user:get_player_name(), S("distance=@1/10", dist*2)) + return itemstack +end + +minetest.register_tool("testtools:object_mover", { + description = S("Object Mover"), + inventory_image = "testtools_object_mover.png", + groups = { testtool = 1, disable_repair = 1 }, + on_place = mover_config, + on_secondary_use = mover_config, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "object" then + return + end + local obj = pointed_thing.ref + if not (user and user:is_player()) then + return + end + local yaw = user:get_look_horizontal() + local dir = minetest.yaw_to_dir(yaw) + local pos = obj:get_pos() + local pitch = user:get_look_vertical() + if pitch > 0.25 * math.pi then + dir.y = -1 + dir.x = 0 + dir.z = 0 + elseif pitch < -0.25 * math.pi then + dir.y = 1 + dir.x = 0 + dir.z = 0 + end + local ctrl = user:get_player_control() + if ctrl.sneak then + dir = vector.multiply(dir, -1) + end + local meta = itemstack:get_meta() + if meta:contains("distance") then + local dist = meta:get_int("distance") + dir = vector.multiply(dir, dist*0.2) + end + pos = vector.add(pos, dir) + obj:set_pos(pos) + end, +}) + + + +minetest.register_tool("testtools:entity_scaler", { + description = S("Entity Visual Scaler"), + inventory_image = "testtools_entity_scaler.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "object" then + return + end + local obj = pointed_thing.ref + if obj:is_player() then + -- No player scaling + return + else + local diff = 0.1 + if user and user:is_player() then + local ctrl = user:get_player_control() + if ctrl.sneak then + diff = -0.1 + end + end + local prop = obj:get_properties() + if not prop.visual_size then + prop.visual_size = { x=1, y=1, z=1 } + else + prop.visual_size = { x=prop.visual_size.x+diff, y=prop.visual_size.y+diff, z=prop.visual_size.z+diff } + if prop.visual_size.x <= 0.1 then + prop.visual_size.x = 0.1 + end + if prop.visual_size.y <= 0.1 then + prop.visual_size.y = 0.1 + end + if prop.visual_size.z <= 0.1 then + prop.visual_size.z = 0.1 + end + end + obj:set_properties(prop) + end + end, +}) + +local selections = {} +local entity_list +local function get_entity_list() + if entity_list then + return entity_list + end + local ents = minetest.registered_entities + local list = {} + for k,_ in pairs(ents) do + table.insert(list, k) + end + table.sort(list) + entity_list = list + return entity_list +end +minetest.register_tool("testtools:entity_spawner", { + description = S("Entity Spawner"), + inventory_image = "testtools_entity_spawner.png", + groups = { testtool = 1, disable_repair = 1 }, + on_place = function(itemstack, user, pointed_thing) + local name = user:get_player_name() + if selections[name] and pointed_thing.type == "node" then + local pos = pointed_thing.above + minetest.add_entity(pos, get_entity_list()[selections[name]]) + end + end, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "object" then + return + end + if user and user:is_player() then + local list = table.concat(get_entity_list(), ",") + local name = user:get_player_name() + local sel = selections[name] or "" + minetest.show_formspec(name, "testtools:entity_list", + "size[9,9]".. + "textlist[0,0;9,8;entity_list;"..list..";"..sel..";false]".. + "button[0,8;4,1;spawn;Spawn entity]" + ) + end + end, +}) + +local function prop_to_string(property) + if type(property) == "string" then + return "\"" .. property .. "\"" + elseif type(property) == "table" then + return tostring(dump(property)):gsub("\n", "") + else + return tostring(property) + end +end + +local property_formspec_data = {} +local property_formspec_index = {} +local selected_objects = {} +local function get_object_properties_form(obj, playername) + if not playername then return "" end + local props = obj:get_properties() + local str = "" + property_formspec_data[playername] = {} + local proplist = {} + for k,_ in pairs(props) do + table.insert(proplist, k) + end + table.sort(proplist) + for p=1, #proplist do + local k = proplist[p] + local v = props[k] + local newline = "" + newline = k .. " = " + newline = newline .. prop_to_string(v) + str = str .. F(newline) + if p < #proplist then + str = str .. "," + end + table.insert(property_formspec_data[playername], k) + end + return str +end + +local editor_formspec_selindex = {} + +local editor_formspec = function(playername, obj, value, sel) + if not value then + value = "" + end + if not sel then + sel = "" + end + local list = get_object_properties_form(obj, playername) + local title + if obj:is_player() then + title = S("Object properties of player “@1”", obj:get_player_name()) + else + local ent = obj:get_luaentity() + title = S("Object properties of @1", ent.name) + end + minetest.show_formspec(playername, "testtools:object_editor", + "size[9,9]".. + "label[0,0;"..F(title).."]".. + "textlist[0,0.5;9,7.5;object_props;"..list..";"..sel..";false]".. + "field[0.2,8.75;8,1;value;"..F(S("Value"))..";"..F(value).."]".. + "button[8,8.5;1,1;submit;"..F(S("Submit")).."]" + ) +end + +minetest.register_tool("testtools:object_editor", { + description = S("Object Property Editor"), + inventory_image = "testtools_object_editor.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + if user and user:is_player() then + local name = user:get_player_name() + + if pointed_thing.type == "object" then + selected_objects[name] = pointed_thing.ref + elseif pointed_thing.type == "nothing" then + -- Use on yourself if pointing nothing + selected_objects[name] = user + else + -- Unsupported pointed thing + return + end + + local sel = editor_formspec_selindex[name] + local val + if selected_objects[name] and selected_objects[name]:get_properties() then + local props = selected_objects[name]:get_properties() + local keys = property_formspec_data[name] + if property_formspec_index[name] and props then + local key = keys[property_formspec_index[name]] + val = prop_to_string(props[key]) + end + end + + editor_formspec(name, selected_objects[name], val, sel) + end + end, +}) + +local ent_parent = {} +local ent_child = {} +local DEFAULT_ATTACH_OFFSET_Y = 11 + +local attacher_config = function(itemstack, user, pointed_thing) + if not (user and user:is_player()) then + return + end + if pointed_thing.type == "object" then + return + end + local name = user:get_player_name() + local ctrl = user:get_player_control() + local meta = itemstack:get_meta() + if ctrl.aux1 then + local rot_x = meta:get_float("rot_x") + if ctrl.sneak then + rot_x = rot_x - math.pi/8 + else + rot_x = rot_x + math.pi/8 + end + if rot_x > 6.2 then + rot_x = 0 + elseif rot_x < 0 then + rot_x = math.pi * (15/8) + end + minetest.chat_send_player(name, S("rotation=@1", minetest.pos_to_string({x=rot_x,y=0,z=0}))) + meta:set_float("rot_x", rot_x) + else + local pos_y + if meta:contains("pos_y") then + pos_y = meta:get_int("pos_y") + else + pos_y = DEFAULT_ATTACH_OFFSET_Y + end + if ctrl.sneak then + pos_y = pos_y - 1 + else + pos_y = pos_y + 1 + end + minetest.chat_send_player(name, S("position=@1", minetest.pos_to_string({x=0,y=pos_y,z=0}))) + meta:set_int("pos_y", pos_y) + end + return itemstack +end + +minetest.register_tool("testtools:object_attacher", { + description = S("Object Attacher"), + inventory_image = "testtools_object_attacher.png", + groups = { testtool = 1, disable_repair = 1 }, + on_place = attacher_config, + on_secondary_use = attacher_config, + on_use = function(itemstack, user, pointed_thing) + if user and user:is_player() then + local name = user:get_player_name() + local selected_object + if pointed_thing.type == "object" then + selected_object = pointed_thing.ref + elseif pointed_thing.type == "nothing" then + selected_object = user + else + return + end + local ctrl = user:get_player_control() + if ctrl.sneak then + if selected_object:get_attach() then + selected_object:set_detach() + minetest.chat_send_player(name, S("Object detached!")) + else + minetest.chat_send_player(name, S("Object is not attached!")) + end + return + end + local parent = ent_parent[name] + local child = ent_child[name] + local ename = S("") + if not parent then + parent = selected_object + ent_parent[name] = parent + elseif not child then + child = selected_object + ent_child[name] = child + end + local entity = selected_object:get_luaentity() + if entity then + ename = entity.name + elseif selected_object:is_player() then + ename = selected_object:get_player_name() + end + if selected_object == parent then + minetest.chat_send_player(name, S("Parent object selected: @1", ename)) + elseif selected_object == child then + minetest.chat_send_player(name, S("Child object selected: @1", ename)) + end + if parent and child then + if parent == child then + minetest.chat_send_player(name, S("Can't attach an object to itself!")) + ent_parent[name] = nil + ent_child[name] = nil + return + end + local meta = itemstack:get_meta() + local y + if meta:contains("pos_y") then + y = meta:get_int("pos_y") + else + y = DEFAULT_ATTACH_OFFSET_Y + end + local rx = meta:get_float("rot_x") or 0 + local offset = {x=0,y=y,z=0} + local angle = {x=rx,y=0,z=0} + child:set_attach(parent, "", offset, angle) + local check_parent = child:get_attach() + if check_parent then + minetest.chat_send_player(name, S("Object attached! position=@1, rotation=@2", + minetest.pos_to_string(offset), minetest.pos_to_string(angle))) + else + minetest.chat_send_player(name, S("Attachment failed!")) + end + ent_parent[name] = nil + ent_child[name] = nil + end + end + end, +}) + +-- Use loadstring to parse param as a Lua value +local function use_loadstring(param, player) + -- For security reasons, require 'server' priv, just in case + -- someone is actually crazy enough to run this on a public server. + local privs = minetest.get_player_privs(player:get_player_name()) + if not privs.server then + return false, "You need 'server' privilege to change object properties!" + end + if not param then + return false, "Failed: parameter is nil" + end + --[[ DANGER ZONE ]] + -- Interpret string as Lua value + local func, errormsg = loadstring("return (" .. param .. ")") + if not func then + return false, "Failed: " .. errormsg + end + + -- Apply sandbox here using setfenv + setfenv(func, {}) + + -- Run it + local good, errOrResult = pcall(func) + if not good then + -- A Lua error was thrown + return false, "Failed: " .. errOrResult + end + + -- errOrResult will be the value + return true, errOrResult +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if not (player and player:is_player()) then + return + end + if formname == "testtools:entity_list" then + local name = player:get_player_name() + if fields.entity_list then + local expl = minetest.explode_textlist_event(fields.entity_list) + if expl.type == "DCL" then + local pos = vector.add(player:get_pos(), {x=0,y=1,z=0}) + selections[name] = expl.index + minetest.add_entity(pos, get_entity_list()[expl.index]) + return + elseif expl.type == "CHG" then + selections[name] = expl.index + return + end + elseif fields.spawn and selections[name] then + local pos = vector.add(player:get_pos(), {x=0,y=1,z=0}) + minetest.add_entity(pos, get_entity_list()[selections[name]]) + return + end + elseif formname == "testtools:object_editor" then + local name = player:get_player_name() + if fields.object_props then + local expl = minetest.explode_textlist_event(fields.object_props) + if expl.type == "DCL" or expl.type == "CHG" then + property_formspec_index[name] = expl.index + + local props = selected_objects[name]:get_properties() + local keys = property_formspec_data[name] + if (not property_formspec_index[name]) or (not props) then + return + end + local key = keys[property_formspec_index[name]] + editor_formspec_selindex[name] = expl.index + editor_formspec(name, selected_objects[name], prop_to_string(props[key]), expl.index) + return + end + end + if fields.submit then + local props = selected_objects[name]:get_properties() + local keys = property_formspec_data[name] + if (not property_formspec_index[name]) or (not props) then + return + end + local key = keys[property_formspec_index[name]] + if not key then + return + end + local success, str = use_loadstring(fields.value, player) + if success then + props[key] = str + else + minetest.chat_send_player(name, str) + return + end + selected_objects[name]:set_properties(props) + local sel = editor_formspec_selindex[name] + editor_formspec(name, selected_objects[name], prop_to_string(props[key]), sel) + return + end + end +end) diff --git a/games/minimal/mods/testtools/mod.conf b/games/minimal/mods/testtools/mod.conf new file mode 100644 index 000000000..cde1b2685 --- /dev/null +++ b/games/minimal/mods/testtools/mod.conf @@ -0,0 +1,2 @@ +name = testtools +description = Some tools to directly manipulate nodes and entities. Great for development and testing diff --git a/games/minimal/mods/testtools/textures/testtools_entity_rotator.png b/games/minimal/mods/testtools/textures/testtools_entity_rotator.png new file mode 100644 index 0000000000000000000000000000000000000000..17ebb2d35a89a13ccfd0f5bac53020c20d6390fb GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ah@)YAr*{kCor-x81k^Z|L z>-E2jU;hir|S8q+6U76}5_UGSR!`EDms*%A3b2d79c`Qh~`jk!6 zBj|v9FRQ`aI6sesdrY?Gr=CYkm~W4gk={I$B{}VLu9*4t!cQglwK>mdKI;Vst0Nn;f=>Px# literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testtools/textures/testtools_entity_spawner.png b/games/minimal/mods/testtools/textures/testtools_entity_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..6199e0145fdb4252ba60c8bf6845a85f7104bf0e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr*{kCN;7hFyL`vKhW^^ z?=R2S`mH`Md~N1(+4ikG?Y-;S4ORJPGkJe&yN{1nQ*)ha-7Sm*nHd=7mwzn|Pyg2lbPt24tDnm{r-UW|C~!&j literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testtools/textures/testtools_falling_node_tool.png b/games/minimal/mods/testtools/textures/testtools_falling_node_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..30099a7ef4201f6f6bfe8e8c52c3a5a371c6f615 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*|t2iX1enUXDj{CQ?F zLoMubeF~4LGEV}R;w%M;BW))xUSeR8Si|OE!oP&kCDY+J2eW};T(qH~=emUs#!9PB nTgTe~DWM4f`a?yO literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testtools/textures/testtools_object_editor.png b/games/minimal/mods/testtools/textures/testtools_object_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ce9cecdb5919c281848625c5532b808cdd4fe7 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr*{!Cm!T%2;gz9{{HNY z-a_e>+M-%d-8me!_WogCnBeJiHSKW#kKplKo_R}8)Z{S+Hb|6Y9oTeB`oXK~YElB1 z4p{T<*ye2d+w@F`<XZ)VJs{4Hd<{lM9rXA`V0{1jJgu-6HmZTdi8<;z*m e=Pd2dJ~JFk?Y~=7lN}Cp27{-opUXO@geCx!4n@ZR literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testtools/textures/testtools_object_mover.png b/games/minimal/mods/testtools/textures/testtools_object_mover.png new file mode 100644 index 0000000000000000000000000000000000000000..8b14e9fb2a680154ede93137b9a3928f6f4c9d7e GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr*{gCKz%xIPkDszWwu= zjnm)2FM(Wn8=WM!?rANEF`TSw=(kN-L!HMu5QHW;!rZL8Jv zW&X0M!F>DSVW+d*Una7Vdud`{{%u8&cL)@lLejRR3)saP|u; Z!^#=iCm8NZ%L84&;OXk;vd$@?2>^_nK^p)7 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testtools/textures/testtools_param2tool.png b/games/minimal/mods/testtools/textures/testtools_param2tool.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc66357589142a637ad07b4a34e98b8e475bf87 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Zk{fVAr*|t3sisf_jq2bs1h_% zyQSd6%fakvz~J(D^5Uh8J46NE@=9f@op1OrlIfPQB*ZwA!S-w7aTcBf-JH@6BFoem Z7=kvodCdBH|2xn`22WQ%mvv4FO#n+?CY%5O literal 0 HcmV?d00001 diff --git a/games/minimal/mods/testtools/textures/testtools_remover.png b/games/minimal/mods/testtools/textures/testtools_remover.png new file mode 100644 index 0000000000000000000000000000000000000000..73f14cd549949a103d0799da7bdb64c03e8f3382 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*|t3sisfyU*G1>~da0 z>;J+|;VU&&f=-63EF{|=T=lsjU}U1qP-+tVu7+j4-Npug!HKgPP5fMsWFBMASS0yy cOCtlr$-d5G>mLN<1I=XcboFyt=akR{0K&;ETmS$7 literal 0 HcmV?d00001 diff --git a/games/minimal/mods/tiled/init.lua b/games/minimal/mods/tiled/init.lua new file mode 100644 index 000000000..68ead8e3a --- /dev/null +++ b/games/minimal/mods/tiled/init.lua @@ -0,0 +1,33 @@ +minetest.register_node("tiled:tiled", { + description = "Tiled Node (world-aligned)", + tiles = {{ + name = "tiled_tiled.png", + align_style = "world", + scale = 8, + }}, + groups = {cracky=3}, +}) + +minetest.register_node("tiled:tiled_n", { + description = "Tiled Node (node-aligned)", + tiles = {{ + name = "tiled_tiled.png", + align_style = "node", + scale = 8, + }}, + groups = {cracky=3}, +}) + +stairs.register_stair_and_slab("tiled_n", "tiled:tiled", + {cracky=3}, + {{name="tiled_tiled.png", align_style="node", scale=8}}, + "Tiled Stair (node-aligned)", + "Tiled Slab (node-aligned)") + +stairs.register_stair_and_slab("tiled", "tiled:tiled", + {cracky=3}, + {{name="tiled_tiled.png", align_style="world", scale=8}}, + "Tiled Stair (world-aligned)", + "Tiled Slab (world-aligned)") + + diff --git a/games/minimal/mods/tiled/mod.conf b/games/minimal/mods/tiled/mod.conf new file mode 100644 index 000000000..78b19f93b --- /dev/null +++ b/games/minimal/mods/tiled/mod.conf @@ -0,0 +1,3 @@ +name = tiled +description = Add nodes with a special texture that spans multiple nodes (aka "world-aligned") +depends = stairs diff --git a/games/minimal/mods/tiled/textures/tiled_tiled.png b/games/minimal/mods/tiled/textures/tiled_tiled.png new file mode 100644 index 0000000000000000000000000000000000000000..363a264870a5927f03e7fd4c74e22066cf09d403 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDIp#Yx{S0Fue=FBr^&in@gAcx`q zo1Lue3=E9Uo-U3d6^w6ZI_4cR5OMLWW{hgBy&Jcn>n!7{XH0=le#b9Wo2OT&rC6`l zZ6cNLHsgt5!WV;2opN_i8^zf_GHScV^L5|nmC*w6q7#lCOmpgcy{4f~r(qpK6+@EL z1Z{^clEMtO46oS)XZ~Bp+QXI*_b^ZS@`HQn0>RGARiYUOSR1tUGR_qIWKCf(0x~AN zWc$syVfBYEe!b>$A97ah{4Ct?{@`n76$Va*cK#20G9P?ml#6y)%r7Nn^5cNngYZVi zCp-OYCS){l*5_SKI96Sy^ONn5)(Lio6YQT3iVFX`bIs#ZV~v9RnICz-C$qmf?7`w- zH-UeP{f*msvA>yrf;ii5Ed(lVtSMMmdKI;Vst0LkgE Ah5!Hn literal 0 HcmV?d00001 diff --git a/games/minimal/mods/unittests/crafting.lua b/games/minimal/mods/unittests/crafting.lua new file mode 100644 index 000000000..eff13ce09 --- /dev/null +++ b/games/minimal/mods/unittests/crafting.lua @@ -0,0 +1,120 @@ +-- Test minetest.clear_craft function +local function test_clear_craft() + minetest.log("info", "[unittests] Testing minetest.clear_craft") + -- Clearing by output + minetest.register_craft({ + output = "foo", + recipe = {{"bar"}} + }) + minetest.register_craft({ + output = "foo 4", + recipe = {{"foo", "bar"}} + }) + assert(#minetest.get_all_craft_recipes("foo") == 2) + minetest.clear_craft({output="foo"}) + assert(minetest.get_all_craft_recipes("foo") == nil) + -- Clearing by input + minetest.register_craft({ + output = "foo 4", + recipe = {{"foo", "bar"}} + }) + assert(#minetest.get_all_craft_recipes("foo") == 1) + minetest.clear_craft({recipe={{"foo", "bar"}}}) + assert(minetest.get_all_craft_recipes("foo") == nil) +end + +-- Test minetest.get_craft_result function +local function test_get_craft_result() + minetest.log("info", "[unittests] Testing minetest.get_craft_result") + + -- normal + local input = { + method = "normal", + width = 2, + items = {"", "unittests:coal_lump", "", "unittests:stick"} + } + minetest.log("info", "[unittests] torch crafting input: "..dump(input)) + local output, decremented_input = minetest.get_craft_result(input) + minetest.log("info", "[unittests] torch crafting output: "..dump(output)) + minetest.log("info", "[unittests] torch crafting decremented input: "..dump(decremented_input)) + assert(output.item) + minetest.log("info", "[unittests] torch crafting output.item:to_table(): "..dump(output.item:to_table())) + assert(output.item:get_name() == "unittests:torch") + assert(output.item:get_count() == 4) + + -- fuel + input = { + method = "fuel", + width = 1, + items = {"unittests:coal_lump"} + } + minetest.log("info", "[unittests] coal fuel input: "..dump(input)) + output, decremented_input = minetest.get_craft_result(input) + minetest.log("info", "[unittests] coal fuel output: "..dump(output)) + minetest.log("info", "[unittests] coal fuel decremented input: "..dump(decremented_input)) + assert(output.time) + assert(output.time > 0) + + -- cooking + input = { + method = "cooking", + width = 1, + items = {"unittests:iron_lump"} + } + minetest.log("info", "[unittests] iron lump cooking input: "..dump(output)) + output, decremented_input = minetest.get_craft_result(input) + minetest.log("info", "[unittests] iron lump cooking output: "..dump(output)) + minetest.log("info", "[unittests] iron lump cooking decremented input: "..dump(decremented_input)) + assert(output.time) + assert(output.time > 0) + assert(output.item) + minetest.log("info", "[unittests] iron lump cooking output.item:to_table(): "..dump(output.item:to_table())) + assert(output.item:get_name() == "unittests:steel_ingot") + assert(output.item:get_count() == 1) + + -- tool repair (repairable) + input = { + method = "normal", + width = 2, + -- Using a wear of 60000 + items = {"unittests:repairable_tool 1 60000", "unittests:repairable_tool 1 60000"} + } + minetest.log("info", "[unittests] repairable tool crafting input: "..dump(input)) + output, decremented_input = minetest.get_craft_result(input) + minetest.log("info", "[unittests] repairable tool crafting output: "..dump(output)) + minetest.log("info", "[unittests] repairable tool crafting decremented input: "..dump(decremented_input)) + assert(output.item) + minetest.log("info", "[unittests] repairable tool crafting output.item:to_table(): "..dump(output.item:to_table())) + assert(output.item:get_name() == "unittests:repairable_tool") + -- Test the wear value. + -- See src/craftdef.cpp in Minetest source code for the formula. The formula to calculate + -- the value 51187 is: + -- 65536 - ((65536-60000)+(65536-60000)) + floor(additonal_wear * 65536 + 0.5) = 51187 + -- where additional_wear = 0.05 + assert(output.item:get_wear() == 51187) + assert(output.item:get_count() == 1) + + -- failing tool repair (unrepairable) + input = { + method = "normal", + width = 2, + items = {"unittests:unrepairable_tool 1 60000", "unittests:unrepairable_tool 1 60000"} + } + minetest.log("info", "[unittests] unrepairable tool crafting input: "..dump(input)) + output, decremented_input = minetest.get_craft_result(input) + minetest.log("info", "[unittests] unrepairable tool crafting output: "..dump(output)) + minetest.log("info", "[unittests] unrepairable tool crafting decremented input: "..dump(decremented_input)) + assert(output.item) + minetest.log("info", "[unittests] unrepairable tool crafting output.item:to_table(): "..dump(output.item:to_table())) + -- unrepairable tool must not yield any output + assert(output.item:get_name() == "") + +end + +function unittests.test_crafting() + test_clear_craft() + test_get_craft_result() + minetest.log("action", "[unittests] Crafting tests passed!") + return true +end + diff --git a/games/minimal/mods/unittests/crafting_prepare.lua b/games/minimal/mods/unittests/crafting_prepare.lua new file mode 100644 index 000000000..a09734827 --- /dev/null +++ b/games/minimal/mods/unittests/crafting_prepare.lua @@ -0,0 +1,88 @@ +-- Registering some dummy items and recipes for the crafting tests + +minetest.register_craftitem("unittests:torch", { + description = "Crafting Test Item: Torch", + inventory_image = "unittests_torch.png", + + groups = { dummy = 1 }, +}) +minetest.register_craftitem("unittests:coal_lump", { + description = "Crafting Test Item: Coal Lump", + inventory_image = "unittests_coal_lump.png", + + groups = { dummy = 1 }, +}) +minetest.register_craftitem("unittests:stick", { + description = "Crafting Test Item: Stick", + inventory_image = "unittests_stick.png", + + groups = { dummy = 1 }, +}) +minetest.register_craftitem("unittests:iron_lump", { + description = "Crafting Test Item: Iron Lump", + inventory_image = "unittests_iron_lump.png", + + groups = { dummy = 1 }, +}) +minetest.register_craftitem("unittests:steel_ingot", { + description = "Crafting Test Item: Steel Ingot", + inventory_image = "unittests_steel_ingot.png", + + groups = { dummy = 1 }, +}) + +-- Recipes for tests: Normal crafting, cooking and fuel + +minetest.register_craft({ + output = 'unittests:torch 4', + recipe = { + {'unittests:coal_lump'}, + {'unittests:stick'}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "unittests:steel_ingot", + recipe = "unittests:iron_lump", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "unittests:coal_lump", + burntime = 40, +}) + +-- Test tool repair +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.05, +}) + +-- Test the disable_repair=1 group +minetest.register_tool("unittests:unrepairable_tool", { + description = "Crafting Test Item: Unrepairable Tool", + inventory_image = "unittests_unrepairable_tool.png", + tool_capabilities = { + groupcaps = { + cracky = { + times = {3, 2, 1}, + } + } + }, + groups = { disable_repair = 1, dummy = 1 } +}) + +minetest.register_tool("unittests:repairable_tool", { + description = "Crafting Test Item: Repairable Tool", + inventory_image = "unittests_repairable_tool.png", + tool_capabilities = { + groupcaps = { + cracky = { + times = {3, 2, 1}, + } + } + }, + + groups = { dummy = 1 }, +}) diff --git a/games/minimal/mods/unittests/init.lua b/games/minimal/mods/unittests/init.lua new file mode 100644 index 000000000..6c1728420 --- /dev/null +++ b/games/minimal/mods/unittests/init.lua @@ -0,0 +1,16 @@ +unittests = {} + +local modpath = minetest.get_modpath("unittests") +dofile(modpath .. "/random.lua") +dofile(modpath .. "/player.lua") +dofile(modpath .. "/crafting_prepare.lua") +dofile(modpath .. "/crafting.lua") + +if minetest.settings:get_bool("devtest_unittests_autostart", false) then + unittests.test_random() + unittests.test_crafting() + minetest.register_on_joinplayer(function(player) + unittests.test_player(player) + end) +end + diff --git a/games/minimal/mods/unittests/mod.conf b/games/minimal/mods/unittests/mod.conf new file mode 100644 index 000000000..0d5e3c959 --- /dev/null +++ b/games/minimal/mods/unittests/mod.conf @@ -0,0 +1,2 @@ +name = unittests +description = Adds automated unit tests for the engine diff --git a/games/minimal/mods/test/player.lua b/games/minimal/mods/unittests/player.lua similarity index 69% rename from games/minimal/mods/test/player.lua rename to games/minimal/mods/unittests/player.lua index 563d0d985..10781a95f 100644 --- a/games/minimal/mods/test/player.lua +++ b/games/minimal/mods/unittests/player.lua @@ -1,8 +1,3 @@ --- --- Minimal Development Test --- Mod: test --- - -- -- HP Change Reasons -- @@ -19,23 +14,9 @@ local function run_hpchangereason_tests(player) expect = { df = 3458973454, type = "fall", from = "mod" } player:set_hp(10, { type = "fall", df = 3458973454 }) assert(expect == nil) + + player:set_hp(20) end -minetest.register_on_player_hpchange(function(player, hp, reason) - if not expect then - return - end - - for key, value in pairs(reason) do - assert(expect[key] == value) - end - - for key, value in pairs(expect) do - assert(reason[key] == value) - end - - expect = nil -end) - local function run_player_meta_tests(player) local meta = player:get_meta() @@ -48,7 +29,6 @@ local function run_player_meta_tests(player) assert(meta2:get_string("foo") == "bar") assert(meta2:get("foo") == "bar") assert(meta:equals(meta2)) - assert(player:get_attribute("foo") == "bar") meta:set_string("bob", "dillan") assert(meta:get_string("foo") == "bar") @@ -58,8 +38,6 @@ local function run_player_meta_tests(player) assert(meta2:get_string("bob") == "dillan") assert(meta2:get("bob") == "dillan") assert(meta:equals(meta2)) - assert(player:get_attribute("foo") == "bar") - assert(player:get_attribute("bob") == "dillan") meta:set_string("foo", "") assert(not meta:contains("foo")) @@ -68,9 +46,28 @@ local function run_player_meta_tests(player) assert(meta:equals(meta2)) end -local function run_player_tests(player) +function unittests.test_player(player) + minetest.register_on_player_hpchange(function(player, hp, reason) + if not expect then + return + end + + for key, value in pairs(reason) do + assert(expect[key] == value) + end + + for key, value in pairs(expect) do + assert(reason[key] == value) + end + + expect = nil + end) + run_hpchangereason_tests(player) run_player_meta_tests(player) - minetest.chat_send_all("All tests pass!") + local msg = "Player tests passed for player '"..player:get_player_name().."'!" + minetest.chat_send_all(msg) + minetest.log("action", "[unittests] "..msg) + return true end -minetest.register_on_joinplayer(run_player_tests) + diff --git a/games/minimal/mods/unittests/random.lua b/games/minimal/mods/unittests/random.lua new file mode 100644 index 000000000..f94f0a88e --- /dev/null +++ b/games/minimal/mods/unittests/random.lua @@ -0,0 +1,10 @@ +function unittests.test_random() + -- Try out PseudoRandom + minetest.log("action", "[unittests] Testing PseudoRandom ...") + local pseudo = PseudoRandom(13) + assert(pseudo:next() == 22290) + assert(pseudo:next() == 13854) + minetest.log("action", "[unittests] PseudoRandom test passed!") + return true +end + diff --git a/games/minimal/mods/unittests/textures/unittests_coal_lump.png b/games/minimal/mods/unittests/textures/unittests_coal_lump.png new file mode 100644 index 0000000000000000000000000000000000000000..f460d909ef35804cd8d640574bf879646947ef97 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar*{UCNZ)xIPx(6o>8}~ z|K)$ioy9G}DXVj4>Ur?ou3&da_*<84{~+pYZ1X!dN$HG$k8D8!p7fNl9+Ty&mrSj_s3lft2$!D z1@*3N%En1LybLN)qN~4p-jD%W#^CAd=d#Wzp$Py& C$1{-t literal 0 HcmV?d00001 diff --git a/games/minimal/mods/unittests/textures/unittests_repairable_tool.png b/games/minimal/mods/unittests/textures/unittests_repairable_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..46fbbaa74530c32ef3b02fb0e4fdd7f606fb4ef0 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar*{sCpWSkFc5J5{NLey z`{v$OJ)cDntD@p;G~P{M>Hl7R@JxYx$wEF?*U+133tATCOz7U^n14z7#}zidh)zkC z8~4vD9QHDa$o_jM?h%`08Mh=y9b2j$n{CcS$F|S$4_@wLc($A;?aH1!1)!A-p00i_ I>zopr0Ji-*QUCw| literal 0 HcmV?d00001 diff --git a/games/minimal/mods/unittests/textures/unittests_steel_ingot.png b/games/minimal/mods/unittests/textures/unittests_steel_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..6977696a23832867b5c0499997dfcfc0d71777db GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr*{!`WV>`IPkE1zO_f$ z|MdB7dpF$(^B1~fWNDE8Mvmd|kJ@uJ4 zC~eT_aN+vFc(ZfL+vo*}W#>qgTe~DWM4f D!SOfD literal 0 HcmV?d00001 diff --git a/games/minimal/mods/unittests/textures/unittests_unrepairable_tool.png b/games/minimal/mods/unittests/textures/unittests_unrepairable_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..c676213a5de29a6e3c656f29bead261595ed63ca GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr*{sCo!@eaNuEK{{G+p z%lzAmj&D%X_Lj0u;|+>enR@N_|CP^W3bnf5J#TYOmgJeS=LFBBMQ0SuPx4x9WMt4T zZf5*eF6CojBxP}D`V7X0OB&cDdoDN_-idj{^v(K0*?v2}%Uky6pPdf0kHOQ`&t;uc GLK6T-H8}PF literal 0 HcmV?d00001 diff --git a/games/minimal/mods/util_commands/init.lua b/games/minimal/mods/util_commands/init.lua new file mode 100644 index 000000000..ad8d3f9ba --- /dev/null +++ b/games/minimal/mods/util_commands/init.lua @@ -0,0 +1,137 @@ +minetest.register_chatcommand("hotbar", { + params = "", + description = "Set hotbar size", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + local size = tonumber(param) + if not size then + return false, "Missing or incorrect size parameter!" + end + local ok = player:hud_set_hotbar_itemcount(size) + if ok then + return true + else + return false, "Invalid item count!" + end + end, +}) + +minetest.register_chatcommand("hp", { + params = "", + description = "Set your health", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + local hp = tonumber(param) + if not hp then + return false, "Missing or incorrect hp parameter!" + end + player:set_hp(hp) + return true + end, +}) + +minetest.register_chatcommand("zoom", { + params = "[]", + description = "Set or display your zoom_fov", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + if param == "" then + local fov = player:get_properties().zoom_fov + return true, "zoom_fov = "..tostring(fov) + end + local fov = tonumber(param) + if not fov then + return false, "Missing or incorrect zoom_fov parameter!" + end + player:set_properties({zoom_fov = fov}) + fov = player:get_properties().zoom_fov + return true, "zoom_fov = "..tostring(fov) + end, +}) + + + +local s_infplace = minetest.settings:get("devtest_infplace") +if s_infplace == "true" then + infplace = true +elseif s_infplace == "false" then + infplace = false +else + infplace = minetest.settings:get_bool("creative_mode", false) +end + +minetest.register_chatcommand("infplace", { + params = "", + description = "Toggle infinite node placement", + func = function(name, param) + infplace = not infplace + if infplace then + minetest.chat_send_all("Infinite node placement enabled!") + minetest.log("action", "Infinite node placement enabled") + else + minetest.chat_send_all("Infinite node placement disabled!") + minetest.log("action", "Infinite node placement disabled") + end + return true + end, +}) + +minetest.register_chatcommand("detach", { + params = "[]", + description = "Detach all objects nearby", + func = function(name, param) + local radius = tonumber(param) + if type(radius) ~= "number" then + radius = 8 + end + if radius < 1 then + radius = 1 + end + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + local objs = minetest.get_objects_inside_radius(player:get_pos(), radius) + local num = 0 + for o=1, #objs do + if objs[o]:get_attach() then + objs[o]:set_detach() + num = num + 1 + end + end + return true, string.format("%d object(s) detached.", num) + end, +}) + + +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + if placer and placer:is_player() then + return infplace + end +end) + +-- Don't pick up if the item is already in the inventory +local old_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() or not infplace then + return old_handle_node_drops(pos, drops, digger) + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end +end diff --git a/games/minimal/mods/util_commands/mod.conf b/games/minimal/mods/util_commands/mod.conf new file mode 100644 index 000000000..fea6dd3e9 --- /dev/null +++ b/games/minimal/mods/util_commands/mod.conf @@ -0,0 +1,2 @@ +name = util_commands +description = Random server commands to make testing easier and more convenient diff --git a/games/minimal/screenshot.png b/games/minimal/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7324883f6c29aafd8e50f3eac6c8515c8e39b866 GIT binary patch literal 133364 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

4%yUDEE|K!g0i|NJd+q22I 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 |6GO9W4VB4JgCbKLjfAXx8c z%F0?dt*%PjHZIQNcG2=U;SsT3Tj$%}ML6m!`{@3P6)0FQwJUpjR+W8c0tV})^*GM- z7P+uB+PPPTUq02yNlX}`-0Q{#Pmm#A8c#gq6ajJ4d-B=+aStfNf30nPHShmcHmGTY zopZVkMT$iPSQ`FF+x5e`n~RV;CzfY@K1)!~_J&OPWllDMQbf9l#hvZ6@@K1BSv1Ut z5f*}lwspMRjotA0t=AvdwR}$@eRiP(5NbgTKD!_(uv_NA-((r4k5e^>ZNw_)>7 zp+EFl^r?Mxutep5<^RXO6#m)@t)E3tZ=wzOEnAJPpz|#k!U)L z2t$YpPH+eq5j;r9c$7MifY5;Ka7RdqFMRTnDi|NIrncj04oyXRgDu|1JE- z|2!Oi1O5boXC?fH`d}e{#(!5i_WF5L)Stvff(4FkmcQn+&2!UX*p~z0Ei$ANurunqnb1 zR#~eX007SzMNv!#qqtX=M>HJ@*%;HyEa9pn4-QWk^WJKZq03Tdb+=fqVCA?Xx+xO#dyWNK! z@=AhJK$yqGv}-JK5EI=SWJ^E@i{k0R#riub{CA`13jxmB_K-&zWpOb|&+aZxzWiYI z&Z2%?FK^vez~-QxmUjhTjPT+J^S>?v>Z`FN&BT@SO1^iYn9QLs6u;@y>$Y8fBbi zaa?Gu+qKdv6uW%97tsJ0_jU<)R3IY_0yds;?}0(;L3zi$b1^5AS>_!eLJ$pFcHO#* zMRs_yo}YJ3*|Qu(q!HNpNwqT@_Psef>A-2sur=CBXRHg@PDaD31t!RF7$*sD+P>-B z-MhyQkSq<20w$a+jlUPO!Qk89dGyH_;OwjMhahwCeg8H5dp`sJw1lZf|GWONUkHES z55v_LviH96vAx&z0Bhp`0!v&k>+-yr4F|F@%ViJ2P=>3r_0G9q$K$M12qQe6#6_NV zQk|XEMn{A|Bv51f5d1L9mGTMU2qPYYw}FY&wsKSyCO8DX?==c^I7}%cN(PZ&>jFZ= zlhA6tntP)hraT1Smo%VYgE9uXPWNl;j3=Bly(B;M2e0(Xvz&ROi^13<&zX7Z@^+dG zf{!(|vQ~@3HBe6klEw(eIOCM#=`0V<)a#ZD$P-qdg;r@qosmEZ^T8!4ky`VF?e1+D zO}eVhVkqM2gGXm=W6F8kdCeHfGgs9m2){8%We;a(Ew-9bpo|8qxuEl^pAItwzEgIz z$-#s7L2Dny>058#(;>9IR*jdfNn#32cddytYL$(boILjHlcRd}Nkn7D1Pi^x9PrcG%$L{{%cMgxrD8?xE=gZn^5Cm5z5*V1iPa@WI-O=fsB?P>?ba0?M z-_#{yG%4uWaXH%J!TMo7KoAtsICTeGI|jKB^!B7kqfs2^8k>IEtrrc6F^)Ya=)%r6 z;dofY#@O@Yc5^GX+PEe*xbNE_mHQ30b_=5okNIGd)=TBJrih%Lx9!>r@Y*=8H}$)( zz5exevhwe|-dwzJ;lZQVo$f#RJUskzoCB%ggNN|&9_%UjhyDNh&%@{bApE)i5We+y zw}0$gpQV$6v1hMeUN#HPSX-IdW@eSfAs*+WvgrVmamF{c3agBEIxFb%q-WUGtvfv} z>skXfMA%@oY3*cGEa#0g!MdJe)HhmNi+S$@=_G9J4mm{tV8I<8HZbdw=)kIF6?2s4A7zEyZqQn4g{X zW#3BZnyO_uw#IH93*L$10<8h>&M>L9`Bu|1d;UZkx8;-{VXQ>Lo zN?kAOzHNC#jEBRMg|i?cKAjEX7=o4MyiFs9jaV(D_nz@UFxS>7*%_}bxc%*|zJmZD zqL7MIOE+KE^OMH(a*&F0)oSN#2;FII&Z@rFUGJCoVs%O%z58f+SYEk&@i=TNpq>Z} z9SYWaWId$-ImZ{#H(uHK!Z!Lj)32J<1_3lZliqIo(>a%LT z5&ODBqjBmI-GdVfw>@68ZA7BQ{5a!XQcNPj&@iscdDZ9cZJxsH;$~ty-;{AO zeet0Dr@!3)0OSrn%|N^cyAFOCzUO1`OMejlp&Rh~rtquf@Y^;Y@J{P?EsF`m;J3Cn zt=Eva;W);DIby)t>1aktYT*Cb$UlJDwxsL2XgH#|J2^O2vs}ww+g#iC*yq}|ZQJIt zeKwbk()3WOvoRcTSBz`ld{8x=PjA^G{y)F>d(Ci?$9BLJunaAm>iy@BZIl?0Q>$ll z9<(XQ%17&bum;X*R+iM;kQIz)@a~I4E^;~fhlkeMIM~5@iGu|JG*!0WPDvRQJ3?^c zTb$Ezz>xI4Kf7!wMRIZ^qq_%1p}>FW=RVNKaQCLAB?{gLACz_u2SlRNh9L6f>a3j( zA$iX!K=fhTA`*g4l0v~iI}Iemi>fv{j!uGLY9TPnZ9qC&7^0QFZ)LMCs#!A3yz}Hz z@F z3}_uV%*t@3KL6sd-F<%7s?YSAm__bx?@ybj@8(qd)^3|G!2~h_6vHxeXW_FC_+Nj< z{{dot+xvrczCEa#6Xz1z5e$X5ZhC3pB%VC^0msKpGp|u|IK8=fvmZv^PGbnfdI>v? z6AzjTYp>2Wb;Ba!o~&NHc>U>}tY!_t(B2()w-W~SdUbW`??f2Cb9-191zDm^PO--K zCNR#1apFwXt5s8!8Rrkj_H4n0x*!Al8vOGAF8)K$|NqPGlK?XAep3JVCtvvuRO)6~ zSnUow#dtou-M=*$VRDf zmb;+s8-<)X{?;1?l5Op9m~vtox)N{#B!kc#_or{Yqt9nx`Em6bxF&%8D(D0FHuxid z5Ip=3!4?0Rf8f>M^@IJFezfY|G>CD4!Twez(;$3XO>~g}qDLD-h`}Y%)}cjjrL2o) zmQ!K9a^541QVLxH48h~;%fU>b^vhZ0ECyIFtGuZef;GJ!Wv{w+q6GptOkB-O#1Mo(l*lxZQS)Q5Na2w-!04RKY2s_~zlT>)UaV z6z9?^Z7s#XYPUXLJUkq=mGh<0qrEym%QLngPkAFUMtwj~KoacJN9UX+L!%=;=+JG4 zhx>NY#=(#VXu_aFv!=-kigB1)jlVdaKKre{9ZUWit`#xqlB0`IjuJtAjl}cy&D+kO_A{oM~7f!Sq0jYeH%&>1Kh(wT0>3`vRdY5 zvRztM+1i`i!%-&j4!DtCz0 zRt}0;1Y;-N{iuHMv2I5|zgPTE!N2g+;4l6SKm+(5_(MMlUi<@q;6L|H9|QOo|0`dc zUE}*#yV;_e=L-x;Y6PH2FbpB2Qn8@TS=qJ{z*slJ+k~eyb773hN@5Y4CbhlM9t4L} z>Y6aZF_oRh3@1f(ba!`qUNNPT&DBql^6=K+M2%J~M~skno;^ME2VB6q$_dH?QmZOk zES3<6QA<6HT|2=nwV4DFn4smNz(4Ybo&+4c3*FwhXtXtxbU7_RN;#nFxeeyciz9%L zKw6@vtn#W7#+fXojiO?Olj%8<40;Qk#U~R-Wl!Ch<;(<~l_D?m<34Pz=i6O7j&2&A zoD47Nq{lZ8hk8~tq*T&rr;QrVmrZ+;52sT)hb&L=nv%vamWla!8N6>_pWN^5V;RT0 z_U5mC+GspRK-OTl_xJaG-|l8bgf4%$*WY+{N#vwsFc{787aR1~uIWF?`7NhnSuTpQ zhyZA%!xx!<^YG@24&UIh$p(*^FUcm4xGXzG#}6U*{{Z zs$nS}4%^v$B~=IKm(iD^7$5!Y`{!R@H|K28G}o8&9-JP2b^7e#rWUyh_Wt&MIt?=h zpXOJyYQ7+pgO@bo_7n$4bw9zQ51O+pxc)kA+DFwx^B7$Jeir`@eD?oqB28Z!>fepu z{)4kW`2F=?qgb?^xxMYvw2wW`v^RabAL=}#fp(p;#`&nz1fEX0l-Y7d^^{WJEXR~U zAsD7;yLWD)S-~ksotmVb$}FGNwYL%bG;Bg@$8M~uh1He;uv}N#SZ5p|SWt0(-T(rX zin0$=iY#rKEzzVt%~OrO4(N{SY9Dje1@0zaLf<>#~WTF zl})4RI#pDq(>}!~hD6{F#}N}&=H*Fg-HTD0{r#!PvsyHml7cbqQfm<=!Ae5sS;@A$ zF@i8#H1AI~l-rBzWe2l??dOkGro$1^U8ePW$wzyuq;R;J9@e%nC~Z17c4Wmt$3 z>Pekn%-d6ozxmV8XHCU9p5mZ`DKd@$V;p&DafCdBDfz&W&U;*9 z26@KWobz`4$Zuzy=OQ!H&Eg$H3#LY`PnNlWg_~}U^b|4#7Lg&1x&SiPwJ~5*_?kZd-wgT`LaA+ zfAaC?{g1al`q$$xl&}>4pD#lP+&y?W#^axz{mDQ5_>X_~&i7AGKTemG*3TYY*{IJq zjnTS2=sZUWOV*_g=|!QWaMo5ex84#;$}-Pt+CGc~MvBWfHzzq5rGq0n`4pm2N-vtq zX?K4=;b4k(?0XMe!|Bo&;)AL=Tg4}p|AF)3XUglJ`1X6>7~aY0 zPtWv^wQCL^ua;Mzy!n^5r_Y?RAqJ5#0GW>n0=sPHO6k6n{phWxi=~LzSzybISp$%Z z6ge)K5YW8EM6mZ+MqvuU!ReGn1Hq_uo%8_P)81ThrxL#1m%oqr8ejD?${#+0!%Os{@K59c{(14Xp3j6f#~5PS1xd%r)n?VyvF9QB=^HyQ8_=9n=60zsch zcQ5C@!KoK3VDRVXbvsT7MGT-I6ls(dENkA{0RjacwY~8^_PvAv5=xn%{jKUxqxmbZ zUVZN)?+SocPoKUQC<5JgyCL5n^o$DrgqCyGX!tMzCn)LV-c1#nxN!CI(Grp}X7HSU z_DeU%@7}%movpfc<|qyP=s4B8+e!E1gKV!FP?gAfyg#-N-C@F@0C6xwZ*4b9Gs&y- zzXN=kXLB+G=f-GKvEm0FJ^JBQA^uUGjPu&|v`vUN4b`}c0{QCU-{dG|ZZw$=|jE0s0^J4kykA4__>mQB(&RdePQ{OgaZFD%ltcpCr$L(R9H^fUi4jvJc zu8K&V)k*ghTv>_ba;6Q|V^?J*2K0X0g-LS;M@8(L;nlCb`2JtsHf-^o-?*Ev#{KTz zpU9`TpEAbVez(NzI=?7$M9de`;^X0-Vj!BT{F=CYQs+-L=Cb_CH{RW%@9|PH?w_Ac zc?EGMa+Le%5M`Xe%~=CH($0IY^kltJ#=-mhPH7{RtryT+*{8NX3kJ){gcz(h&N{E1 z4HhTqK23!+j`B1x;!(W_kT|V%)0}nvX*tXC)Eji| zaqYvl;LqpTJg{>G1<&1#ARKHVE-(>J7~jS%?|%Zm9l zo8iZgFF+(}@?{wcR(|p7q3u+ARQjaPHhEKugmFO_G0pb%_`TnF@$uo+ZTIm%bvS1g z0r8*y=RaG_FIQiJQmf!Yz2QdNp?5}yvYb6U9J^6!AG&sm7MRi2wE);43Q#iq1@b1Y zbalF=>#Gm$<<0Z+_Z!Y{UjF9I{o!x|z><1d1coOq4|gMtcn7zpk99eJezvB$XFRuP z{_&d^zxAe7_eW?Y%@>zf-@1PM)nWJ17x#V`4DwW*@%5UoAQ&S6>m~;l13x=+f)~s4 z%j=?f^;)9kWJ5oTS-hqF>B?fsnrM#$$)5f3_vpExO+eHSlZBDMf*uaju`?mEW4t+y@F(wo z@}v042&er2j_U3}|2y&bp2Elfdi1aQ`k#LPxBmRU@ahl!;BWjaSawj8Y@xsqIk_q2b!P{We}a;?TQb!1Z~WwV%+Za={Nl8?&J|`%H#lA zJvpB{N~BM5T!R-ywpzmF>hg$P12d^*EY4S7tjsA7bd;-QbKFhVco!w3NRJ*Pco=t= zm#c?+nKy+HP>4jyDIKPPSQpAXmrklMt?Rj9neJRBIN@;|di-;L$9pj{%Ce@M0}Kd7 zA|qFuaIGFXv+K zKL6zA)9>70o!%nS3Js^(FsgfM z4ph@DE7S!9;q1pZvv)V}QK4h(I*n=Mg+)Mb?@r5EMFTw^G=#zV1j-KG7($TRK6fTrp_24FYHeV5*}h;(P%;p1efC&+6JpQZ{Lw4*VX| z875ZB9)Qe)Fw?A)Mvgm{$Fr}0P=8s}=LIIzITvX#-oyYnONC*r)oEuCCCZJHwjpBZ z5ilwHc5fHC`~886NLXy@V%028ht4?*IkL(l77Bq@ixq@;iWAOV&T8!(!S-@B6LgL# zpVZjxC*?dXA`@^~&sOV_a}r`ylW*qCYe#(UQ}+%8Pcnw`@+~||P*L;!?Z6QtD8IQm zs!=gi0k(4k3;7puG$0Er~%&EZuf{#^h`|$k@i!-Tv53yPdV808pB^Rxty?8{%h*_v0UWB5WAvTbU7x9b6+=jRJMzDdVG z+iKWxCrB0nQF-E!;n@aViu1ghkw?oyFk}(RmfB6^o#!!lq;61!zw~F{zxshc?qlkN0=O%ex)K;Ps0!BW4X#&t*1WGJwmltD%sd#NyHE&<&p-rBZ%oogS4^1uIpjAjnwQ-yC$|Z#qUMyx>>$ua|q886ZxXK(# zsina>%iY*_&fD|l40v#NJ3(&{juBYdt1M#&xc&T{7k}(G|I9xg|LHwAV1WMCv%mPa zf9o%8f9}OEf9oF^pT5#zl-eBnfnl_0=BdMKa*S94QN|(9>zP;xLKd^CpT@-J6HF1! zXi6^1CUqdChKH_4$+pbh1iH_Urxzz&*7J+`G!6aH^}Q`>)SL0t8cs>jvE8NutFt;6 z_}KL~+uby|#Bg~~FK5F}-v5ZWLm5CbSUzs5%W^yDUn1WB~O4BLVyVJMc#Fz z$WSxSAwWv1yde;TvSB{b(=hf&r*$wvsi36tnV==h)TnK+1i`lLdpWX##uy)8UGLv? zoChCbUGdROMV0Dx?>u?B>kha{z?u-b177jrbdW~~VIfM9p{nBj zpyZ(I9LZCR9++sNqgH#20sN2t&;AJa+$B)g%4w_%UgZ4dZh#pv#?<+u8&BgfB^Zl} zW{n9&-~Xl0_kzJJxBX_zJH8k!*qCwv2p^shA=T#!;l+OAQJSk}q@HjWK$EC=5 zfIw6^aQLiTLKG?0x3>p;2h?qMI-HCX^Xv0=7+=1+-CS@2^4#_G>;gsE#C6y0rtnaU zi>{rNfprN5- zw2nH0!E}PppKe~>z9Ccy%z{Iswodo&JU;W0oCedW!6})3s9ZdMwCo2-03QaGz$55} zZi>#$Dxya=84W3LHfCHP;sFc}_^cF*YV)oC`QNhr=T0@O?Oz;!``Is?W}nJL2gX^A z1qBl5jFMpJFgQUXCJ+#o#zXH;gTCA>bgRo{L322C)9EPBHybbQ!>LX2tb-8-4NL$& zZ&@~0$CG&Z@SEAZn7`LtK3z~N0&<*(8C(lt3?icbe0{dg)(_kEc6?RY%ro3PEz0*-&LIa9 zqC6|fL3SC%1c9gnN|LQP}UP^-Y(;-tZpR7E*? z)9!s%g42DwzM4f%1x>xZliV|gDdi2V+S3SG`o#L<$V9Rqbf=-LY80#v3Q=Y~AKF&S z0AW~da&0Wj*<94!Rymju>#OzR?tZ{Cth5a}b!4TL7+TI72%U-!Mqi0pnWNk7i7`PV zmI@fxU#=Vc$N$V%clVQx9&=!2GUT3QY^SLkCd!ERlI5v{Ot`Sh^#=`gFrA9Qj8SaX zKa%ltE!E(*pWY90f>hyRPG%+8q*xJHmem&}9jD#YEjLi)q&RCJM8mE(ZzenRi2LKG z`{{SL3=oYJT*Tpszj$>w4sD$!$YmNi4d6Tz?RY{IdqQ%|Kzf~y3I)RO?dfoH&Sfr@!w2lxcz%9*1Y=oGv(5k{&RgMe|%Dp&# zf88{|SY%V1K0BkUuU=h!?UH3Eafb5}ARBG zf>qo!0+4-!-~74n{_2x|ykpx@>ZTDq^T6Aol^G(yv9^^EMC)x#_ki@y>fq+H0z~RU zTH9xq#GGcQLyGm%Pzrz?Cu1z8ak;Ff35JLm4fASl ztVBs3frG=dMV8h^V5*!)hjB=nX~sxaVc?^WM5~^H$VvtxNTqlmsv>v6VMqal0EJ<+ z0AL4wr_9))q)wY`>i%gYM2>NA-cO?q9^inbwk#)YFMSM@VZllCX1QD#BN6wQ(@_B< zO>oKkgelTaK@JvmooZz;?FRU#{?N0$;i96aR$2E8g-h5|-U11IcFK#<`|M3A#TZ_F>RGn4$e2tYAw8D=d{762KoRokE3LPh1 zJ3Y8K5&NjfgO1(aedSwgBp`&LEl_q|ufF+sbA2{j7aq7yP1>5e$crK~#1VyE!r z$@%ek^vqXvRu@GA#1dbEs&eTajx2ib+MT)~pG;r+Y^v`#qVGL_H0UAE={Oh|&|<|v z3{LX0EVNPHlMv!^nJ*TVmM)@D&3M0;UaM(P_lJ>_GEO1O@U$hhdEUKx^=8|mH?qon zr^2kBTzk@L2nzGyh5(xt(+2Xixo|=-gz<13?(a{>F4^+K7%%}z1$$%O{PynA`PXqN z!GKTwaq7&Q-Gk|;IYS$kbD|)#X>%=H0U1aE`(6yBDM$DMhDNmU)&J z*x69$D`m&v2}JPxtjIF%Er`%JYr1} z3~%928;N8@bVFEfY9U~ri7_eky&MsUxG4B!bT5ZG%j>f8lV>;sBpLghi&Z}BkKN_@ z%=!RfG&;Sjb)Jcm!H@yus6a|a<3c1}THBw%&`MF|F}TClq?;Tlm1+iwRnheoYBfni>AmJX-^?_Y>=l6PNQOsz#Nj3|Kv?K&&&0*idNiuIx1M6RrS}; z9)0-{Kciadhqj9$aw4jx7^RK6c0nEXBZQ$84U5@wUSYwLI7HsW>Fqb`=Usp3*=SbcWR3Fw?oy?-VDc9f`|mA?VSub8aXYSVw#3G_d6tj z)<$sg?D6&e?Ow2y6)C00Ud}c&TK|2j93H70rlJcne~EO7$O zY`+`Zeq28(tao)T-g)-e1zlv~;bCZIJXi}HSvMDl;b1h9%B|Kp1RfDw)*0n+f71zy zr_tX(bT+N0|0g0^8L7`Ub8o_KD=}~oCo<7U?}8spcX_$EznvCmO~zq-i_9Kd?G>d0 z#E83TQd(z>*Hx)iq_B?27(EgqHj6Xa>&lrlL-~81V^ZAD5MBC4ew!is1zegmqqyOa1r%jz)qXFnB zEez8YFAFiNL47vg;Ja~=vnXU>F;pwnp5*C;J{<^tv?!MP^jo`A``P_46LaA3lV=-P zpmrQzeR@dlcW?qoK#$-5+Era%!`f&@fwHDtae`3RP2)+SUDok>)K zprh8Z&hfxy>izdIn?~IGpJdYtn7iluN`iLwd zBp{I{;Sjrn#1xw-yVOsI^Rnu8dXm~XIj^#**Ee@NhdcqI?UJRTSd{4!`=TYc-6W0v z{_B$k7Mm|#p9GYpV0biHo?%2sCo@{T+_l{lrjr9jB7Uus+kJ{q8a7`nnrV{pBXsxC zi-58)V449lsbZ5ACiBy2-kb%8mIbf#q+j0Nj1R;28^CApUGYnC_Tj3iGNariO@s=> zC~^{Tri|G?$PgVbVK+_2$BZ+1bRKwZbmM` z14E)Liup3n7?z`Q#$^ z*dL~5T@yrxUK{Vrs_0G<|I8nMj!|N|;TOv}e?koV__w}ufMIug;BPEd`@DedI0Zym z<^;NT(uc!HYX_Ojaki-!h)*ms2E@fxJe%buspz_rO3V412@q*L# z^2gqL^doC^>+~rbro(g`hf(i_<92tvf30V1TIWR_iuLNUDa$3fi*iRYY832`s_h?Q zYq|G~RM{C3@6qLTcK%LtmFL*+?hgeQ(9m&o!3X0t7o_i`v!)+)mM3A%IKpaG zV5kJ=Aw)vZ!@Z=a6f9eA%H9s`I5lOSmjVV5CEyvN92E_g(g<3e4yVPOWF@uUcSj{s zd<^SZmg;;H6*-D19=4h?>OjC5yx&e%gTwvEbA}L9oo88*<)KexZG;g;g}b9d8Ke{q zeez1)ww*D~0~=zbS?N_E5N|)ZFZeg7+wpd|y>AWCun_)oiS=f^Mqr0_o9oAzG26uh z=tT5Hpu;QGT-7KitU#*u6osIs_**@o(`4O?mnR%0^870om(2SCg(fQw+rxnMwmoH} z#GVMMP+ngA?Bi^mvjUF8G)kSZk~j3t&1f9y4r&~xs>*>Td09ED0*DBpm^M9d+)c%d zwtWiW2}yIKPZ~R%aiHu(I5CbWW5&+wb?Wls z%ql%!^Zq1P%Oc4_vClZWINJ~&B4s5nW3)`ZeXR`$$JVY4mc(J;2L0T6kN%0^33t#HGi3~X0 zx6{pc-h6yp&o)=7I0d5UFk>r(tk%?_a9PcY0=?W1 zjb#LZliUs4emXuxbW~~#Zr04#v-gYo-FWu33!IB&o-WOsUwVTfvb@bio}sM7@M6Z+ zVzDaE;pJ>Oug7gKiYtqv#e_Y16i$2M+w$Gz^FQ)*^$vUf!2owah`;%}&#&(vb}@MG zl0yFOVZS`j?dYnkC<}TVdr|VDO0pclA`bTI@|=y2^tHCqW0FsQ<+UTZOdlgsnq9~|#E)&SAm~@yJmknovX$iW)8xy-;azUx!x8L8I zUwHHRM<)cEJf{^_!-$KTDWb8CQiEZb=9_cS?>GTn@W;$mby*I?NZ$y5xE=FFIbT*U ze(BTg@3!GU58=hjt#Pe9Tl(cnpsIRx`-YztBFm45ajVr;#rj+Gk}LBI1W(J}W&4YI4(LGA=I9XP7}8GAdvQagxpl zKnnc&t}_Y@C+j0DNLW^CEaAND7RJjWz8)hUKF9=1~JP*-emmQf79{K1oBe?$~%V`sCb znn4%vqFiY+BAAEhE>>mTltx426ehOawlHAj!mHPZ_9Ta4!e9Sz*8b*Q6KDW7EG(q- z;aK!57M9Gm?P-}gCw%M!~`?jNbE(8`r5Jn*| z?>=5udBu4-*{H{9I1N$`**qU7CkLNrf->^xYG#bK(qb5MM&%IeE@CaJl4S34%U*45<||uwk|$s%mQ~^ss{wBVicg_CwhyCD(2T(ZcpDJ{r(vjTF2{&D zUo109QHTIDyxl21f;!pU_2^^(c0F4{fHA;~7Kk{lMoL(f&#ly()hvnl5zyM^BC89L zxCkLSqLai#an8W0SDd@WmwZpXKJuO4#g=k7ipfj=S&{61| z`#B_DL%r{=-s3I?9qC8dB!ugm}e4BgPi77m5D6G;0K$Rh%Wi77xy_9 zhravxe&9aM=#!RnP$P7QKsGSeJXtS)V3S{fVhv6w=VSCf(2BRc90s?)lg2=iQ{5R5 z$zoOes7z{N0)d$s!2Lr z)>*A(THr%dRqer6>k7iaFhEI*V((ucl~ThXT}0z;KfZ4753>J$Dev@mf9v(xd872} z?|=727OFS>%d^GG$gx8Har3yD&kM*{=KZX6i0IRc=7Z(aA77lkS3Q5{ac{=yCar{! z0M+pd=-ch>dA;Ff)|#o`j}z9w!!JF3o;5a*^UpqdeRFT;i>!Q)uD{vfEEOrLvdAl1 z=e+NgHFn<6=@gUu1R7^>3<%-yRyT@^qNo;mchJDuWwp7zKj_IS6)lWDPMpMu!>kZS zhrUfpQbq!$qR8m|p~W=h89N;GVpBNlCuw<}85?%@17|cuI3+uy&R8yTF%B-eeA4Rh zaNwNftg7?662+v(qNJ%FU6dH6ctccT7!9Q`FGNU^Mk`9}ozK!3f*gobYmWyRaWGKJ z$zzH+WbI+38Bt2*9K1!%l0RwQl$+K1{^d!C-~lLehQIP&;nno=-oHM`WypviQT~p;G5H$s@oKX{|QE3NhT6tOP@3tCS{PcrmwaNwIyUxJ#`RuD#=kHxDp3G;f zs+WngN#>if%!^$2hQx~Th(&Zx*ZDdakh}{E)=r8bAO|nfpiZi#$a4`LA}qbD5M%F> zYZtK49tTRXb%N*FGz`0Y83L?kcrfPB$|4h{3#W&PHzZmQAsnZ%lM1pVz-!9lz2{GE zw_9fuHl?iJ?@qIofId>h=5@AfTVBz+;S|v+SQupudCofRUtLH%kye5BY>U}^6ooNM>QZO7=;P7?e}Aaz0@-X<7pp}x>50*_w<1V#oN4Ps zg(;)ss8fr)76>9WDVkBO2cAL32`guZLmOh;-pUAkwcz_xtDSF(k~n&Q-y#%H^i9d% zyxDbHPLsqS8|3I?p5=@phY5GiqzSW1Q_c0oC1XK($SY2Wr!>PHWyD{fF9fdu$Q=rL zQ2l-!`f+!VDgJ_Vl~k!zK1}GronHNh?P&nTI1X9aoDo`;3|a;a zyrIzV1{lwN=xOnMmY)HZ<4L&~5f*578mBQ5#!gxz13h$cGPKex{c6`i6@f86eR`?&WSnM2wmVKB#o0(pPZ_YzMeaAtxlzCb4P)S#8i{a@ zeRTVK86nDZS~N)-`oa5;@Ao@QpjLLVXz~gf6V4Ww+D#C02Fm?867>+|i zb0d1#CD6qvThxRwJ@(_Y*NeItdpiso02g3z&d9;o)U0<^*$flN%dE)pysi(Y4q@1~ zF*>%|l*StwWiCh|3Tu4+7XHgBnnY#E{2AONm#fNn|Mn8r1oJZ8DTv}!9zzt2gAV{e z8b@ckLt3ij81UH)9`c?@~Z)LZ473$_ZuTa(4dVP7e61a$;MddJuZJ$ktZWwP+ zP*}w}XDrX^4_N(9F~7*x*OeOeyH6h_FCNrVt3}|IlWwpY9=VA z(m(_wF3@owv-AAfA9)&PV)R~z=sYNDC`gFT_Q$cx%Bc%l`v^jMlU>kK2X9BCs#4&X zX$|XjPM}2?8tpR1wp&GEfe=}*n=$t7Fjj>q^PCW9I>Q;nG;v)BLkx47f@!(F%#HVb zYuck0w4@Mb6-_$nk>m~BKImkE)Si~i1b265oriZXx^l)r1o9M{WmVT`m^6SW8O(z? z?WRB?=D=t_NOw~9&~;2O7Zoo{gz4Rn3(vGfICWcQZ*|G*lM|`rD zp*gEo3p|tAgw63y@9{n_X3J-*<|}NKl*h;#hZvS#YUvQdkd*;=J=)#9&P!x~X$Q+7 zM1Y*`N1S2r(iXk%IvXs+fHU~)(PM8yKb-PXOvd!bDQRP3TrJnyI29*c`t!wRQVt+J zFY+p%H|0Vj)9=gO;r-V)@ap*}1bljV9iYoH5+Z0%W_2zQaCS;fT`8S+$QplkUO^Zs zXFSIuCl4=1iabKu-9u__bZG&Q2u^)FF@a}gzP%qzvNvhU!_cZCV~2L2LL(%))?GfD zb56Vu+L=>lyQAZRV1)Zgj(QT5&5B05z(EZnp5zH%TzHY;LX;ek8IR{RUuVlzafTPO z<@GG%!fT57Mg`^bvUqk0WY26LDR}?Ses%Lfy?V~S{Qf&tS?rGoqisE#y?MQr#>`h@ zI@skb@e941X0s~G@#$y+4cM9U^9zFV2$@6DYkzk$)Q|Y1Z!TicWiGz@rFRF_o^58w zeUA`i9OfB8Auq*j)U8q}hF#7?Jx@3<6|}5Nh@EU5L)v@Z_wx3(+iztcfMuExz1!|N z!n3-tGQ6!&skc?FphoR|3^3iDz|pKOc}Xz}oUE$29Uza-a;H5`fD zT2t3xP~&`FR5`hSP#AcagufxUm}PXL_V%}K4Ndg@$1lh7Dl6#B$hP{%_2Mh@{Jd~B zoZ4P9*Bk-=W7CM%fW zS;01o%G)sXdQp(+6!ho=aoU7nagx)Zz&N6uF4m2A=(ue&Mk&f3wyl*0i>x12Q^OcN zWN}vU+uMl~2%O{@B!uB_Ji0EjSR%2Qv&|W;7|3~Ma?`u``m@8$;bU!g4e(myl2;I9 z?4myV;q$9+Jx3T=>p0J1)Y=X8f>F_oqt#ZoM;p9doKaZPn5fNp|NN182{PC0JtV-fAZyZf|8=g)xj*zUZSc_}2#^*WC_ga{iVRbjwI>DBQ}?ME9c@))r*Xo>v-E-3YL!PHO)525 zLNlw~t{cX5l6%Go;eiVj-CLvP7e3ST#j_7&d*3{%iO-g^`Q^pJdIMoBONt;RflZUm zlKqrSqaO_(wQKv4aZ)t-H2UMGyWzL*?myoXTwPwj59OP-$AnVQc)%c>;9lz)NiGWp zjj`y((6u5~)si4oeY07A>moV2eG=JMH6<)1n|8Eym7VTw06u*MkX(Ppy5RGYeCfyE zX>Uf{>!{?}b?(;a`ez^0qJe-nb540w(J}@YX6c`lmNU-yk@pvzU*aF;-h|ITp^j zlpP`04O;L5#Zb=}fco-m1ENVRnX?yXtGcd~ll5Xw0_02}ikbpno-cA%wOvvKI;V!y z7%-faIh_>243k(lNsiVXrjjz~shpC1*!aYU8msZs4{GE|&9c_Czw@HYy+A(ncFJu| z*fu9l2hmZs`RaM|;he2;brFUkCh3KZtYXsI!%>fey?;Gb%OZW4Jt(R?%abM)CBY8j zQS2W^?JefOYoFdb>uJtFD%^pqvkgK<#mQJecxG&zltv(!DHbIi$00C3PtIU^f7dyv z1p`b1Kmt|x0v#mueZZ!q>S@S0XA?)`QgP7{c(J54?!b@cYd>zm)%zWibghlPANegC7=)2Gk+;q%?i z?aOc9uD`S%yKXUOm}BGo_HG0o!-(f~W>IP_Is^RVJaBz48AGuR)g2#pVldn5<$J{G z&%gNS+h3gYWNF52)cJ^L0w9|j2LVhkxr|u8?kF$C3YG8BvuAZy!jkiMpFdV^M2S_< zMOGFiuqw=oGw+Qto)Ah=ytr<{+c1-GgfnQ5cJtv`^{v$i{LrgO>AdkF$iucPITt8v zPtuqKZIZNtN~^rGo@X&Q>O3kNo(ohKTxvZ|L5@)HylN7+c^n5pX_*%=LK-mV1X8Ef zlxOqgd>E&T%egYCX4jvT;H=68Ek5|`-~PFOO#ZD0JOeguo`6*VApqj%*&m(nKfAc@ zoHqM=Jzth4;Ync}T@2B5&UlZLw^vD}hEejIa0-J3PoG@f-Q5QO0)%g!56Ojf+N;&7 znd}6GKi{le5(*|mNSRj%aZykkt?Z1lzNl$l<9SVge@^Vij&agcYFU&t|=@&zC&o%1;l+KFi3W zZt^mdlSQtKzyfF?N@<=q&}skl>8z6psQ1R@TtJzcj^!+4ghddtlD?HUV<~0PWZF*M zpo*N*eC89JK0e$|Opv@nld=1gY|0#2wtds`h6G~^!L)U!X>!n{ywLhDfAFrBy6Y0{ zBFf^`t2>sXqN3x`UTzjXco}6@@|?3&QAQ4XcX_@>C=Y;GWP%FEU2+et9+lRbc~iaj z?9r(ErY^=o8x^>KWlmHdmi0v^4|4J$Bzf8Ttkhalju~S_py6bqoq~qlXuIAr&p4)x zq3Hy~a7k48=97;*7x)AP=puEq^OeYgkOB77W^p0b+(Qfyp06^DAf?1c=PY>f=DvFy z3mzX7M@SE&b*O(e-+%w*?(=STmO*6SyxJ3;zd60WTrD9qQT1nRcGjFFs#QiWVv{}`hfZN+C7z?3g9D4&OCpY_DSz(f*)Udf|ymcX= zo8XoC5B!s_|EAxB@1?g+oq$g@+w>m7R6GD~_(*<<4o{w6d{&E!VI~qX;e|+@n2dAi zVYSF&#KxL>AsA&YwIdwj0S3^_xbYYZE(iH=D~W)P=(aOf2ZVy@-Xa#kqUfDd54)CT z7=W-^EOJ~N4<`tH#30z9yzf#vvSBO(aah?Nd$ADdxQwp=LS60i!%`-qqAQ+7{)#{*k1Vu4pF~+n) z$(V`Sd!Kyi+E2anK#!wIZGT<>0p%2ijs@gzULKPdGtK8>b2b+lQAVeboKXfj3fMR& zY8nF=C+%Y*DiKH+dsbvHS{r0FqlDLOJGl@}duf!NpH;maPQ#SvqGsj8n=VFg%(R|Y z#`wGK!C@;WsdQX4vtVsek{BXmOioiIE&@j&{QX-Z0%;?rNn0dE^5GB!?E6nvoE0H5 z2cb^pm457oww3KDbx7Ojys67tIHT!(G;hAYzrU;MtM+KMp0a$k!TEKD$MF{Ng(qW9 z^Vc8WuD*0mn1?=4nC(yf@nMR_&1*4qCW9CF;O@Wkz0Y18%tvxv`~697p1(uPLEh{E z_Y9z{AO#`IIoZs4RhKQqyWwG33E(m2v+QYc^&`(_XSG)vQz|kHks|^@nx3Zjq1~&H z46rfjKslM`)o?P&(dl%_X?xV29wYQqs)rYXP>3QyfiW?w*yu)xLQ@t`pIlB_vLY`t zk?|B~G2)(HEsMM`I$24F)1amyq!JR{Zo4usY>eld8X})obnOH|{XT~107{y|q%Q-( zdrKIY&u0Ok^uowtQO`en^<)3y_x|Kx{#+kVZ@?FS4ZQvpaQoXpwIE*seF8KG5CMn* zCSR!8?MKV&Zb*}oP@tvKOl*G3Z>mUT(Z52lq6Ra-96o)~nq`oh5$}zM6C7&^hKvNE5 zOcwTbf81PTICTU3=_paa&@&vPm{Bj^4#yP&2qzXW6-Iy#_L!V?;Qr-ME=mM}>AVea zxuVKgoz&})Lw^K~a^@wuoP=cW$Oc_}qjD)vx z>2R@HIfIV<0HCWlrL@#05>8yuW(w^|P7)L=K?RZBWIpdn1@3?2Rr{MSU8Ey*#_LZ$ z-OWokFR?YS+xFkBLEyp=>s<^!PQTIulyx2+<@at@cF+C@@2XeK~no2aP!$G=jZ%4s%8Dw;6w;RTI=0GWn=*n zT&^kw?4ZVsu_Dic0~}(?fhe%^8X;zk1J-RerFPzEJ9ZiXR0y7x3`R;RXGH>i2`3OE z6-_r-t5CNed67XFPurC4Qj&mCtwTCyB$T5O6~}+zZ~C%Ve(ZFt!Q&rXutnl>ma~QN z?)qv@a6D{B&S9Qory?}@=*H-R(uwgaD#`^0D2PI=)(bsFf|GD827YsM+V4l%T0?>; zQ~+xCu!jOHQ>PxDj?U}!nqvZnUZI4UJHkOBsI#D4WQZbypf+BJ>~NIBq!=y$3f7uK z-zSS3CbPP>J_1!^NL-K+IYxNFW^zzZADv4#IUBMJ<$_nN^vc!qteR)eKo@1T>0|U!5ar2#rVb{O>ZByV4Xdb?}@7p1;3Gu={sTmM4oGpRs%Q6abT3>%~Dauby z4@GW~E;}?j6s-YDy2UKx%uR$b>=l^;*O`Czm7(%I_SQe>Z%|gFqGS;eIZ4sbNlxCO#X?w+#gI1GaWKnG!Vqd}1hoL`Bn`J{VxOqKA zYY}#ofvI;wuzlN!0t(J|_v-x7q9{3I$-;)HxP5)dL;+xwlkL=qAgHqnQUW}quy$aa z#-3Agw!DZArv9;)Twn+TrjR3^+L=H6hcB&$Frtj(`C8b-1kbgdAamBLI&ZEo7jNaT zR1~G)1VYSnmS^bQ$BV4UjfROP(5652Cbj>A4fwDhyaR-?*}NXmaQL?m<$-AR;t%+{1WG9!G%Oaj%>WgfNoR-EMM5NMm1p zvP-F;i#aS)VN3*L1EVD2DKP^UY3FEx7$t{;9vwQ4leG@ukW~UvAzL$iy6;|W`<Eeg%A@nu+=8+^wsqfM*33J-4wsKf0%e`W+gAdb5_sm+wa|> zU)w6+?tcB%WIlg6qT`)WsgPmLR@hYQXF1xLBW^&QFEC@HD7Ht4A>VD=u^Y=e&vCI>%m|``ly%J!q#Sc=0z{ykXAciO2%wr}FeY=p z2~O~cnCF5yz$Yc;5T;RQ6)|3q(o}U(2=VZ`!z4W~LC9fuRNh~IA^*g)|MKA9|0f&# z&eysRB>oNeSAV(tm;cIt?YDpQ-}G<)>-Ybt{yqR-|GNN8vl4I`&G{dfP%U;U{$;&gu;s;smwzWZzgLDbT!R5}B0LPnd2y-JqZ%z8spo!A#;kri14 zY&f-?LZ^ZAQI493y6xq9os(oWv1LvXL~^hw7y@-!*OUP3%-!)&)nq!g`Me?+PrdC2 zS5yT;2>^N4x`|7=+*gZfvH7^*b$axt)0>;IdHN(jUQTBOp?tZ zMmM$2%8~PYd+c`m@pO>d1i)-rS*!GJcUsm}bZAIs;E=vA7@bYJbY*M=AkXo5j4aQZ zRRXV3a?-*O!EUFlMx3+dqVDCe>-wrlj-Im2bZ;|U5*DmeJck5jMK(L^4(F>`QPEK) zl{-!9MT7&)7d(CLlZPG;U9!b=-2@?UHZX_pf9+rfG@1Uac$P(Q_xgLk^T|Ws>c@|l zr``l_YKnNXd`_;*3B)mN$046Z9L;bVqVxqXx|4Dt zzNM0ZR?2BBwP76AMLkKFHJqTpY4YY%f^P074y(E;@|uoL+n~x^2rg`L*g(o7W*({1usFTGc%d^-? z9RZvMA2ghL4H!ZgoLafczxk)zZ#??&-*i8JzJApImGXE0C3p8z;PM;shyP>$xqssy z{V)EppQ3**eqR3OulyqT;eR8TwxGI77htvo>X<+k%z&AeBVa;M3ac_n2emVIcO(8&f5+GQ?i7G* z<{8eK)2UB!%3zf=%_cu~gLW>@_*^un?PR>QYHD&ZtFzBv-W#lkX@mfst=Do?d4`-a zTol%tB#m8hZ_VZU{QP`*w|l@jV-$;w#}xYL#}~8paz;_5VstTh<+}Y4uq{{FATxX@tF`_iOyKmd09Hl|Ibz!iRl%qah&(-Mmdkup@Bsdq$ zShgB6M&2@mIZ_%y*el!TQi-KbO!=BD190SO3%Z~~;H!Uo^08nFSPsD3|6>M#$hYqPn}6v?|H;SiRLgn(8&+p!YR^E389skB+ux2}Plc$uLGSlNI*i}{ zv9)oq@9diweZ464kh%y($+IHbq;iEJz#J71Z+h)5N_0pfmXE!v=1B$+j7Jb{mQ|-t z0HqYkdDM0jK)@)=s0hIJ-3bV^s%9LE<6+csnu~N19d;@ZAkCPn{ZoVh&ey3O=O%xB zbyk*Cr|{4Mk1j4YBKOX-j3=WCTV``Z@?>4J>pFTle)P$u48yRCy$7yOOjN;g< zfFQIbdj0C=qx(0XAHMjPx7V}0-E|**e)s;D-_^s*?$vg*Clq3y@x1iJi?b!Vs_U#N zj*Q)>#`RDG0U&41B70h2|M)wzRh1$~L=p8Ey2Ygs!_1u2%h#{E)_m{v7pIf*YPu?B zjmuZdWfPAy?apF2?x*f`^Um!0hnI^F`1R9sHL9W_-hsSia++`+LG;fbUoV%lei}rR zs`IHh&k4o$`fQ$w(g)^ZoZ7KJb%;U_aW{^FW+0;FqRa%5qnQR(3T#IprvQ>Uz(-H4 zcX^Tgu_9x2H46ZxzhK6a&rYWv1gJIiFd3YM0F#w@#FQM`&#iAJbwRw{%@L}|BQL|EN-{pAOCsq6YrD1gRlPA`t!f? zH~z)1{~bSfy}Jb8-`u@<_>EuvXTX>KBFGlNr^Fvv1+4r)eg6*@|DhlLi8xziAi}X% zXCuQfe8M3&niIz%a zT#z_jR2Qy}~JQJiY3YrOo?5fIFi#Y%8=9sMS>8;fB4V* zfDME5mSreoHH%_i7kQ2cr8z?sV@?T=oC#dcGQouRo^q7e89+!+GOsft@P2oyXUwUX z%@(KQY3Qt+JmUb6(2eTUt11(2gbz0@t+1OU#4yCLZTrBSvyNf%?D3ll4|)Qo|}f;olEggmm&1#8kfR#iMNsP~@dtf+D(K({vx+lJ>AXmMw7&K6$=pKLNLuijhoNImD%r7yC+K`%Ol^`#V<2lF%pu-@k zKNy7BVs`c;SH(FkHdyPZZ3q!!0gv6(4_>Qq*!TPI+>fxIHw}qkk%#Mg*(}cU^J?nH zvffD9;p=DEpEf`6^x`XLB1ag(XHTx%q17(^7t(odGz7ru1hHe_WYlGqReAC1#R0Ow zAjm`^2ahvsy>3s+dz=eA+XxK8)%gXbAO*@HB8bl~npB)i}Bz%qp>5l~#ig zK{||s8upXmq8-#Q>b6ZXqh?Ma)M?KfY*SQyYo{rtyDqxaZ;(doRDCE5p%j9cW;qcI z=Az{7lRq~5v+)<*^t(6pAAWE1Q|O=i`@!=+34Z7s;I}^lzwmAF6Yt<({P+E*{+_?> zU;WMLD?k5>>|4*^{x^!B|K0xy`10QbSOzcydJqVFzc25C~uW(sTR=|NOg2 z>_qUslawN8B*+4wAck=Frsu4nG$SdIRH;CC&=DG`T(a5V9OXp&_;6z|C%0dmhS3z2 z@B^IB=CfHAk!F-)j8X@kR7U#%BN72YoI-FH))%#vR*yy$8OJ_wB??SLd1|H7#;EA6 zNniz!+ub2+QeC9L#lwATy(AzNmu_C4IzMQquq%|(saXiJi>pkgiwh-cpt@&i-@@ka*zH3kY@iaZ`PaZ>x_`I4I6-UVXqXl2Q zkljlVW&yF=+amx@u(LTSKd7_Qc=CiwJ1z3+_GWt^@_I4*_-0$My1vSJAs)7Xud>w- zJwAWuI-gTxOgj$7+nkGe)oAaKW?9CK)41~C4QfhGQFwkiuQAL@etS6VZci587XjoK z*R%JE@_9YGtPm!0l*Oz#^amJ0QBXunAA?c){#ND%<|RChavVITxZ5fK0OrVQlV|vL zchKJ8glER*kDs*1UdbsDeFPk~U0#z!c#QGU)n?lrNeRo6)n%=daKhw_&gx|*Dh;g} zY=2b7+h!voaCK3hZI%G~s>mMhdt=;e!JM`n%o6Q3IS{DU?)d&Q7l z72o<}*ZV^xUCWA~Yiro2uzpbEh zTn8P>9F!H6)=Yzj0iuABhcwmS5k+Y2(`!g_l?R9{sB6XxhZ-{fdQ(2G^J?b3t7q6m z6-cOZ%8+oWDw5nmiN2u#GvdzS{l~2U^!IMIH7+8foQ}%5 zQ0BEmQBE+ptnH`W-Lak*#Ama*tjl_mqsSbxY>-RhFS)zf==n%_s|={9Alzx*zVYk zMiyC;wPdw`0JW(a?O7&_b}F^+NpNwRLqNH`%Buk4j zs&2S-fW9S7q7O7D`{U$&U>H|bW|bW$x!UBxJ6=E+5dMij^@wn^TFtYPstJS8=d^-> z-rOGQBJcZTp$otQ=y@e_p55L`1RZb|Q-}~@9AJzOoy-Km!J-V)9H)HRc$+$% zGlJp%*b@T#lQB*!rQW)Fc~jLkhIR*q$fVJSU0;@^n?h4AnkEO(0hB5fWm4vfw91I| zCW}Ihz3mN-k(}BAfF#}$MHXEg-pKWn#zWY4y&R&JCInE<`1WuZCRa5@7BU23YN$)O zYD(|*tDD0Zr5Pc`c{_BFazgT=;u*`o{m*{apVa<#jt1te`QF`&yU7>>7d5*oQ7KUG z0$VrR?VTO;ypi?lI`cu#&~ZAg%4bkVx)Sw8wfK>9#h|jz*hq6P3Nv-19QAtM$j*<0 z`9EQn5W~J5t+mS9#j0okwPRT=j_JSaU{Kzu$ze*jw>qzw zGj=$7n8-UfC~IB70IDJM2MIHjMyEq>(^4IIhA{}s`QrR+adUrfZNzEe0ZQt!rv1^z zU@0L6%c{z%qTKC!fE{qLC}z$3Qce=^#DX2$-3|Ls5YC;r6Wnf>IS0N?p_@C*M0 z`sqJ~zBwQMRezQK@r!3aULB6$Z~VK!XY`-`lYit-w!gQ0=Uw^U#cTIFU(~A}efH~r z{iBbbEdJ`>{Ab&uiES_CWM~e#@J_3~Rr8{-Bi336pRj*Q@z6^(82~|1B1W^m59KV+ zGu$+Vb7@OFo-9L+$Y@b=6|JU;FZOI!EHk^j4!d0DV;|>o46DVp> zHiEDu5eF#dHGQ~MqTtFJ16@BjXVCqt4*%F6eGdYUDcHW;>v5`P^KlwKeQ{?DxW6Cf zD@LfF6`xroX$(pxBjr75U@Op zm?R65kKq1zS}r&xk7pne8mTX59JsqZa+>+zv~u_RmQYZNGAV;qgkhGRq>);y zd2=?;>-C};je;;1B_W6~Ofkeo&8t~9_PT6XS@Rf>k_roa8c!UP`BIRqnUwa{zx=!t zIi@8zw9`0x!H{l4dUG*w*48$6{nLMu{E@TvZ~CXvPtD)`gY(zrFMRvIRsP_g`Nj|Y$O+%Q7Uy~PJO4ZI$NrZ8 z?l1h({9DIw{md1jkrMFEqemv#vvuQ)-)_gIVT?pGxmkJE%7YvM@Yn^vTo=JR%IR!X zm2-ao`M|I%cysq~8afGFIJp5p$yw-!Y1U+AK^|^(-zx$=<&hu?Q};ET#`e*pl zMi%RuQD~iy1js3gq4M%A88RjGk3g_$RyIZ$G74)z75;<&iucT9_xI^OX)bf?Oz`kx zy|TePe|BcIH7cD6ML`573C-6s04Jx2A!8I}1$Bw*!&Osd1sl6apd=7dRK0k$n+Chz zN}7v+Mnd%1wGo9}kPNZ@Q{B0cRY+=r~C0hAPWr#H6H@B7~rIem6o>-lNw(;5h3S%?gB!D%%Y zS;?IPz|&E>@Rn0EDz$q-fZ#s9`u@%0usBQ)bN-~jVZZ(K^Vf$Qm)mVWTa>Av;#CuK z!o-&4`clP0;eq3z6QdQ?!>V}upOmQ|VqBoEyOzr8_)nZX-YiNOd9D@t>ya3)?<+&j1b>3XydhPx_|Hl8+pZ+udiu#ZLYr((x zzX07te*CA=PtNp%YIm#@E#u@~VU8Tm`gXaB&@|JTXcrx%xt zV0}FkPFqG3E;iZ`pfIb8$5&VGt)zsdn+b7|LE_IA#e7yUl#j}d-C&fQ`gFZZ>-s?w z%#05gXHBvP89SYH&WM|+oD`-oB=U;rpzkyjIzMT3fSn8K=F3YKPS7)0DtVep3GGpRmvt--?#0ak_ zf&fOIWg;V+1)n9kXx5Joz?9szhu-UnWCQ^I`eqkAfDu(qE;64}Xq8oi&PZlQ&<`46 z1Yq)9Xybx+F{Y0EYCc=cm)+473r3J5h)$C_9OT2BW70#^d>E8>fZ`e1YWw25-+QsY z`Ro8b*9{&a1#&d`x+&lmE(_^9>TJGb5aZzEn^%1<}G{f_z_8!O}Y4o|sU@Ql36mvhypdD#2J#9$1Db_yXH>#_n8$hE_HEi#et zssx<^aC0{xC(23$;2iXWmPM9TWgY{>E_pzF)R+Y8Y*VlMV>_!0Dxk3rf(Ro(0q0q= z8zR7+b@fV2gC~q>XAy@<1~0++WjT)O?i*$_-Fnn;Qo&O%pVGm!$0_M z`EUQd|N6hL_OAMHPJZWK-oF3M|HH5ROKtJbEG~SW#A?n zI9LdLgefEceSrJ%*T3??o16Q9f>Cb1oZUa1Y|!%m=aRs{Lo&;bUTreK6hpEP0E zyX9iVSm`6S$$xB(^t-#^{GC}*b8pq-i|fU_v_Mx?c7NLCP zwySl{M6w&Oj1_erVdxL4%;M0R-Dw&pH_PWyxvFYXZD}Cx^9rBB?Z@}himS~tbu!X9 zRx>=tRl#{h;&jSp3kv}+^P=I5LiG0R03aT={q6mJ=qKas(Aw#!`i~yQN%y_me_YM9 z|I2^%;|RoRxqjIHnru&ZyEkrBH7jE_a*$or)#g&4@ikx2gGX=fZ>;DR7$Q_cC8`he z<(F3L>&B#!->uG@)A2xfY?{oY?09O81c#jzIf2}54?QA;V-hDQjaCUSB)K3j-aJ^8 z&>b;Idg2M{3` z_haAoq{22trOm3Ic>vDNW>q1k$*4&$=hO_bJDPx4M;O|qV0;Hf|`;Ke-O9!KlddR-j%Q!x{m5Sv^T zdbXJNz3TdrU}|-kQf8(@@T+F+VCarsu%@5JdO<(>*!!u%6_`DVE(VNBv5k|S#;LO?we9unh#mgaD; zAdMcIZk)!+bB>{b(WbdKSw;nX{bp-{1sG`S*2{Ut%VbF-0btaWbd-u0uq?>+`J+4+ z`=N!UFPSKc8j`?>f3#WTe2#JMaGVaKl7mcuOmN;rT@!v~z|O1>K$Yv_Qe>^VRz4lM7{&r-5b|p@(xWD1e#R-M)ox%vppkzuEfp zI@6P4yZ{V~O#p&GeZR?=ClGO*ECYS3+wD{elFA&D!FE=oYk1eTyPLbCH7|9h4}kin zqWQ&|yF(Eh-5;x>TFsZK5y!-;$i^UfpOFBLdZG$3crpl=A6_lLwi4HZ&w?=_31$Gn zIeyp;$>;6S%TJGaouLSU#YLHO;iUE$V+06|;&hP8nyeOmGMP9;P?phDBvfEAE9yDx zWtS{pk(|2mt%}2Pk@fxQZJv$R%|Z^&q8LSBxS?|goxif?7fZCJWv$2 z_Z_ng9{$s7X=+l*%;-f^GmfW?4?l3acdJ)w8m| z2zl#Mv`kZbuxZ%xs{GyW{m$?G%4a|Q$NwC9^aJ64`fvNkUbO$(pZIZ%@o$RepZ&f6 z!{YgyydYVP+P$^OmB1p3+v7A%(K&ecs$HxrryY(wD}?tl`Aabd06GojV3XXNqGLOy z#3G^U6emAyST1Xox(Ln&IB7Ud3WRh4y5POHCMD`*(KJ>${k9E(0?;W>jV5aE!#MgX z&lrQNP2RWDd(R(Dst+hAort#Cyz;^Fyf~kqJEt(_5qSKqKYZEu76b6&(_wZtpV~o9 z$-6RN5asQ$RoaG<@qTAd`wJ2?7OV=pKxtEDr@Lhqps%1xs=>~(5huQ}n=89hEI_1C_L zOLY9=bo*DoE#25U(kVaOjQf6sWVl+=Jfl`*&z8&%gTF9<>lxbU%<)tUn%?a8%7taQ zBoQ^u+*%bRbRWmv_r7PBIjaip4jd@VZ!R8f}!eW-v-Hx~%62V+^q%we_P9j!;sF8HuDSm=Kw9 zn&3ze0lLr~x{-Da70gLyy z9V~_CLBIE^~)iWD{ z2ZlkkTFfyjEqbdCJLySkUQv<(is7U4GenaXhGN{dnlZRouxW4<6c*~YWp^B0Sgs3% zA!QU1P|wBbL3yJYV*TVE?z_`|8s+GSp-jOT#z9`J7t#B>+sP*Y*b)-Gg&2ZC>5FI8 zFa5P&Y4WRge(Y!e{r}Rh|E*vClKuLR{S&|amw)Zm|GJpjW>!%~q%_BAU<}X7I(a=j z;;1oh3^5%C%lQQ-ESj*GHPR@?pm#uUN+B-tR5VXqKS)LR7_s+nUnv%?v5Zj!Ag>!| zb$2rRy`nrgXiuFD0l*kc>i_~N$FhcTaJM_84FrKAr_1@u$#~qIC<8H}-pTkhUox-b zlgHQNsHQl;+-(*s>!X7P|HL2rnv44Gb(=SY5!TREQD%#}7}QwgDLc+HHqT}xb>YE$ zRmjl~L(23gh6V)a%P~-yQCDeX}TQT-wo3N=ZEd zAFj@3Z(i^>ox(-uJc}G$Kj%pvf{Fzr)@=pq1KV+v_i=S=AC^Fy;mhzxKgr&fIN>LJ>G zv%tZ^``Zb}_*vT(L}06ZS+-jB9oQki;jp3f__{s2sxXo8aen<{%j9h>3LoNP1~>;} zkn>v1ih7)M&=%Q5W{He1=GpzB_1+ODm36GaZG(Wa7fH<6-GiJ7~4*enB1evILk#HGjj5W);I31=#dx|(+=@_$lQ%)y6U-NEf z%9>^wbif#E=S}gY_nvDzdL%Fj7{scYL+q9{+bnC!c-sZ5&Df1v4iQC2#NERIfkdo4 zd9o=>7DL!S^f^H|vcsK<$RipE%&d#nCfgoFak;F2_@}@0pZkyew}1Dyf48dY)z^OT zzxBWS_kQ@3j*9|Q-Vf^hECT-@LW=5H)ErBL0>$>8C8KqD3TDvQO^!# zM1akyY)2(Smh-BHsoxOO3QI%UKyKfhP?1_pA=R5eYuvu;l5Qz#fL&e}kYq->_SH#$ z(cXUd;|Ll=>UZAzCS)*=$C+422a83fveei8;!TfP)Hp$c*B6)P%SFC`N+MTWbvN7f zmzQ~!$w8hz@5f(xrMZ9j%?Gu8(c|&u!MArh8a<)$*_@RPP`p0BEQpr*S&@VRftkZ(nL;nJ2{P!lXAW&ERdtM9@zAMkk_FqIn6N)NefV~g`B)G!Fr!w%VXzEGzyHpZx*%eCnZCkB6TTk z90r3UPE7XwfHDL@><1Mw&?eCoD8}gH2k$;Rwyh5;BFu!?ZU>ZngurT;=X8JQ0W*t5 z4I>|=49IbqT4!S5@ZTI+`g5AAEE95B*R7`ValFX3D^oUBm5VmAr&APRJPZixaPxb&_>N7-&eLq2U(Tr5-~Q%zKYRH6O}jsI5ytIS zLu9El*ZE5HY<+ds=$MPGM?UgQCEwedU|NJkv7YIZAMST!sDyupyig{*x}V(O8Nz%? z7Hh#L_%MajaLPT;XES@+7uhU0eYfpjgmD^BIm@Xw;vI4EQ*++%2;zjS_QBA=j50U27NTWoC zn>_0~KMguslh$BD2}*?4r5{?YpK{DoJ7YClWF?(7h4=1s zlu4&T<8VykAM<~LU87LiaDh2b)wc2Etr{|#2~ytN9;|W@^MgErV2dnhr}Lav z1>5hmN%Aj4S)?p4Gop>(o(|_1)zrxV@%h!VL_$Dg!Y{rJY1rvQZ zji>hhY%wpYET}1mZq2f*;xaF0i+49ho2;A#$kour@(h6UVj-`7^25t7t;T)#(O>?y z(=6`^PIwOEKCVyETn7pFj+Wr2sPDbNxHIw$=ROGtEgAiWi$te^7copN@@ z*4It4$2qcIRmzVx7?XVX)oMkYi9Bx#ksB*TUQr4+bH3g*l+a;<-YIK!zZ+sQ7nNVU zzMUo`CqG{nT!f5+<9?V9YF5?l(WL7Txd4;TQYo3p6(#3QQD*fhVL9Uj>*Onrpsup6 z^AQL&g-4H87L23QE~dK_BzDn~=##OG#;WF8Yh|64Lvj#S!dmy{Wsf0_0oSEKB- zgak4{yPcB1{^o8p)v6E~?QVww&NEs@07A>N>HIYX={B!NNaD?Wa9eXC5unAR8Gunw=CD;PqX3#t z>b7&7Vn0RT0}(_ULoggCdFVT3d<0Q@WMw!!bO@!eKcG~X;RQ}-^wB(jetl{O4HVA9 zX1O#LIH0Z8%lRS&R+M?<&1k1Vhom6G-usL7^7?YEoT|$7`QP0Qi&a(>pg))*Ym}d~ z1P~DC{MmUOydwmG2xsf;w3T|2RaQF(U*8;zwEZCa(8n;M=(~PcHkBac{%-Pb-?L-} z2r#7WAV@9ei(E~>d9+xU-rBO_DpeG6{1boTz3BZkjIuLwY>kcg4<{XLgs33pEXfj* z@T}W)Oa-yM*YYzRBn6c+@#TwK3`3Ix;Ms0x-#=d*qd`?xt};R+0nu7N4Eo_sH=M>o zpp27YkTDQ}mf}IF*WZ8jrhj?6i*HcuvQsI=^R%~_TUG@Ivy0NIDSV#X^#Jp}Q|)#Yr) zlyR)65;>1z^70{jzRH`rY>LHcNF<|HYCLrj1w`}hzD0lpkJe{ZT`?HFo{Sw`hPmv6 zwic6A_X<8KUH}NGtC6$yYGo{>oEp{VBAW(HFg4NvoY`dMLU|ceoQ(XuuF`&GJ#-FH z#~95EVyzpb3djUGk%BTo+M_z`mEd`zz=Pkn({MC`5QlU$nf-hiK8I8QsgKZ<<%Vh{ zt9fo^Z0e>ga$_V!P%r|MXM^^=rW|30_J_$MdK^@Ufo80GGfls9_vZ6GEt+!9G3C-2 zqx{&aqUOe@L7%N4CFETdRIEzzzWR!r1sFW>|# z1>bCs7>HTbc;$*RDe>(<{AXo2_!qzP$*A!4;}4)D`~3(q0>V6V@aa5fwlx6(QF?*S z@>*$idf0jF&R6rhZhz`Pv#4g*IW8FRZYYc9n^&u6XN%2dv1&%yANtWDTZn8nFM|VN zg4G!bSm&c?DoP``UX|6{EntS0>|u9vd?k&0Gw2<*O?AEAd}Cfcam_`wy;X=|Yw{~OzLkH=P$vLW`yY^SEoZ$JM6Sn3Eqzd9R^10&$!S~ z&KYOJ=*G@ys{xG7O^(|27b-&qL4aB@~zTu^Tv zgmJW~O-XsObqEgMf9KuXn}_4EhZG@#9_~9z@od2#ZiXV&^^k-EFUe}LxW8+W0N&U| zUBr--9u|e5UDs-<-QrwiC8`Si-m|Bpo~&0sfc;Lc&jm)w)IHD6Y_#5aV}R1`@~WHpZSv?rko)Kkp<5)k%`%&+J4c#`RyBY96$QCt-Pa@ z&Dgp=h1c88w?~Hp7M#>q;t9quqN4^D$0!|YnsK|s%c!-v-wv%DF=fGnN>oL~MTVTV zy>{|y#>%7YKfQAe z7RuQgZ88d@SJ?-Tmfu`0-=8U^LvZ`!kowoG1!dSI&nGiZPE%LTNXiK#lWH9M&>qJ`lko87;lzay zgxWrsba$m(xGCAI7Y~kxQ`-@kw|x&u5k0KR1Yu$v)g)<|u)Jk8`{2Fj`*u&WIzn5f zu#rV*Hw(V3iXxju$Sn-Ao%E=rmf0*DCyfE2m{+xUbhU`Vz3l@#hNC1 zKT_a5!F9~0*^24WMvjGGR)=A-37;*q-L~8AdwFv1Gz5~{&*B#!jR+0h@m}wvlRnGA z_RuaiHOJZ2`B{-w(hf1L$7#~8vm7L8cC429kg~KOa++l<(F`(O>6AcG!=}z0z@ygA z#O3qFt-t8q%*h#f}px-Fr}IBn^{!~!RUOjW;pdI+Hsr=3IL}5!@R8UH~#Q46@)P_=6UjG z?k4JhH_n_okeAQj{R5Ye-&gV;nIjI>%ahExD9*4I{&ZAr>o7ulFa`~BR$XnDb-{Z( zqFK_zSZ%EgW~cgJ{Q_^;{?pyvU;C|blx@J1L5G)}QtIT7kLGN%j@^`3@6F!Dad5JH z40x3<)|Z^~i@abp-I2D)33XS%>GGY$;_0IN+R_T5f>%0H0m~BP6dd-wKsXawx3}qn zh)Kf`AQ;*)QO=J^Em?H-<(-;m+2&b=bA+Ll=X~?y&t|KQ;Q9H*Y_iknlna7q?Y={wqep15} zj`wPkp{S{qX6n62ZB{p>4tmr&5YM~)=x~GtI_)}XRrGHj_LyJ~EiX&in&XS3$8okQ z_XqV>EkSG|>;niIVBoP?ujYD+gPbC;DdsO`Qo4wv_sVL}^~zXr_DFC77=>SY@5!#) z5rU;soQe4&T?jlYR?SA+F?dWkiQZpcHOZ4{-d>F;_6Mm)1wi=x=8oZFwOFR_|MlQ* zzCWtU1}F!GVfDDlL$IxGy+y}yq%7_Sg=H5hmpX_t%Sz5!6r4j4+T(CKbbU7hP^#bh z_Q$V}^v)G504z&uvGD+tor@fuf-ND%^{m=%x48(-y!=1SZrj@d(;!SvEjT{Oxc_j-NNXsNoBTWyvxOxh;>U&=*Hs?b>w5yhv|s1qjR2*jLY zg2L6s^=g@I_s8(|3>&6Ym&dGCYqjMd%+nws@aDc|?5 z%1FKDbwQFD?rT4JQ8i_VpuLst%~AjEt^c)$`{N}0^6BEq?)H~%Za)3p&yQ^%bCP$d zea{bDi&)6?G#8bavh~%)JmR@{?Y;AMq{`97tXkJF(BJ!KzvKJy^&55f(LuN~RIGO9 z=Al!uLpYLrL(eaZO2cl#2HLRirSrphbbHk_*i7y1zJDdVk8THNNCoRS8U7(zf3qnc z2}04lYFrFgmy04JeLHnWxmfa)eZNkM5)a%odV;x0-Ml;mo7L?4TbJD@d!|i7lF3wk zYh%|;%!tvhccT!_y0PuLS(7bl-koB5oPsq>KnT-YQCH&iwqwk#H+A2-a+wLvFosgu z`C>UK`*45cj2ma2_4}^R3P>TF&l(*9Pz@z4Vm+isl~*+Vs&_fBCan=lMWLMYSy36~ zii$U>&CQHPUGFBXjB*GgHj+2L^=5&dzxv{n$6tRuj3bEg=GBO%vhxD zexw2$t+K=&h0k9<=%Aw$(rOP01hm`tf`z=Q4~L^xHg6D1zs}uUoSon79#9UfQHf)k^J#FS3|EilTKNz|vPb3F&C5Mw3_xJCS8~$9V1O3&A|T)` z&GFJiHTFYtJ{0qd**fDaG3(AW4NKi;1e>agHsm>*ZR%-IguvM<2N3H?kqk~#QtUNz z79q6&8mqgb8z++xXl%RQU_yhp0`TCxb%||gO8l@(+5#qsHg2tpDXy{*laU=*Iz>)Kr z*8cZFyX9=b=1^+k*qPJDZO06R^*f8=FO814?s>y3b*gZd6Va&Z1=vL^XRppOeZ!a$mI5?6lL>yMOoCTG@|EKRpcoQ z@X`@%sDPOIEQOA6($dPVoMAu`x$x#?k01#i%x8s)w(ZpED7{MG01?Pr5+BU;vC7dU z2?&G zITD9tPawzLXtJUxn#?#hxa!v6^Sa7y(+S%sF1aeQX(fu3DHx$y=i$t3B&vS;6emG zrF0kpHR__w>xTAf3>f04&);SH>E_ez$G>%37W1NJ#=Uade)roSoyJ}0HSrJ#mlc5l zQKD?U0qZ%L!v-zD$oa#=@aExr3LR?Tg5`@xS7m{#FQe)#tLFLk`+z%6-F@5MeEf1J z$D~vkwURPyw~}Lb!OPr=v&B_`>6tJ990QCn&uxIdzYU?S-;<}5^C)GW_=Dp`-VtVxy;JtE+-$H``lAob487P*feQ_LA{migG(U{uZ-hS}}y z>2#W=UOVCm(-DkQFA)Wsx^xEIyqOSiASSX*jfP+}DLcq zUcI_Mwc{Ywv;}T|+`c|Myqd@zv&Zq{m;39>O1H1+sP&Coe(Ai)XBdD*Qw?gQ6hZ(9 z!Wrd^ku0a86mksSL1RPPjg({DLHD_<@N?&PKEmc|ZjzSI-Q7-Efia7tF^7ZBIDwX^ zK@*OgHF=hNWcR1jq;(<$fCW&bwQV$Vr_Rs6WyXi?(IG}a75bx@5GVk9a zQ}eVbpYYX1L2CkfPLU21Msup2fgD9>v@e4c=d7!*2N^$ zc`I47o+bq1FrRUrWrv+fwMh`_MvT(bv+{5l+mjMm1_9LCj79>O#I03Uc>rjr7~uh` z{?v2M7tIDoRIpNTY^*5?>^&5MR9TvpvWhb_LU2r%ry)5~sSO32n&TgTo>cm6 zr;fw4dHRI-Pk7|+RxUB0pRG3Q1;&&F(FnQ}#d1Y^>8p|B2)5(Fjj|y`-~oX01jzG0 z^(=ps8wz+ChAuh8uHRp}FGx`NaqRXFcZ>>1qcKzN1I6Q&I9pX0;%Z*aigA!xd2Y3v zh88X#2e~M&?DDIR9)0y9f}loU)Pf-wsHOsoygYU3bO!;-Q7zZAQTE5K&+BYcEigd) zeW&cWD01NA{cY=LnAC7MjLxB1Ef_}gb>2SctLr7FUIsNuHLvoE^9AGHgItI_07Wp% z^Ndk0+(z%UzS^j?qcp!yMFh^hGK(>Dl06v^Xfn~WoxtY&sNNr723^wdhufd>`? zu8ajS@eC%~$5&TcM#=;eAXq6_(f8B#ehgC28`1SsrXOWy{^mQsy*pZd3Xw?Y^!Zml zQN zn=d}U*}d2=pDpr2m?4~Bu8N#$tx$T{1Va`rJRCW`wdU@_zx3tBC11?*FTMNTL7s*;CLq@J zs(sbxs|H5!`qy8X-FXLuwHzYP z^N=VRN0ERaQi5z+14Y-Xi}P8;CML^_t@DgvWR=A+DM|ApH9)n|$uAfzR71JQ0zyXl z+c%w$kY!?C<-;UF0Nz4?-R@pm?{G5UOSmuUx z^P(QdR;#XemS?HZ`|a zrswhD#Y5~2t72I|VCY$0G%LHVi=ryD@b^1)dvi0oSI7>)<@v>W^K@3e7iLczh$-Q8 z9Hl53AYr!~ary|}`mK`T-)I%eir8TLw>d#Z*?2O$+a4D<7|R(+MSY_okIA=#;FsQg z4gol{CoOHWsJdS64#RB8gK;Rbc~jgT_lU==!W?BfgbBnpA&CTtuYe(awda*mb>c04RufHefc|3IP`tbs_P8hjfoZr6Op1*U&c{a4; z*}6`Y41#h}6e9|0Az0pUmR|3urnK%WrLl|bj^g7cKU@ zlQD6zPE3q5aMfH)c2HAbTqtSQXC-^yx5NI&3-i*nC7E^P==wOxg0r+U^T1*od`jGUB6qF73NmD{zygFC~IZvitsZuhT zfI*R!S%CmxFk_VC_a3kGSd=9H>Slh}Z6W2}%T!2C=~lKK2RVQp^B0v65KJ9Vt=w!x zULzzRs=(FHuIG>DFv}5y&5Zjv8kE{7ITsXhIY|h^`n^)M5lT{WvdJsN?RUQDpP)ub zC5Q==pr}!|TmgS1JTV<1kFdC7QHp8jr*6ON}Y+J9FIk)hu@dsEc~BtbO7^ zLQ!zWn1CYZq8}B>BBSXd3L#droH1-B4FSQ}7_0Ib!c@3`+J1-;_9sm!D&~B5I0A(8 zB5P>%`qdGUR5;kos-ZUz+r7ln7~A!BR#lv$s%9_%Ba?eSrNi7s@6Olj)uPc>LQy6; zG0+4Ho}ooeH_J+}%s66PG)j-{B!^U+9F=weSmS0@Nsw+|o{F8H$ljU!<5xFV3y(2z z1XotSK!^2gQLmOH#@nMTvS=sLT+RSU9aRRhVVoXb4<*NpqUit&{baZ^{b?8u6MySC zd~$srji#&sOzUa9+4m?Tv;hSUkV2eMt6kq(9{}SSA*dVF;W&(~EjcyNc}2}9>i2%- zX1y-&Z@+u<`VQ;BN>}3i{5(`euA;lW|AdoRKEIs5SC$u)aIBLh77&3ZC;Qe?$~20g zl_-m9I6^b0Zu{-;eE!9o2SQNe@r78u;T3ePx+($Ozx8=40%;V@DMo zU=*4H#bq#3+4GA6hHyMg=bN$}IwAmPaJ87PmNRV?76nRnkjR(-I8+&0HbtHl!ExpM zaO#|vTIzslh_UZw&NBpYQ)eQ>7y>mIGo%~UOff`e{6MR-NRc&Srv#US$46pein!`b!dL{CZ<+eSw?S9;>XKsRO49-QH zh=e4!FnOj*=Ej68=B$3=OGG1)&Ho<1v+#+WAC8jdg;;7ypF=LE1|N!~yrXoAc!8kJ@h zlHRrnO``1)h?1L0-M$%$9F;Zc20f)<0&ql*w`$Ur4=8% zdAOIOvH>jD&CQz=q_J*TyVW*%U&zVy5c}0S%{dx4=#95wu{e*BQig4uyh`eke(=SL zA_BXIF8=(({>8q#*~9qpXWjI$kJS2SOUwuwB4h;iQ#Yqd2q=~NJhu_Sq<(%Q@nwdi z3O?TKP9f4olcd^*!wG&A-Tn8h!XJOJt3_bA*xo1%Y)-*(*iJT_Y#0H`l;z7pYLw55 z`62^AH}g_!b2{|fhtoJn2O#?5)knW``~9DPIFGoW#(X_%a362v^^>Q@A&%KesF0q?#rKga{b|4sc5Z9tu=3JQDrPQA?ksrdaF{TD9oMXVxf-q)!kvf$mfD@2wAN! zc0@0-QuX)Eh8Xa0M3>yy)*_qK7Za$hiQnE)4o@apDh?8Nqr3C@~mo)!*DQFLHpE=53k=G zj>oZ=LskLjhpE@9Hy3A1Ys}D@#Q6sUNx<(uuf!&o&b;h*+ zi43^`dhl|8c=BEaoT8V-vmakCpA>|b#@T?TjKj{hX{akX@GJ$YlO!bKS%NJgphexYO?beyYnE&xBSc#%Og=T05&xoyItFobiG?i&UGIwfoy1ASbw>Ha|aK z&gy!UgUG1hgfUj)GDd(2$g5Ni>Ux#Er6Qw`R_d%OgPTI|&5{wGD+9GrW9Nr<$|@#m zaySi`(wvJ7WcyuDNdg(qS513pANGgQOK*@3&IEvI;S6e;`m>+^XhQ4vzxv18yIU*g zpS|u@bq1HP@73V-sN==v`eI(93VHIlJx>1hsW`83g;w9JqnG>B)J-Nt90y<3tbg<1 zKb`{A1C}pd9l3Ci&ae{o74dd9R&}#ntnyiToW_e{Ay4iwPS3yk$l7Fyot5juVdziF z4t~ANyE|0MC$B!aXQ;Hs0xB*kr%Y44LM1+RhdbF7j1JO#@WC0WaQ*{j^_AD)d0sV~uGp3l+H zI;mX3fI&F)Q+sj{leU-sUT2LpE=;HC?#0Li(HgBEmD&ayT)RtlvQ#%AUP^02%sAta zb%%-4_!dGy?f!J?M?gZ7g2Q-mwrL-RWHSrlbeuNpydNYIp)BxbwYWUHR8AtnJ=TTb zLgW$Jsz94r#b_#gjLLM!4n%8|R3WJ%+g7e-GlKAHRn6)g#HdDNrQ;Nu0jHu23IX_F z7+#%uGswm4?44)N%x+(v<-k&(U2c#4@zs8Mt%9T(6_ADMn^|?nuHRn}lrGiZj}rzx z5(bpkdWubAK}ZO=zs|zzbzkQG!4=y(@iqVNS^U_=gVc4Sj!k=49RV7-0@&2D)NGh zEWv)KX<`f&JRvU5q*4y!$Ok2I6oD`J!aCodju+R(qz#0zJ*u3s6nbNn)dV^gT+C<5 zAv2}-E*KCaj)zWa6;pA^VxD0=>f>I`mpLIp8b2lY4^TkwzUba6iIX%dM9>?z9r`3m z03I=jNG3ZiUv+PO@goptgrG^c!(irF$x3e11Dj?}P*I!}O^$9MC6mwf=_Sg{2Y>E^ z*#*CPG<){s$!^!u3T9>g^0!|5-`rZ?^sgQU`09&&fC{bV^l?GA5>O!=NLYvv`OAmX zCl3STsZBcjkaaHyki;;Cb9}pPwFON!Ynr0p5BQ<&Z@z0(erWrg1wZ0tC5~2d5G{iH zt>bl^BjjDIpHlKpkw#TP)r?FIPE&DS$nV10i5u&LKg;1A%5~+Gmkpvi>zF%9-`3=Ckn>H&4o& zSEu!(1@KAXHBPatkPlAk1c`D=y1mw;1q=ZYlrkp91lc0QGR!cxNi_MqnTQY)?DNCaBUX3ho^eXx!q%y}JCg@Fd>^yp8Wu4>*anGl#E{=xf? z4&9LuJS1QwuFeXCgVlb$xQrl?9@azrhkxS3pxlf;(9!am$PrFsoQ8WV_XKym;vf9U z%la9A`r&3Vug6YhIWSXbmi6x82zkULS^B^6;RnZVudF8}^IDZv1rUi~e0sfH&I=4n z6LCPnNoz?EPxJbDP8LMTc(GXq5T86*<$_G3>JD-_XB6@FLFwQScE&_b3#AQ8J@AMK zn9XNZRT>GrQzXV&vHs%ayLFI)V3D+5_8zKlXEtajxfL4 zoK<-_>XCC&Cx2dHqj2)2OuW$*)QH@V1+XGbos7p$KB!X zxSMYJhq3Lj8J^cq7mHQdRGj24V(lq_7xi;?`GeQ9dG3^zqiZT0vCT?sB^&RL_4yB7 ztiN)+`R&^+ONV`f?oO$1HMlUt#brTMz%rC-cjSOv{>U6I(B-2VMfC8|-j|`D((qsu zs4_U*?55v3jxltjzS*B1Zy-SB*-C8PZeF8iahB)&Mn25=HC~}7f8;v5Y}!@@2b+1d zTIL8lC+%?5RnF{)(woLYfGOqCS_SXk0_FTGKla}5{?hAr&#M==<9qMTNCqGOsY@}d zFwMJ8Utc9>zKMo2T;+N2DNx5ii#+2wWH}ji=-(XIb#r_;iTT|13J4crEX%xP^5BGP0_S##XjW&BFCJr( zpjMDs;B8&jTx9qM*Yi~Mp3OA&UU2s05r`#L5A{2n^*5e9`k_lM5{Uljavg#(XiQXn zmXCv-q!I#I87bk>o57Bv6pN~{3J*%ACIMw-(F}b^XJAy*sP;R_8JVrK<)#SQT`bqD zRn^MYq-UQ*k*hTg76eR})tR(CMx0Uxqg|hsWx=I%m|_5e)@nRWnZN*%PhZ{)gX%h+ z5`!YD7-uF5eByrv*d=06dJcnDZf7+AId}cmKKXgQ4;2_`NSa1tw950P&#vRS=D9R=jFv z(&yY$7N(oapMLiAr_b{O&FlKn^~F&gRVy*c&)%88_{}%|_x6W7r*H8-zBn8K=j5s; z!GTi(N><1p^K5><9Y4Kmv!cn)T=|4Au5$$ZvZGA|ffWK{y4 z74{woj^?YFXv(so=u^ z0M(KncLq^pjQ0pk-t=8Mh7Px#s7ua~8FknB#j*%NsRURj{Q-<V)1W;r#f1MEGB zAVQu~3Zv2P{db?IpNVlm6cNh$!FubnoOH(tKtv!MbPuUN+pH15+ii!hKPXv|3unC? zF(?XF;5Au&Yu#Km^UKCa9YR=a>SWorN%_o*MrkL`CI|$E*$3}DJ@p3-g2+>ygs~hT z5X1ER$(pl_k*d`uCRRqDb_2^17Ie~*Le`WOq3G&rjzHAPOoLj?7>uFc2OHl4Ne&Pw z0P_`v zt*Z)t>ZNgdvCM;ZAw!%I@4V8ErvW%?kHh`$ls>g&kaY4sm3wb~%d;W>&ToBzSaZH9 z`t29A*IAWQ%nHtH&Q}Y9223sNRiLh?nEG|~>RF#Xesj?VCo?|(L zs$$(ZU>;MadAX|VOj^UL45tdEpn`MeFV}URj67Dj4}Lnwymxxm-YFQ>`wPhExc?Md}cH*DE=CyU+rMLu@Q zK~z-2*|#RR0B6glJ5Aach=7slG*{O6;OczF1#nvd$nS3VMVV2WuV-^g7(v8& zTh%<#t^qVvsiZARme={|G{G2)DxotrIhZ}pBf$WYP}K}z>H*eD@9(X3PUL7x5O08( zA{1#L&N%%3wH)+u)ES7?#m`>nkBa6x_z2sRMHHpdVa@wq9u9iw-TqG1tF)u{dsWtD z-5?*lwsBHE39K}`zd4~Cg0%X^Q9BnS6D*}h5R{_6I9nXLodaH*NQjuEO#=!DQ|s4f zwHk-P%Bv_rde$BEy5~CZm$~ ze%^>IQi6l$tNEq#5&$5wT#zuUMKdpkP9j7SzoN%suj`t|fZyCd?Dm74eB0}04uyz0 zg}dF5QNaKoS{p)y$t0$o2U;o^Tt8{XK~op^uT(xOdB!l-m|%?H_P!gALz$uDag30Z z{;B@xH@@@5!~S(&kJ_SPR^sK83pjO+xai=UwOC4hIEKXfKb(4!HTB~>U@!=={Nd}z z&!2H2maBR+W0#Z@AY-Dc3O%`;7Kk{A9pd5P_3iY~@!GRkp0Dv{g^GFc#mC+K_?-#| zn5{2<@-o|mYMI@=QCZ2QGmyn`(pmxULBAjFzkM>Y$iVjXu4REwF1hv^FR$Es)y(Jl z;Bpq`OK|%9(I5WO*@rWR;gid&tE=8 z=qY*+11^g>M#Lf$j6WVU%HaCC8}1lp-Wj%JpH?LmLEF%11~SXN?dLW6ub&KJ9T22c45S7xdzC zHM*&jG9q84A|dnAGZ+btKDe?b<0Mz}i_(WRbB2r3n(6j#H(QG&y64%WtBY=I9fW{E!C>lAr8eET zS(M9p6GJ9r1PJI}9qtAXY_{P2WEf_Px(+D5_wE@+P>x1RUFL)m*zXhL5+}7afn^BT@+*s_ zIvybQotZK*>qqsfSLbCuXJY$myn0fSCX&nI?1RSIFh%X7qQv)Vs4G@vbn2lTCYaDx z%acnuaz<4N!3%O$G@Qp#`AP|=lUs=s06)BZ_Tw8ZeFULPtWV^GXCm_ePAw;xDx+Zq z%^_aq7u(Y$$4(mS$LXr%S7-0n&ljU?Gg8oELC-|<<<0Vfw_dABkppU))Q%?;rID^ai z!WifD(BzALRBG~XE84KNqqB|>rIf-V&IjwKi@s%2U@btIw20zmAK4{ceMRaS3i3qgwz zY>c6qv6NOb(ljOh>3{W)m8*KzEH5q=K3a=)FI7|Kf@h2qJ6dQV%e)6Fb&e6_v_2dU zYV0>xLK%ZGy1yMzOxksvJdM~*SayL|kuY*Nm{f{~(S|T8GYsCSaQ9}a7Nr^0)VicR zSkefBwb9tX34@03?|Yjh&>_0ek7kfIFB1`hQneL6zCQCnCIC9%tjKQfI*4JGA=$Ys z7gkRiC`i%8a&0x(ZchQ3Ji%C*F<1weBnmD}qt?l^o1a}}2!xEY$Jb}4>FA@kPIHni zS4CD}CBb@eO-OPgU`(Z!XUk%-E_B)tAONXtFt%C`J>&F~m$xp)hR>S1E^Bi4*>5lHj?ah-7CJ=Tyl+N6jeNFh;^&<-4O{>TZ2(W-wFTb+B{L$;UWL;W`oXD8S zW5&VMOL@|ZdEFmuKUzv*qTw*^PDwB{YO|Q<;+#HwaoD%rY&LJMGml;MLkscl#cH_@ zo?KqfCaXrP5s948R8$=;$K>s}WHE)Tq|;}nJMHoYHZ;3B167?5X1aax0R{&7`GDXc z9-l3~yy9~pD!hBpm?3Q)WUw7&-+H6N(EGe1YSew3Jnm^Tus(Re2{tkgCj~f!FiB{1 z@IFMw3B$;0_wGASCfN^if|M8whe@O4^>pniUHd)+PfS^6Im>s477`GQBe-xbk_-jl z#w3Zvi>nMxu4c75jvyK|gz~zuUSWV(+R$M)$Zn9sXiwcVUvS1fj(%t*^`ywl?x?l# z5J49W1aRy}H5qAao+Hk%o{%=Mn&*^;WXdBr1b;lp5I6-zRuRFd0!~>)FcORk&Z71h z21)^dLFCvN%|&%;yP<6#J)Td=YYn$|J)uxd0sq*a{GiuEUL*>3*B=Ohn^~?VxZ5e{ zH3)%bNKUrO`6SK0Q}dZf&3T8*1t*vw3?^x3^BKnE_06^@m~+t>HOWLFXBlhq#;3du z5i_2XDqwe%->qjLs5_{6D7+EE+9(OPd&@!n6B*kS(z2oq)XgyE@#KX zAwWBy=OnA7iPq_{3tcOzz=+4LlYgDYnD}{=u^%B((O`GTO3exR6tSVR^XA)CblU~ql8Kp-TIqIDOSS-UfGa7YAe9Pn%yOjDE=-t?+Y=$EE>;)wb;0>$R5Ia~ zNnKGeK?&xRHtS*^H-)o!Y)`@Zv)NVOsc}@YQxW5% zYOS$#1uzBy`(=|sfWG*=qsU|62?crH2nGeGpT53XEc2>JEz{*i>epZ#53S7d4FBLC zJ)f0?LU8x`lx$d#wZ-NQ%#@dn@kNe)8* zvX3l}0f5uqBwIsB7NFy4?0c&fe0bB7jAIn1lZ1#ivz*ZsDFz53z{K;1oAhqr3`7?u zXUmj?T~yLA4g>TcBB{~} zqpWFaarKR}`;YGtj`s)i?gwj}LHgBv`GZ$kF{dbBttvpR0YN#vsH#N&Xh&RX)gcU$ zT*C(+z$rDJ^?Y4e=k;XA-gu7-!EgrCG-zlsL*wX9M-u=5m`qmh_u6}W_o71-Ckl6R zgl1WeoO2lCX|e=UJ^AfE=_j1=ZLb21j8T%@!Ju#DlgDd74PL|3ixz1dD%Q0z?j4!u zR-22*RaFpg!~5?%KK7>oT)OuFTrNwVAvxG)zMPkfNevh=M3RnieO9G~tFy*g?=2uo zww7Y3oo|O>e;6Zxr_;FJ6qI=w!)ZT3g9OXElMX%-id{4q(c!HZZc+wgkY!X&*hf^< i83Y=qUNv#v{vQDd5?!>&%R(Li0000. +# This is only added to make the items more visible to avoid confusion, but you will no longer see the default inventory images for these items. When you want to test the default inventory image of drawtypes, this should be turned off. +testnodes_show_fallback_image (Use fallback inventory images) bool false