From cad718f0e6e32994078449beb3b7e3a8d432b07d Mon Sep 17 00:00:00 2001 From: Looki2000 Date: Mon, 20 Feb 2023 17:57:08 +0100 Subject: [PATCH] removed devtest, so other sussy changes you dont have to worry about --- android/app/build.gradle | 4 +- android/settings.gradle | 2 +- games/devtest/.luacheckrc | 43 - games/devtest/LICENSE.txt | 4 - games/devtest/README.md | 51 - games/devtest/game.conf | 2 - games/devtest/menu/background.png | Bin 160 -> 0 bytes games/devtest/menu/header.png | Bin 404 -> 0 bytes games/devtest/menu/icon.png | Bin 217 -> 0 bytes games/devtest/mods/basenodes/init.lua | 351 ------- games/devtest/mods/basenodes/mod.conf | 2 - .../basenodes_dirt_with_grass_bottom.png | Bin 187 -> 0 bytes .../textures/basenodes_dirt_with_snow.png | Bin 166 -> 0 bytes .../basenodes_dirt_with_snow_bottom.png | Bin 177 -> 0 bytes .../textures/basenodes_snow_sheet.png | Bin 166 -> 0 bytes .../mods/basenodes/textures/default_apple.png | Bin 102 -> 0 bytes .../basenodes/textures/default_cobble.png | Bin 340 -> 0 bytes .../textures/default_desert_sand.png | Bin 293 -> 0 bytes .../textures/default_desert_stone.png | Bin 584 -> 0 bytes .../mods/basenodes/textures/default_dirt.png | Bin 7303 -> 0 bytes .../mods/basenodes/textures/default_grass.png | Bin 697 -> 0 bytes .../basenodes/textures/default_gravel.png | Bin 171 -> 0 bytes .../mods/basenodes/textures/default_ice.png | Bin 369 -> 0 bytes .../textures/default_junglegrass.png | Bin 201 -> 0 bytes .../textures/default_jungleleaves.png | Bin 399 -> 0 bytes .../basenodes/textures/default_jungletree.png | Bin 730 -> 0 bytes .../textures/default_jungletree_top.png | Bin 714 -> 0 bytes .../mods/basenodes/textures/default_lava.png | Bin 172 -> 0 bytes .../textures/default_lava_flowing.png | Bin 91 -> 0 bytes .../basenodes/textures/default_leaves.png | Bin 883 -> 0 bytes .../textures/default_mossycobble.png | Bin 574 -> 0 bytes .../textures/default_pine_needles.png | Bin 648 -> 0 bytes .../basenodes/textures/default_pine_tree.png | Bin 604 -> 0 bytes .../textures/default_pine_tree_top.png | Bin 174 -> 0 bytes .../textures/default_river_water.png | Bin 496 -> 0 bytes .../textures/default_river_water_flowing.png | Bin 99 -> 0 bytes .../mods/basenodes/textures/default_sand.png | Bin 554 -> 0 bytes .../mods/basenodes/textures/default_snow.png | Bin 166 -> 0 bytes .../basenodes/textures/default_snow_side.png | Bin 152 -> 0 bytes .../mods/basenodes/textures/default_stone.png | Bin 313 -> 0 bytes .../mods/basenodes/textures/default_tree.png | Bin 659 -> 0 bytes .../basenodes/textures/default_tree_top.png | Bin 175 -> 0 bytes .../mods/basenodes/textures/default_water.png | Bin 302 -> 0 bytes .../textures/default_water_flowing.png | Bin 115 -> 0 bytes .../dirt_with_grass/default_grass.png | Bin 829 -> 0 bytes .../dirt_with_grass/default_grass_side.png | Bin 796 -> 0 bytes .../devtest/mods/basenodes/textures/info.txt | 7 - games/devtest/mods/basetools/init.lua | 449 --------- games/devtest/mods/basetools/mod.conf | 2 - .../textures/basetools_bloodsword.png | Bin 165 -> 0 bytes .../textures/basetools_elementalsword.png | Bin 177 -> 0 bytes .../textures/basetools_firesword.png | Bin 166 -> 0 bytes .../textures/basetools_healdagger.png | Bin 162 -> 0 bytes .../textures/basetools_healsword.png | Bin 170 -> 0 bytes .../basetools/textures/basetools_icesword.png | Bin 170 -> 0 bytes .../basetools/textures/basetools_mesepick.png | Bin 156 -> 0 bytes .../textures/basetools_mesesword.png | Bin 163 -> 0 bytes .../basetools/textures/basetools_steelaxe.png | Bin 131 -> 0 bytes .../textures/basetools_steeldagger.png | Bin 154 -> 0 bytes .../textures/basetools_steelpick.png | Bin 159 -> 0 bytes .../textures/basetools_steelpick_l1.png | Bin 190 -> 0 bytes .../textures/basetools_steelpick_l2.png | Bin 177 -> 0 bytes .../textures/basetools_steelshears.png | Bin 208 -> 0 bytes .../textures/basetools_steelshovel.png | Bin 140 -> 0 bytes .../textures/basetools_steelsword.png | Bin 163 -> 0 bytes .../basetools/textures/basetools_stoneaxe.png | Bin 130 -> 0 bytes .../textures/basetools_stonepick.png | Bin 155 -> 0 bytes .../textures/basetools_stoneshears.png | Bin 224 -> 0 bytes .../textures/basetools_stoneshovel.png | Bin 134 -> 0 bytes .../textures/basetools_stonesword.png | Bin 159 -> 0 bytes .../textures/basetools_superhealsword.png | Bin 192 -> 0 bytes .../textures/basetools_titaniumsword.png | Bin 160 -> 0 bytes .../basetools/textures/basetools_usespick.png | Bin 161 -> 0 bytes .../textures/basetools_usessword.png | Bin 133 -> 0 bytes .../basetools/textures/basetools_woodaxe.png | Bin 121 -> 0 bytes .../textures/basetools_wooddagger.png | Bin 139 -> 0 bytes .../basetools/textures/basetools_woodpick.png | Bin 149 -> 0 bytes .../textures/basetools_woodshears.png | Bin 212 -> 0 bytes .../textures/basetools_woodshovel.png | Bin 133 -> 0 bytes .../textures/basetools_woodsword.png | Bin 139 -> 0 bytes games/devtest/mods/broken/init.lua | 11 - games/devtest/mods/broken/mod.conf | 2 - games/devtest/mods/bucket/init.lua | 27 - games/devtest/mods/bucket/mod.conf | 2 - games/devtest/mods/bucket/textures/bucket.png | Bin 163 -> 0 bytes .../mods/bucket/textures/bucket_lava.png | Bin 168 -> 0 bytes .../mods/bucket/textures/bucket_water.png | Bin 168 -> 0 bytes games/devtest/mods/chest/init.lua | 40 - games/devtest/mods/chest/mod.conf | 2 - .../mods/chest/textures/chest_chest.png | Bin 163 -> 0 bytes .../devtest/mods/chest_of_everything/init.lua | 136 --- .../devtest/mods/chest_of_everything/mod.conf | 2 - .../textures/chest_of_everything_chest.png | Bin 210 -> 0 bytes games/devtest/mods/dignodes/init.lua | 37 - games/devtest/mods/dignodes/mod.conf | 2 - .../dignodes/textures/dignodes_choppy.png | Bin 187 -> 0 bytes .../dignodes/textures/dignodes_cracky.png | Bin 193 -> 0 bytes .../dignodes/textures/dignodes_crumbly.png | Bin 172 -> 0 bytes .../textures/dignodes_dig_immediate.png | Bin 170 -> 0 bytes .../mods/dignodes/textures/dignodes_none.png | Bin 201 -> 0 bytes .../dignodes/textures/dignodes_rating1.png | Bin 94 -> 0 bytes .../dignodes/textures/dignodes_rating2.png | Bin 92 -> 0 bytes .../dignodes/textures/dignodes_rating3.png | Bin 93 -> 0 bytes games/devtest/mods/experimental/commands.lua | 221 ---- games/devtest/mods/experimental/detached.lua | 29 - games/devtest/mods/experimental/init.lua | 23 - games/devtest/mods/experimental/items.lua | 105 -- games/devtest/mods/experimental/mod.conf | 2 - .../textures/experimental_callback_node.png | Bin 139 -> 0 bytes .../textures/experimental_particle_sheet.png | Bin 208 -> 0 bytes .../experimental_particle_vertical.png | Bin 308 -> 0 bytes .../textures/experimental_tester_tool_1.png | Bin 138 -> 0 bytes .../devtest/mods/give_initial_stuff/init.lua | 37 - .../devtest/mods/give_initial_stuff/mod.conf | 3 - games/devtest/mods/initial_message/init.lua | 9 - games/devtest/mods/initial_message/mod.conf | 2 - games/devtest/mods/mapgen/init.lua | 104 -- games/devtest/mods/mapgen/mod.conf | 3 - games/devtest/mods/modchannels/init.lua | 14 - games/devtest/mods/modchannels/mod.conf | 2 - games/devtest/mods/soundstuff/init.lua | 174 ---- games/devtest/mods/soundstuff/mod.conf | 2 - .../soundstuff/sounds/soundstuff_mono.ogg | Bin 4362 -> 0 bytes .../soundstuff/textures/soundstuff_eat.png | Bin 113 -> 0 bytes .../textures/soundstuff_node_blank.png | Bin 83 -> 0 bytes .../textures/soundstuff_node_climbable.png | Bin 189 -> 0 bytes .../textures/soundstuff_node_dig.png | Bin 126 -> 0 bytes .../textures/soundstuff_node_dug.png | Bin 132 -> 0 bytes .../textures/soundstuff_node_fall.png | Bin 100 -> 0 bytes .../textures/soundstuff_node_footstep.png | Bin 120 -> 0 bytes .../textures/soundstuff_node_place.png | Bin 115 -> 0 bytes .../textures/soundstuff_node_place_failed.png | Bin 143 -> 0 bytes .../textures/soundstuff_node_sound.png | Bin 116 -> 0 bytes games/devtest/mods/stairs/init.lua | 65 -- games/devtest/mods/stairs/mod.conf | 3 - games/devtest/mods/testentities/armor.lua | 61 -- games/devtest/mods/testentities/callbacks.lua | 78 -- games/devtest/mods/testentities/init.lua | 3 - games/devtest/mods/testentities/mod.conf | 2 - .../textures/testentities_armorball.png | Bin 1385 -> 0 bytes .../textures/testentities_callback.png | Bin 156 -> 0 bytes .../textures/testentities_callback_step.png | Bin 166 -> 0 bytes .../textures/testentities_cube1.png | Bin 130 -> 0 bytes .../textures/testentities_cube2.png | Bin 128 -> 0 bytes .../textures/testentities_cube3.png | Bin 124 -> 0 bytes .../textures/testentities_cube4.png | Bin 126 -> 0 bytes .../textures/testentities_cube5.png | Bin 126 -> 0 bytes .../textures/testentities_cube6.png | Bin 126 -> 0 bytes .../textures/testentities_dungeon_master.png | Bin 2855 -> 0 bytes .../textures/testentities_sprite.png | Bin 120 -> 0 bytes .../textures/testentities_upright_sprite1.png | Bin 114 -> 0 bytes .../textures/testentities_upright_sprite2.png | Bin 119 -> 0 bytes games/devtest/mods/testentities/visuals.lua | 137 --- games/devtest/mods/testfood/init.lua | 31 - games/devtest/mods/testfood/mod.conf | 2 - .../mods/testfood/textures/testfood_bad.png | Bin 126 -> 0 bytes .../mods/testfood/textures/testfood_bad2.png | Bin 133 -> 0 bytes .../mods/testfood/textures/testfood_good.png | Bin 129 -> 0 bytes .../mods/testfood/textures/testfood_good2.png | Bin 145 -> 0 bytes .../testfood/textures/testfood_replace.png | Bin 135 -> 0 bytes games/devtest/mods/testformspec/LICENSE.txt | 14 - games/devtest/mods/testformspec/callbacks.lua | 51 - .../devtest/mods/testformspec/dummy_items.lua | 14 - games/devtest/mods/testformspec/formspec.lua | 536 ---------- games/devtest/mods/testformspec/init.lua | 3 - games/devtest/mods/testformspec/mod.conf | 2 - .../models/testformspec_character.b3d | Bin 73433 -> 0 bytes .../models/testformspec_chest.obj | 79 -- .../textures/default_chest_front.png | Bin 423 -> 0 bytes .../textures/default_chest_inside.png | Bin 102 -> 0 bytes .../textures/default_chest_side.png | Bin 375 -> 0 bytes .../textures/default_chest_top.png | Bin 423 -> 0 bytes .../textures/testformspec_9slice.png | Bin 5935 -> 0 bytes .../textures/testformspec_animation.jpg | Bin 4376 -> 0 bytes .../textures/testformspec_animation.png | Bin 214 -> 0 bytes .../testformspec/textures/testformspec_bg.png | Bin 92 -> 0 bytes .../textures/testformspec_bg_9slice.png | Bin 146 -> 0 bytes .../testformspec_bg_9slice_hovered.png | Bin 146 -> 0 bytes .../testformspec_bg_9slice_pressed.png | Bin 146 -> 0 bytes .../textures/testformspec_bg_hovered.png | Bin 92 -> 0 bytes .../textures/testformspec_bg_pressed.png | Bin 91 -> 0 bytes .../textures/testformspec_button_image.png | Bin 146 -> 0 bytes .../textures/testformspec_character.png | Bin 2754 -> 0 bytes .../textures/testformspec_hovered.png | Bin 195 -> 0 bytes .../textures/testformspec_item.png | Bin 182 -> 0 bytes .../textures/testformspec_node.png | Bin 113 -> 0 bytes .../textures/testformspec_pressed.png | Bin 165 -> 0 bytes games/devtest/mods/testhud/init.lua | 81 -- games/devtest/mods/testhud/mod.conf | 2 - games/devtest/mods/testitems/init.lua | 55 - games/devtest/mods/testitems/mod.conf | 2 - .../textures/testitems_overlay_base.png | Bin 106 -> 0 bytes .../textures/testitems_overlay_overlay.png | Bin 220 -> 0 bytes games/devtest/mods/testnodes/README.md | 11 - games/devtest/mods/testnodes/drawtypes.lua | 629 ------------ games/devtest/mods/testnodes/init.lua | 11 - games/devtest/mods/testnodes/light.lua | 50 - games/devtest/mods/testnodes/liquids.lua | 134 --- games/devtest/mods/testnodes/meshes.lua | 145 --- games/devtest/mods/testnodes/mod.conf | 3 - .../testnodes/models/testnodes_ocorner.obj | 23 - .../testnodes/models/testnodes_pyramid.obj | 24 - games/devtest/mods/testnodes/nodeboxes.lua | 81 -- games/devtest/mods/testnodes/overlays.lua | 93 -- games/devtest/mods/testnodes/param2.lua | 168 ---- games/devtest/mods/testnodes/properties.lua | 397 -------- games/devtest/mods/testnodes/textures.lua | 290 ------ .../mods/testnodes/textures/testnodes_1.png | Bin 107 -> 0 bytes .../mods/testnodes/textures/testnodes_1g.png | Bin 104 -> 0 bytes .../mods/testnodes/textures/testnodes_1w.png | Bin 121 -> 0 bytes .../mods/testnodes/textures/testnodes_1wg.png | Bin 122 -> 0 bytes .../mods/testnodes/textures/testnodes_2.png | Bin 112 -> 0 bytes .../mods/testnodes/textures/testnodes_2g.png | Bin 110 -> 0 bytes .../mods/testnodes/textures/testnodes_2w.png | Bin 134 -> 0 bytes .../mods/testnodes/textures/testnodes_2wg.png | Bin 135 -> 0 bytes .../mods/testnodes/textures/testnodes_3.png | Bin 105 -> 0 bytes .../mods/testnodes/textures/testnodes_3g.png | Bin 103 -> 0 bytes .../mods/testnodes/textures/testnodes_3w.png | Bin 112 -> 0 bytes .../mods/testnodes/textures/testnodes_3wg.png | Bin 112 -> 0 bytes .../mods/testnodes/textures/testnodes_4.png | Bin 97 -> 0 bytes .../mods/testnodes/textures/testnodes_4g.png | Bin 95 -> 0 bytes .../mods/testnodes/textures/testnodes_4w.png | Bin 128 -> 0 bytes .../mods/testnodes/textures/testnodes_4wg.png | Bin 128 -> 0 bytes .../mods/testnodes/textures/testnodes_5.png | Bin 98 -> 0 bytes .../mods/testnodes/textures/testnodes_5g.png | Bin 98 -> 0 bytes .../mods/testnodes/textures/testnodes_5w.png | Bin 117 -> 0 bytes .../mods/testnodes/textures/testnodes_5wg.png | Bin 117 -> 0 bytes .../mods/testnodes/textures/testnodes_6.png | Bin 100 -> 0 bytes .../mods/testnodes/textures/testnodes_6g.png | Bin 98 -> 0 bytes .../mods/testnodes/textures/testnodes_6w.png | Bin 117 -> 0 bytes .../mods/testnodes/textures/testnodes_6wg.png | Bin 117 -> 0 bytes .../testnodes/textures/testnodes_airlike.png | Bin 92 -> 0 bytes .../testnodes/textures/testnodes_allfaces.png | Bin 150 -> 0 bytes .../textures/testnodes_allfaces_optional.png | Bin 150 -> 0 bytes .../testnodes/textures/testnodes_alpha.png | Bin 96 -> 0 bytes .../testnodes/textures/testnodes_alpha128.png | Bin 136 -> 0 bytes .../testnodes/textures/testnodes_alpha191.png | Bin 132 -> 0 bytes .../testnodes/textures/testnodes_alpha64.png | Bin 134 -> 0 bytes .../testnodes/textures/testnodes_anim.png | Bin 274 -> 0 bytes .../textures/testnodes_attached_bottom.png | Bin 86 -> 0 bytes .../textures/testnodes_attached_side.png | Bin 98 -> 0 bytes .../textures/testnodes_attached_top.png | Bin 87 -> 0 bytes .../textures/testnodes_attachedw_bottom.png | Bin 130 -> 0 bytes .../textures/testnodes_attachedw_side.png | Bin 122 -> 0 bytes .../textures/testnodes_attachedw_top.png | Bin 109 -> 0 bytes .../testnodes/textures/testnodes_bouncy.png | Bin 106 -> 0 bytes .../textures/testnodes_buildable_to.png | Bin 89 -> 0 bytes .../testnodes_climbable_nojump_side.png | Bin 164 -> 0 bytes .../testnodes_climbable_resistance_side.png | Bin 295 -> 0 bytes .../textures/testnodes_climbable_side.png | Bin 150 -> 0 bytes .../testnodes/textures/testnodes_damage.png | Bin 108 -> 0 bytes .../textures/testnodes_damage_neg.png | Bin 121 -> 0 bytes .../testnodes/textures/testnodes_drowning.png | Bin 127 -> 0 bytes .../textures/testnodes_fall_damage_minus.png | Bin 116 -> 0 bytes .../textures/testnodes_fall_damage_plus.png | Bin 117 -> 0 bytes .../textures/testnodes_fencelike.png | Bin 90 -> 0 bytes .../testnodes/textures/testnodes_firelike.png | Bin 149 -> 0 bytes .../textures/testnodes_glasslike.png | Bin 117 -> 0 bytes .../textures/testnodes_glasslike_detail.png | Bin 167 -> 0 bytes .../textures/testnodes_glasslike_framed.png | Bin 88 -> 0 bytes .../textures/testnodes_glasslike_framed2.png | Bin 118 -> 0 bytes .../testnodes_glasslike_framed_optional.png | Bin 128 -> 0 bytes .../textures/testnodes_glasslikeliquid.png | Bin 122 -> 0 bytes .../testnodes/textures/testnodes_light.png | Bin 117 -> 0 bytes .../testnodes/textures/testnodes_light_1.png | Bin 158 -> 0 bytes .../testnodes/textures/testnodes_light_10.png | Bin 147 -> 0 bytes .../testnodes/textures/testnodes_light_11.png | Bin 149 -> 0 bytes .../testnodes/textures/testnodes_light_12.png | Bin 138 -> 0 bytes .../testnodes/textures/testnodes_light_13.png | Bin 137 -> 0 bytes .../testnodes/textures/testnodes_light_14.png | Bin 132 -> 0 bytes .../testnodes/textures/testnodes_light_2.png | Bin 152 -> 0 bytes .../testnodes/textures/testnodes_light_3.png | Bin 150 -> 0 bytes .../testnodes/textures/testnodes_light_4.png | Bin 157 -> 0 bytes .../testnodes/textures/testnodes_light_5.png | Bin 150 -> 0 bytes .../testnodes/textures/testnodes_light_6.png | Bin 154 -> 0 bytes .../testnodes/textures/testnodes_light_7.png | Bin 146 -> 0 bytes .../testnodes/textures/testnodes_light_8.png | Bin 139 -> 0 bytes .../testnodes/textures/testnodes_light_9.png | Bin 149 -> 0 bytes .../textures/testnodes_line_crossing.png | Bin 130 -> 0 bytes .../textures/testnodes_line_curved.png | Bin 123 -> 0 bytes .../textures/testnodes_line_straight.png | Bin 115 -> 0 bytes .../textures/testnodes_line_t_junction.png | Bin 128 -> 0 bytes .../testnodes/textures/testnodes_liquid.png | Bin 95 -> 0 bytes .../textures/testnodes_liquidflowing.png | Bin 132 -> 0 bytes .../textures/testnodes_liquidflowing_r0.png | Bin 162 -> 0 bytes .../textures/testnodes_liquidflowing_r1.png | Bin 160 -> 0 bytes .../textures/testnodes_liquidflowing_r2.png | Bin 154 -> 0 bytes .../textures/testnodes_liquidflowing_r3.png | Bin 155 -> 0 bytes .../textures/testnodes_liquidflowing_r4.png | Bin 154 -> 0 bytes .../textures/testnodes_liquidflowing_r5.png | Bin 155 -> 0 bytes .../textures/testnodes_liquidflowing_r6.png | Bin 155 -> 0 bytes .../textures/testnodes_liquidflowing_r7.png | Bin 157 -> 0 bytes .../textures/testnodes_liquidflowing_r8.png | Bin 152 -> 0 bytes .../textures/testnodes_liquidsource.png | Bin 128 -> 0 bytes .../textures/testnodes_liquidsource_r0.png | Bin 149 -> 0 bytes .../textures/testnodes_liquidsource_r1.png | Bin 152 -> 0 bytes .../textures/testnodes_liquidsource_r2.png | Bin 152 -> 0 bytes .../textures/testnodes_liquidsource_r3.png | Bin 152 -> 0 bytes .../textures/testnodes_liquidsource_r4.png | Bin 155 -> 0 bytes .../textures/testnodes_liquidsource_r5.png | Bin 150 -> 0 bytes .../textures/testnodes_liquidsource_r6.png | Bin 148 -> 0 bytes .../textures/testnodes_liquidsource_r7.png | Bin 154 -> 0 bytes .../textures/testnodes_liquidsource_r8.png | Bin 148 -> 0 bytes .../textures/testnodes_mesh_stripes.png | Bin 150 -> 0 bytes .../textures/testnodes_mesh_stripes2.png | Bin 144 -> 0 bytes .../textures/testnodes_mesh_stripes3.png | Bin 85 -> 0 bytes .../textures/testnodes_mesh_stripes4.png | Bin 93 -> 0 bytes .../textures/testnodes_move_resistance.png | Bin 221 -> 0 bytes .../testnodes/textures/testnodes_node.png | Bin 89 -> 0 bytes .../textures/testnodes_node_falling.png | Bin 112 -> 0 bytes .../testnodes/textures/testnodes_nodebox.png | Bin 112 -> 0 bytes .../textures/testnodes_nojump_side.png | Bin 94 -> 0 bytes .../textures/testnodes_nojump_top.png | Bin 121 -> 0 bytes .../testnodes/textures/testnodes_normal.png | Bin 92 -> 0 bytes .../testnodes/textures/testnodes_normal1.png | Bin 114 -> 0 bytes .../testnodes/textures/testnodes_normal2.png | Bin 122 -> 0 bytes .../testnodes/textures/testnodes_normal3.png | Bin 114 -> 0 bytes .../testnodes/textures/testnodes_normal4.png | Bin 106 -> 0 bytes .../testnodes/textures/testnodes_normal5.png | Bin 109 -> 0 bytes .../testnodes/textures/testnodes_normal6.png | Bin 111 -> 0 bytes .../testnodes/textures/testnodes_overlay.png | Bin 153 -> 0 bytes .../textures/testnodes_overlayable.png | Bin 87 -> 0 bytes .../textures/testnodes_palette_facedir.png | Bin 87 -> 0 bytes .../textures/testnodes_palette_full.png | Bin 568 -> 0 bytes .../testnodes_palette_wallmounted.png | Bin 136 -> 0 bytes .../textures/testnodes_plantlike.png | Bin 183 -> 0 bytes .../testnodes_plantlike_degrotate.png | Bin 176 -> 0 bytes .../textures/testnodes_plantlike_leveled.png | Bin 163 -> 0 bytes .../testnodes_plantlike_meshoptions.png | Bin 164 -> 0 bytes .../textures/testnodes_plantlike_rooted.png | Bin 182 -> 0 bytes .../testnodes_plantlike_rooted_base.png | Bin 101 -> 0 bytes ...s_plantlike_rooted_base_side_degrotate.png | Bin 145 -> 0 bytes ...des_plantlike_rooted_base_side_leveled.png | Bin 127 -> 0 bytes ...plantlike_rooted_base_side_meshoptions.png | Bin 128 -> 0 bytes ...plantlike_rooted_base_side_wallmounted.png | Bin 224 -> 0 bytes ...odes_plantlike_rooted_base_side_waving.png | Bin 126 -> 0 bytes .../testnodes_plantlike_rooted_degrotate.png | Bin 176 -> 0 bytes .../testnodes_plantlike_rooted_leveled.png | Bin 162 -> 0 bytes ...testnodes_plantlike_rooted_meshoptions.png | Bin 162 -> 0 bytes ...testnodes_plantlike_rooted_wallmounted.png | Bin 268 -> 0 bytes .../testnodes_plantlike_rooted_waving.png | Bin 125 -> 0 bytes .../testnodes_plantlike_wallmounted.png | Bin 268 -> 0 bytes .../textures/testnodes_plantlike_waving.png | Bin 127 -> 0 bytes .../textures/testnodes_rail2_crossing.png | Bin 246 -> 0 bytes .../textures/testnodes_rail2_curved.png | Bin 253 -> 0 bytes .../textures/testnodes_rail2_straight.png | Bin 246 -> 0 bytes .../textures/testnodes_rail2_t_junction.png | Bin 254 -> 0 bytes .../textures/testnodes_rail_crossing.png | Bin 151 -> 0 bytes .../textures/testnodes_rail_curved.png | Bin 164 -> 0 bytes .../textures/testnodes_rail_straight.png | Bin 133 -> 0 bytes .../textures/testnodes_rail_t_junction.png | Bin 202 -> 0 bytes .../testnodes/textures/testnodes_signlike.png | Bin 150 -> 0 bytes .../testnodes/textures/testnodes_slippery.png | Bin 111 -> 0 bytes .../textures/testnodes_street_crossing.png | Bin 137 -> 0 bytes .../textures/testnodes_street_curved.png | Bin 115 -> 0 bytes .../textures/testnodes_street_straight.png | Bin 101 -> 0 bytes .../textures/testnodes_street_t_junction.png | Bin 126 -> 0 bytes .../textures/testnodes_sunlight_filter.png | Bin 113 -> 0 bytes .../testnodes_tga_type10_32bpp_bt.tga | Bin 179 -> 0 bytes .../testnodes_tga_type10_32bpp_tb.tga | Bin 179 -> 0 bytes .../textures/testnodes_tga_type1_24bpp_bt.tga | Bin 120 -> 0 bytes .../textures/testnodes_tga_type1_24bpp_tb.tga | Bin 120 -> 0 bytes .../textures/testnodes_tga_type2_16bpp_bt.tga | Bin 172 -> 0 bytes .../textures/testnodes_tga_type2_16bpp_tb.tga | Bin 172 -> 0 bytes .../textures/testnodes_tga_type2_32bpp_bt.tga | Bin 300 -> 0 bytes .../textures/testnodes_tga_type2_32bpp_tb.tga | Bin 300 -> 0 bytes .../textures/testnodes_tga_type3_16bpp_bt.tga | Bin 172 -> 0 bytes .../textures/testnodes_tga_type3_16bpp_tb.tga | Bin 172 -> 0 bytes .../textures/testnodes_torchlike_ceiling.png | Bin 157 -> 0 bytes .../textures/testnodes_torchlike_floor.png | Bin 141 -> 0 bytes .../textures/testnodes_torchlike_wall.png | Bin 158 -> 0 bytes games/devtest/mods/testpathfinder/README.md | 15 - games/devtest/mods/testpathfinder/init.lua | 136 --- games/devtest/mods/testpathfinder/mod.conf | 2 - .../testpathfinder_testpathfinder.png | Bin 159 -> 0 bytes .../textures/testpathfinder_waypoint.png | Bin 99 -> 0 bytes .../textures/testpathfinder_waypoint_end.png | Bin 147 -> 0 bytes .../testpathfinder_waypoint_start.png | Bin 139 -> 0 bytes games/devtest/mods/testtools/README.md | 128 --- games/devtest/mods/testtools/init.lua | 951 ------------------ games/devtest/mods/testtools/light.lua | 37 - games/devtest/mods/testtools/mod.conf | 2 - .../textures/testtools_children_getter.png | Bin 281 -> 0 bytes .../textures/testtools_entity_rotator.png | Bin 151 -> 0 bytes .../textures/testtools_entity_scaler.png | Bin 182 -> 0 bytes .../textures/testtools_entity_spawner.png | Bin 189 -> 0 bytes .../textures/testtools_falling_node_tool.png | Bin 140 -> 0 bytes .../textures/testtools_item_meta_editor.png | Bin 114 -> 0 bytes .../textures/testtools_lighttool.png | Bin 1659 -> 0 bytes .../textures/testtools_node_meta_editor.png | Bin 135 -> 0 bytes .../textures/testtools_node_setter.png | Bin 146 -> 0 bytes .../textures/testtools_object_attacher.png | Bin 173 -> 0 bytes .../textures/testtools_object_editor.png | Bin 180 -> 0 bytes .../textures/testtools_object_mover.png | Bin 175 -> 0 bytes .../textures/testtools_param2tool.png | Bin 127 -> 0 bytes .../testtools/textures/testtools_remover.png | Bin 129 -> 0 bytes games/devtest/mods/tiled/init.lua | 33 - games/devtest/mods/tiled/mod.conf | 3 - .../mods/tiled/textures/tiled_tiled.png | Bin 410 -> 0 bytes games/devtest/mods/unittests/async_env.lua | 168 ---- games/devtest/mods/unittests/crafting.lua | 112 --- .../mods/unittests/crafting_prepare.lua | 94 -- games/devtest/mods/unittests/entity.lua | 132 --- games/devtest/mods/unittests/init.lua | 202 ---- .../mods/unittests/inside_async_env.lua | 25 - .../mods/unittests/itemdescription.lua | 42 - games/devtest/mods/unittests/misc.lua | 82 -- games/devtest/mods/unittests/mod.conf | 3 - games/devtest/mods/unittests/player.lua | 70 -- .../mods/unittests/textures/default_dirt.png | Bin 790 -> 0 bytes .../textures/unittests_coal_lump.png | Bin 160 -> 0 bytes .../textures/unittests_description_test.png | Bin 268 -> 0 bytes .../textures/unittests_iron_lump.png | Bin 154 -> 0 bytes .../textures/unittests_repairable_tool.png | Bin 160 -> 0 bytes .../textures/unittests_steel_ingot.png | Bin 159 -> 0 bytes .../unittests/textures/unittests_stick.png | Bin 147 -> 0 bytes .../unittests/textures/unittests_torch.png | Bin 155 -> 0 bytes .../textures/unittests_unrepairable_tool.png | Bin 157 -> 0 bytes games/devtest/mods/util_commands/init.lua | 309 ------ games/devtest/mods/util_commands/mod.conf | 2 - games/devtest/screenshot.png | Bin 133364 -> 0 bytes games/devtest/settingtypes.txt | 32 - 422 files changed, 3 insertions(+), 7765 deletions(-) delete mode 100644 games/devtest/.luacheckrc delete mode 100644 games/devtest/LICENSE.txt delete mode 100644 games/devtest/README.md delete mode 100644 games/devtest/game.conf delete mode 100644 games/devtest/menu/background.png delete mode 100644 games/devtest/menu/header.png delete mode 100644 games/devtest/menu/icon.png delete mode 100644 games/devtest/mods/basenodes/init.lua delete mode 100644 games/devtest/mods/basenodes/mod.conf delete mode 100644 games/devtest/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png delete mode 100644 games/devtest/mods/basenodes/textures/basenodes_dirt_with_snow.png delete mode 100644 games/devtest/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png delete mode 100644 games/devtest/mods/basenodes/textures/basenodes_snow_sheet.png delete mode 100644 games/devtest/mods/basenodes/textures/default_apple.png delete mode 100644 games/devtest/mods/basenodes/textures/default_cobble.png delete mode 100644 games/devtest/mods/basenodes/textures/default_desert_sand.png delete mode 100644 games/devtest/mods/basenodes/textures/default_desert_stone.png delete mode 100644 games/devtest/mods/basenodes/textures/default_dirt.png delete mode 100644 games/devtest/mods/basenodes/textures/default_grass.png delete mode 100644 games/devtest/mods/basenodes/textures/default_gravel.png delete mode 100644 games/devtest/mods/basenodes/textures/default_ice.png delete mode 100644 games/devtest/mods/basenodes/textures/default_junglegrass.png delete mode 100644 games/devtest/mods/basenodes/textures/default_jungleleaves.png delete mode 100644 games/devtest/mods/basenodes/textures/default_jungletree.png delete mode 100644 games/devtest/mods/basenodes/textures/default_jungletree_top.png delete mode 100644 games/devtest/mods/basenodes/textures/default_lava.png delete mode 100644 games/devtest/mods/basenodes/textures/default_lava_flowing.png delete mode 100644 games/devtest/mods/basenodes/textures/default_leaves.png delete mode 100644 games/devtest/mods/basenodes/textures/default_mossycobble.png delete mode 100644 games/devtest/mods/basenodes/textures/default_pine_needles.png delete mode 100644 games/devtest/mods/basenodes/textures/default_pine_tree.png delete mode 100644 games/devtest/mods/basenodes/textures/default_pine_tree_top.png delete mode 100644 games/devtest/mods/basenodes/textures/default_river_water.png delete mode 100644 games/devtest/mods/basenodes/textures/default_river_water_flowing.png delete mode 100644 games/devtest/mods/basenodes/textures/default_sand.png delete mode 100644 games/devtest/mods/basenodes/textures/default_snow.png delete mode 100644 games/devtest/mods/basenodes/textures/default_snow_side.png delete mode 100644 games/devtest/mods/basenodes/textures/default_stone.png delete mode 100644 games/devtest/mods/basenodes/textures/default_tree.png delete mode 100644 games/devtest/mods/basenodes/textures/default_tree_top.png delete mode 100644 games/devtest/mods/basenodes/textures/default_water.png delete mode 100644 games/devtest/mods/basenodes/textures/default_water_flowing.png delete mode 100644 games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png delete mode 100644 games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png delete mode 100644 games/devtest/mods/basenodes/textures/info.txt delete mode 100644 games/devtest/mods/basetools/init.lua delete mode 100644 games/devtest/mods/basetools/mod.conf delete mode 100644 games/devtest/mods/basetools/textures/basetools_bloodsword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_elementalsword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_firesword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_healdagger.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_healsword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_icesword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_mesepick.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_mesesword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelaxe.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steeldagger.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelpick.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelpick_l1.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelpick_l2.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelshears.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelshovel.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_steelsword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_stoneaxe.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_stonepick.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_stoneshears.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_stoneshovel.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_stonesword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_superhealsword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_titaniumsword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_usespick.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_usessword.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_woodaxe.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_wooddagger.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_woodpick.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_woodshears.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_woodshovel.png delete mode 100644 games/devtest/mods/basetools/textures/basetools_woodsword.png delete mode 100644 games/devtest/mods/broken/init.lua delete mode 100644 games/devtest/mods/broken/mod.conf delete mode 100644 games/devtest/mods/bucket/init.lua delete mode 100644 games/devtest/mods/bucket/mod.conf delete mode 100644 games/devtest/mods/bucket/textures/bucket.png delete mode 100644 games/devtest/mods/bucket/textures/bucket_lava.png delete mode 100644 games/devtest/mods/bucket/textures/bucket_water.png delete mode 100644 games/devtest/mods/chest/init.lua delete mode 100644 games/devtest/mods/chest/mod.conf delete mode 100644 games/devtest/mods/chest/textures/chest_chest.png delete mode 100644 games/devtest/mods/chest_of_everything/init.lua delete mode 100644 games/devtest/mods/chest_of_everything/mod.conf delete mode 100644 games/devtest/mods/chest_of_everything/textures/chest_of_everything_chest.png delete mode 100644 games/devtest/mods/dignodes/init.lua delete mode 100644 games/devtest/mods/dignodes/mod.conf delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_choppy.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_cracky.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_crumbly.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_dig_immediate.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_none.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_rating1.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_rating2.png delete mode 100644 games/devtest/mods/dignodes/textures/dignodes_rating3.png delete mode 100644 games/devtest/mods/experimental/commands.lua delete mode 100644 games/devtest/mods/experimental/detached.lua delete mode 100644 games/devtest/mods/experimental/init.lua delete mode 100644 games/devtest/mods/experimental/items.lua delete mode 100644 games/devtest/mods/experimental/mod.conf delete mode 100644 games/devtest/mods/experimental/textures/experimental_callback_node.png delete mode 100644 games/devtest/mods/experimental/textures/experimental_particle_sheet.png delete mode 100644 games/devtest/mods/experimental/textures/experimental_particle_vertical.png delete mode 100644 games/devtest/mods/experimental/textures/experimental_tester_tool_1.png delete mode 100644 games/devtest/mods/give_initial_stuff/init.lua delete mode 100644 games/devtest/mods/give_initial_stuff/mod.conf delete mode 100644 games/devtest/mods/initial_message/init.lua delete mode 100644 games/devtest/mods/initial_message/mod.conf delete mode 100644 games/devtest/mods/mapgen/init.lua delete mode 100644 games/devtest/mods/mapgen/mod.conf delete mode 100644 games/devtest/mods/modchannels/init.lua delete mode 100644 games/devtest/mods/modchannels/mod.conf delete mode 100644 games/devtest/mods/soundstuff/init.lua delete mode 100644 games/devtest/mods/soundstuff/mod.conf delete mode 100644 games/devtest/mods/soundstuff/sounds/soundstuff_mono.ogg delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_eat.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_blank.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_climbable.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_dig.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_dug.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_fall.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_footstep.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_place.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_place_failed.png delete mode 100644 games/devtest/mods/soundstuff/textures/soundstuff_node_sound.png delete mode 100644 games/devtest/mods/stairs/init.lua delete mode 100644 games/devtest/mods/stairs/mod.conf delete mode 100644 games/devtest/mods/testentities/armor.lua delete mode 100644 games/devtest/mods/testentities/callbacks.lua delete mode 100644 games/devtest/mods/testentities/init.lua delete mode 100644 games/devtest/mods/testentities/mod.conf delete mode 100644 games/devtest/mods/testentities/textures/testentities_armorball.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_callback.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_callback_step.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_cube1.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_cube2.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_cube3.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_cube4.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_cube5.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_cube6.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_dungeon_master.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_sprite.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_upright_sprite1.png delete mode 100644 games/devtest/mods/testentities/textures/testentities_upright_sprite2.png delete mode 100644 games/devtest/mods/testentities/visuals.lua delete mode 100644 games/devtest/mods/testfood/init.lua delete mode 100644 games/devtest/mods/testfood/mod.conf delete mode 100644 games/devtest/mods/testfood/textures/testfood_bad.png delete mode 100644 games/devtest/mods/testfood/textures/testfood_bad2.png delete mode 100644 games/devtest/mods/testfood/textures/testfood_good.png delete mode 100644 games/devtest/mods/testfood/textures/testfood_good2.png delete mode 100644 games/devtest/mods/testfood/textures/testfood_replace.png delete mode 100644 games/devtest/mods/testformspec/LICENSE.txt delete mode 100644 games/devtest/mods/testformspec/callbacks.lua delete mode 100644 games/devtest/mods/testformspec/dummy_items.lua delete mode 100644 games/devtest/mods/testformspec/formspec.lua delete mode 100644 games/devtest/mods/testformspec/init.lua delete mode 100644 games/devtest/mods/testformspec/mod.conf delete mode 100644 games/devtest/mods/testformspec/models/testformspec_character.b3d delete mode 100644 games/devtest/mods/testformspec/models/testformspec_chest.obj delete mode 100644 games/devtest/mods/testformspec/textures/default_chest_front.png delete mode 100644 games/devtest/mods/testformspec/textures/default_chest_inside.png delete mode 100644 games/devtest/mods/testformspec/textures/default_chest_side.png delete mode 100644 games/devtest/mods/testformspec/textures/default_chest_top.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_9slice.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_animation.jpg delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_animation.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_9slice.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_9slice_hovered.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_9slice_pressed.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_hovered.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_bg_pressed.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_button_image.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_character.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_hovered.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_item.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_node.png delete mode 100644 games/devtest/mods/testformspec/textures/testformspec_pressed.png delete mode 100644 games/devtest/mods/testhud/init.lua delete mode 100644 games/devtest/mods/testhud/mod.conf delete mode 100644 games/devtest/mods/testitems/init.lua delete mode 100644 games/devtest/mods/testitems/mod.conf delete mode 100644 games/devtest/mods/testitems/textures/testitems_overlay_base.png delete mode 100644 games/devtest/mods/testitems/textures/testitems_overlay_overlay.png delete mode 100644 games/devtest/mods/testnodes/README.md delete mode 100644 games/devtest/mods/testnodes/drawtypes.lua delete mode 100644 games/devtest/mods/testnodes/init.lua delete mode 100644 games/devtest/mods/testnodes/light.lua delete mode 100644 games/devtest/mods/testnodes/liquids.lua delete mode 100644 games/devtest/mods/testnodes/meshes.lua delete mode 100644 games/devtest/mods/testnodes/mod.conf delete mode 100644 games/devtest/mods/testnodes/models/testnodes_ocorner.obj delete mode 100644 games/devtest/mods/testnodes/models/testnodes_pyramid.obj delete mode 100644 games/devtest/mods/testnodes/nodeboxes.lua delete mode 100644 games/devtest/mods/testnodes/overlays.lua delete mode 100644 games/devtest/mods/testnodes/param2.lua delete mode 100644 games/devtest/mods/testnodes/properties.lua delete mode 100644 games/devtest/mods/testnodes/textures.lua delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_1.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_1g.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_1w.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_1wg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_2g.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_2w.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_2wg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_3.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_3g.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_3w.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_3wg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_4.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_4g.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_4w.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_4wg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_5.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_5g.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_5w.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_5wg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_6.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_6g.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_6w.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_6wg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_airlike.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_allfaces.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_allfaces_optional.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_alpha.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_alpha128.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_alpha191.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_alpha64.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_anim.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_attached_bottom.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_attached_side.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_attached_top.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_attachedw_bottom.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_attachedw_side.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_attachedw_top.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_bouncy.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_buildable_to.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_climbable_nojump_side.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_climbable_side.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_damage.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_damage_neg.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_drowning.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_fall_damage_minus.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_fall_damage_plus.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_fencelike.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_firelike.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_glasslike.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_glasslike_detail.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_glasslike_framed.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_glasslike_framed2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_glasslike_framed_optional.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_glasslikeliquid.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_1.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_10.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_11.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_12.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_13.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_14.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_3.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_4.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_5.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_6.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_7.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_8.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_light_9.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_line_crossing.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_line_curved.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_line_straight.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_line_t_junction.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquid.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r0.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r1.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r3.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r4.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r5.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r6.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r7.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r8.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r0.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r1.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r3.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r4.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r5.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r6.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r7.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_liquidsource_r8.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_mesh_stripes.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_mesh_stripes2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_mesh_stripes3.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_mesh_stripes4.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_move_resistance.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_node.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_node_falling.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_nodebox.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_nojump_side.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_nojump_top.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal1.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal2.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal3.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal4.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal5.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_normal6.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_overlay.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_overlayable.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_palette_facedir.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_palette_full.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_palette_wallmounted.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_degrotate.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_leveled.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_meshoptions.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_leveled.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_meshoptions.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_plantlike_waving.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail2_crossing.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail2_curved.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail2_straight.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail2_t_junction.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail_crossing.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail_curved.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail_straight.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_rail_t_junction.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_signlike.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_slippery.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_street_crossing.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_street_curved.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_street_straight.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_street_t_junction.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_sunlight_filter.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_torchlike_ceiling.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_torchlike_floor.png delete mode 100644 games/devtest/mods/testnodes/textures/testnodes_torchlike_wall.png delete mode 100644 games/devtest/mods/testpathfinder/README.md delete mode 100644 games/devtest/mods/testpathfinder/init.lua delete mode 100644 games/devtest/mods/testpathfinder/mod.conf delete mode 100644 games/devtest/mods/testpathfinder/textures/testpathfinder_testpathfinder.png delete mode 100644 games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint.png delete mode 100644 games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint_end.png delete mode 100644 games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint_start.png delete mode 100644 games/devtest/mods/testtools/README.md delete mode 100644 games/devtest/mods/testtools/init.lua delete mode 100644 games/devtest/mods/testtools/light.lua delete mode 100644 games/devtest/mods/testtools/mod.conf delete mode 100644 games/devtest/mods/testtools/textures/testtools_children_getter.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_entity_rotator.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_entity_scaler.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_entity_spawner.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_falling_node_tool.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_item_meta_editor.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_lighttool.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_node_meta_editor.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_node_setter.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_object_attacher.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_object_editor.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_object_mover.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_param2tool.png delete mode 100644 games/devtest/mods/testtools/textures/testtools_remover.png delete mode 100644 games/devtest/mods/tiled/init.lua delete mode 100644 games/devtest/mods/tiled/mod.conf delete mode 100644 games/devtest/mods/tiled/textures/tiled_tiled.png delete mode 100644 games/devtest/mods/unittests/async_env.lua delete mode 100644 games/devtest/mods/unittests/crafting.lua delete mode 100644 games/devtest/mods/unittests/crafting_prepare.lua delete mode 100644 games/devtest/mods/unittests/entity.lua delete mode 100644 games/devtest/mods/unittests/init.lua delete mode 100644 games/devtest/mods/unittests/inside_async_env.lua delete mode 100644 games/devtest/mods/unittests/itemdescription.lua delete mode 100644 games/devtest/mods/unittests/misc.lua delete mode 100644 games/devtest/mods/unittests/mod.conf delete mode 100644 games/devtest/mods/unittests/player.lua delete mode 100644 games/devtest/mods/unittests/textures/default_dirt.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_coal_lump.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_description_test.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_iron_lump.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_repairable_tool.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_steel_ingot.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_stick.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_torch.png delete mode 100644 games/devtest/mods/unittests/textures/unittests_unrepairable_tool.png delete mode 100644 games/devtest/mods/util_commands/init.lua delete mode 100644 games/devtest/mods/util_commands/mod.conf delete mode 100644 games/devtest/screenshot.png delete mode 100644 games/devtest/settingtypes.txt diff --git a/android/app/build.gradle b/android/app/build.gradle index ce895ed..a5af874 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -4,7 +4,7 @@ android { buildToolsVersion '30.0.3' ndkVersion "$ndk_version" defaultConfig { - applicationId 'net.minetest.minetest' + applicationId 'xyz.cubesoftware.sussycraft' minSdkVersion 16 targetSdkVersion 30 versionName "${versionMajor}.${versionMinor}.${versionPatch}" @@ -53,7 +53,7 @@ android { task prepareAssets() { def assetsFolder = "build/assets" def projRoot = "../.." - def gameToCopy = "minetest_game" + def gameToCopy = "SussyCraft" copy { from "${projRoot}/minetest.conf.example", "${projRoot}/README.md" into assetsFolder diff --git a/android/settings.gradle b/android/settings.gradle index b048fca..11e6f51 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name = "Minetest" +rootProject.name = "SussyCraft" include ':app', ':native' diff --git a/games/devtest/.luacheckrc b/games/devtest/.luacheckrc deleted file mode 100644 index 1c7d399..0000000 --- a/games/devtest/.luacheckrc +++ /dev/null @@ -1,43 +0,0 @@ -unused_args = false -allow_defined_top = true -max_string_line_length = false -max_line_length = false - -ignore = { - "131", -- Unused global variable - "211", -- Unused local variable - "231", -- Local variable never accessed - "311", -- Value assigned to a local variable is unused - "412", -- Redefining an argument - "421", -- Shadowing a local variable - "431", -- Shadowing an upvalue - "432", -- Shadowing an upvalue argument - "611", -- Line contains only whitespace -} - -read_globals = { - "ItemStack", - "INIT", - "DIR_DELIM", - "dump", "dump2", - "fgettext", "fgettext_ne", - "vector", - "VoxelArea", - "profiler", - "Settings", - "check", - "PseudoRandom", - - string = {fields = {"split", "trim"}}, - table = {fields = {"copy", "getn", "indexof", "insert_all"}}, - math = {fields = {"hypot", "round"}}, -} - -globals = { - "aborted", - "minetest", - "core", - os = { fields = { "tempfolder" } }, - "_", -} - diff --git a/games/devtest/LICENSE.txt b/games/devtest/LICENSE.txt deleted file mode 100644 index 71bd0e5..0000000 --- a/games/devtest/LICENSE.txt +++ /dev/null @@ -1,4 +0,0 @@ -License information for Development Test ----------------------------------------- - -The same license as for Minetest applies. diff --git a/games/devtest/README.md b/games/devtest/README.md deleted file mode 100644 index 77e722a..0000000 --- a/games/devtest/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Development Test (devtest) - -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 - -Confused by a certain node or item? Check out for inline code comments. The usages of most tools are explained in their tooltips. - -### 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/devtest/game.conf b/games/devtest/game.conf deleted file mode 100644 index 0f5656c..0000000 --- a/games/devtest/game.conf +++ /dev/null @@ -1,2 +0,0 @@ -title = 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/devtest/menu/background.png b/games/devtest/menu/background.png deleted file mode 100644 index 89c45fcd5861990de8602899b4e8112c46fca762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^A3&Iq8A!6suD%GQ*aCb)ToW1sER$qU@NaShif|Tq zL>4nJ@ErkR#;MwT(m+86PZ!6Kh}O5~4Fwq(IF1;|Jh-naRPaHXd-}S$L9(ka+itvl e7B~2NZ|~0KOo#6=$X^DU#o+1c=d#Wzp$P!y4Lv~s diff --git a/games/devtest/menu/header.png b/games/devtest/menu/header.png deleted file mode 100644 index c80ed71f18e0b647a5c686d80428e89a7c3c6a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^`+!)2gAGW!7`o>HDYhhUcNZWH1V5d3*8?fe0*}aI z1_r((Aj~*bn@<`j$X?><>&pI^M@EoW@B8wade@HA$$wVOP%WZ*>el$0n;XaLG3uVqfrqQKP2eVx_0` zl%Q+%x3kyI*H-`0{r^>A-zK>r+mx%Vrusen68ArI9$Qho(f<76dG$c9{i5fuOx?0~ zm;GB|@%{0VAKxA?soDB5;_RH%tk*v;J$rtZ`!Vw|`^WEotys>r_w)C-%q{P?`{?hz zc5Lz8`06=tsx};ZF5CW*@$vkNmwS!&Z!6#D9T#c4Z(F&2)n7xqgg-pSRn_;_JUR%?SJ~Pg`K07X7Uoti2{jRTa>c6;>&z_#WALP*BO&{h* s-xlq^uX2~UhyTkDf$P!C$JjldbJsn#@$t-DYXJ&ePgg&ebxsLQ06s*nb^rhX diff --git a/games/devtest/menu/icon.png b/games/devtest/menu/icon.png deleted file mode 100644 index f854b9c319242b2f5a3d5cb8d4c89a6ffe448859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDD3?#L31Vw-pPk>K|E0AtzXs}F@{r~^}tJ}>l zfqcf2AirP+hi5m^fShVi7srqa#-s&C9IcH4Y;4Cu4K_?_Y|Isvu`uvZv=C<4d$E!A zfCCTfg}>pRI~e~>d^b6-VCmW=+^4^GeCGeF|p{bAQt1#DMXL0o#ch~QnpIvFVdQ&MBb@0M^@1`Tzg` diff --git a/games/devtest/mods/basenodes/init.lua b/games/devtest/mods/basenodes/init.lua deleted file mode 100644 index 2c808c3..0000000 --- a/games/devtest/mods/basenodes/init.lua +++ /dev/null @@ -1,351 +0,0 @@ -local WATER_ALPHA = "^[opacity:" .. 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".."\n".. - "Drowning damage: 1", - drawtype = "liquid", - waving = 3, - tiles = {"default_water.png"..WATER_ALPHA}, - special_tiles = { - {name = "default_water.png"..WATER_ALPHA, backface_culling = false}, - {name = "default_water.png"..WATER_ALPHA, backface_culling = true}, - }, - use_texture_alpha = "blend", - 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".."\n".. - "Drowning damage: 1", - drawtype = "flowingliquid", - waving = 3, - tiles = {"default_water_flowing.png"}, - special_tiles = { - {name = "default_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - {name = "default_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - }, - use_texture_alpha = "blend", - 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".."\n".. - "Drowning damage: 1", - drawtype = "liquid", - waving = 3, - tiles = { "default_river_water.png"..WATER_ALPHA }, - special_tiles = { - {name = "default_river_water.png"..WATER_ALPHA, backface_culling = false}, - {name = "default_river_water.png"..WATER_ALPHA, backface_culling = true}, - }, - use_texture_alpha = "blend", - 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".."\n".. - "Drowning damage: 1", - drawtype = "flowingliquid", - waving = 3, - tiles = {"default_river_water_flowing.png"..WATER_ALPHA}, - special_tiles = { - {name = "default_river_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - {name = "default_river_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - }, - use_texture_alpha = "blend", - 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".."\n".. - "4 damage per second".."\n".. - "Drowning damage: 1", - 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".."\n".. - "4 damage per second".."\n".. - "Drowning damage: 1", - 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".."\n".. - "Food (+2)", - 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/devtest/mods/basenodes/mod.conf b/games/devtest/mods/basenodes/mod.conf deleted file mode 100644 index 25024dc..0000000 --- a/games/devtest/mods/basenodes/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = basenodes -description = Contains basic nodes for mapgen diff --git a/games/devtest/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png b/games/devtest/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png deleted file mode 100644 index 5e8fc41a951f6d48cb260110ef67048a5232361c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png b/games/devtest/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png deleted file mode 100644 index 447c94e9860cd8d7a8510ecf768141c4da33f952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/basenodes_snow_sheet.png b/games/devtest/mods/basenodes/textures/basenodes_snow_sheet.png deleted file mode 100644 index 455332093d1a834e621b648ac62cdf69976c17f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/games/devtest/mods/basenodes/textures/default_desert_stone.png b/games/devtest/mods/basenodes/textures/default_desert_stone.png deleted file mode 100644 index 5126fb61ce84f5c023753a39ed47107c1e69e233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 584 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 diff --git a/games/devtest/mods/basenodes/textures/default_gravel.png b/games/devtest/mods/basenodes/textures/default_gravel.png deleted file mode 100644 index 7e5ff616f05a9002e8e084ef353ea29f47651c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-t{#qNx|%ATwFP1R9jmX`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 diff --git a/games/devtest/mods/basenodes/textures/default_junglegrass.png b/games/devtest/mods/basenodes/textures/default_junglegrass.png deleted file mode 100644 index d64e33abce8cb5324f338f95d39842c1b6f5616d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/default_jungletree_top.png b/games/devtest/mods/basenodes/textures/default_jungletree_top.png deleted file mode 100644 index e80de8a69ff4537e1d01388ca82186cc1a4b760b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/default_lava.png b/games/devtest/mods/basenodes/textures/default_lava.png deleted file mode 100644 index a4cf649f142ae0e8d7519390a0950ee2bd131b23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uBE)Z6J!|v8#DYr!_Zr~ zWED_6+SA1`ghQ4wfMNZA20Q%+4h(y^pM)`7SpSrb;nDt=Q4ELv{)l6E{Qp-JL&E-l zK@1Nze|BS7p#RU2VZr);t_%$ue?~Ge?SERy!1RCV1P1O^jV%n?dm2I*_Wggzz}Kz% UPGG5|70?<6Pgg&ebxsLQ0Fos<3;+NC diff --git a/games/devtest/mods/basenodes/textures/default_lava_flowing.png b/games/devtest/mods/basenodes/textures/default_lava_flowing.png deleted file mode 100644 index 07066a6e3911b347a77d3ecd74d93b3221f1fc96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/default_leaves.png b/games/devtest/mods/basenodes/textures/default_leaves.png deleted file mode 100644 index c0475d4d247346bbf4a20522b143cd281828cef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/default_mossycobble.png b/games/devtest/mods/basenodes/textures/default_mossycobble.png deleted file mode 100644 index 69585e37b7d32e78afde08bac7ad714bf9eaeb1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/default_snow_side.png b/games/devtest/mods/basenodes/textures/default_snow_side.png deleted file mode 100644 index f34d10991fcb11806073b212d444804e45052b9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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=) diff --git a/games/devtest/mods/basenodes/textures/default_stone.png b/games/devtest/mods/basenodes/textures/default_stone.png deleted file mode 100644 index 763b4396a9a4a38f079cfc8748791ae4d6955a3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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_ diff --git a/games/devtest/mods/basenodes/textures/default_tree_top.png b/games/devtest/mods/basenodes/textures/default_tree_top.png deleted file mode 100644 index d1a4fa7042a17a55d7d3cdab9e3e078d66f4246b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basenodes/textures/default_water.png b/games/devtest/mods/basenodes/textures/default_water.png deleted file mode 100644 index 3e385ae8bd7c49eaf366af8e23a33eba5f7f990e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!cYsfbtGZK`1_)(qI_GG*=4iR) zYP;rZyX9%S15v(?2M`tLdKMb`ml+0D7zb4v2UnT|SDA!VnFd#zhE|(})|iFY*u*s3 z#+5XH1 zldoK_u6TOC#ogDynAte^Sf;uD_Z_`^vuFLhJJn+SdPzxk1(23fT|PoE)6y2%WQwDI4Wlq@lI(IdTYw_a|??LL-&LC>}C7o+JL4o Nc)I$ztaD0e0ss%}Admn6 diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png deleted file mode 100644 index 29fde6b26a7689e0091c92f49355ab7072b7c056..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmV-D1H$}?P)+ajpshR{=5W`0H1vO`a^tn z^HmA((KjzhfEz!)^)S)UHv!<<2ft&20N}#aXNn>Qfc>9duElEayO*wC{B{5P7vm}i zfG>V{Q@MEUoa>pc5p+$F7hLwxwD9=GnM}r65ueH&GYKIICc4=-gI+FmhfF5ibEvhZ5uK&W ziu3!yrfPY*M4Zlm$EDS*d+vqq7kWB$?XncF2BUlR@p5efxZ6R$t%2REYRDb^U zFU#9IcaMWjb$u(que|XX6D`pjj8)sFUP!4%_!3&#=wKU$2@S7$u}D^kVnP+X^OS%5 zAjcZEJ-tZk<+N-Y>DVq(tNX_@F2w0Gep%Mh&~^+rNwfa}tdL}?X}J{Q00000NkvXX Hu0mjfO)-U1 diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png deleted file mode 100644 index 04770b6f659cab9fb6e146a093c9d2447bbfa274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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&U5QxP^Jj{x3_1~WpHo0=l77L+d8=`y98+tt+Z!O|s5bQBn_ zI5%ZwXJ+n@W9n;M;l{}jbHFid+kqPrE7*Ny=CdgzEf8d2=v}S6Anf$YeIVOBUHx3v IIVCg!0QUPb*#H0l diff --git a/games/devtest/mods/basetools/textures/basetools_elementalsword.png b/games/devtest/mods/basetools/textures/basetools_elementalsword.png deleted file mode 100644 index d007217ee2bde93134c257926f4dfc6c7651a673..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X5|9E{-7; zjL8c)f2?P7vS*qvw076>Pxa@1zr6f^@`9?vZT}s3nG(N08cICnZ=ULt+t`Ut@ z0;@QinCyAgRnOhs?HMSWy_)H|^8rJFs{(ofrgFRsTt2OSVj93d%fgO#L5r(0(BkN# Uk8HaZSA%T!boFyt=akR{0NLL<9smFU diff --git a/games/devtest/mods/basetools/textures/basetools_firesword.png b/games/devtest/mods/basetools/textures/basetools_firesword.png deleted file mode 100644 index eca999ba16bc16eff8fed9471c0cf2d431c861b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X9tSE{-7; zjL8c)f2?P7JhJ-T%0Kg8ai&aIAhjlO!)mt{=ESQUyu6l6cDe+&h^}B?H_Jfd!{vgY zM=Y-t9ZT1&`knGY$X% diff --git a/games/devtest/mods/basetools/textures/basetools_healdagger.png b/games/devtest/mods/basetools/textures/basetools_healdagger.png deleted file mode 100644 index 3e6eb9cd098a5acabe10bacb65ddf84521d735d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1XAIiE{-7; zjL8bpJxn`=BsrAUa2%TPHK*;rsQe+RD0#EPq0Xic*k>uNaj@mM%Hr5KziqORdH_G? zs^r|z2UQ#vY>T8+844Kr`TKY6vRWXQFVdQ&MBb@ E01mS(!vFvP diff --git a/games/devtest/mods/basetools/textures/basetools_healsword.png b/games/devtest/mods/basetools/textures/basetools_healsword.png deleted file mode 100644 index f93fddfb26c6815faf9a3a5c2aab13dbd25ef1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1XA&yE{-7; zjL8c)CumP>R7eUvUuAaqe;5A*$EK`~wu9@W#Q0i5l})zT<*1!iou#zK!ItAHi(}*b zw#h>30sNe+l5;~JRB>3aEs|1YC}8C0@87k{YJptR%hbR(q;`N0_&w#C2m;V*2Q{m1Hr?y@DU_}5cVm6N zt;qf6dVh`I7c*ubxMkA0)pAj;RDSbz$6E!==LOx_x2=1n46?-2)z4*}Q$iB}FRV2i diff --git a/games/devtest/mods/basetools/textures/basetools_mesesword.png b/games/devtest/mods/basetools/textures/basetools_mesesword.png deleted file mode 100644 index bc82769bc16a2009edc430ecd30143fee41f87cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X2;6E{-7; zjL8c)U%YQuSQPsI|M?BM(i0q;vO3xhu8|THIkKv4wem&PSxRe8tm15DvgcJ-^;;k( z6mtC5ssmpHig;X1ix?iT$jQl-mXoH5Ka&ylTS4 X@IBwOF+60_8<1I^u6{1-oD!M(LF2>af}lq&H<+IY xnaQoNx)#=|Ve9a6*Dk9CavalNC@d0WV0d~^bDqqt={G=Dc)I$ztaD0e0syW5FT?-< diff --git a/games/devtest/mods/basetools/textures/basetools_steelpick.png b/games/devtest/mods/basetools/textures/basetools_steelpick.png deleted file mode 100644 index bc02aac3e45d02f0335309aecbebadbc068d1f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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- diff --git a/games/devtest/mods/basetools/textures/basetools_steelpick_l2.png b/games/devtest/mods/basetools/textures/basetools_steelpick_l2.png deleted file mode 100644 index 011df458460115f5b804abbfdb5c3fdb37c16604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basetools/textures/basetools_steelshears.png b/games/devtest/mods/basetools/textures/basetools_steelshears.png deleted file mode 100644 index 04c86c3706021dc7b3ed35b19aead2c14823af3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv5AX?bWsqg`@bEZ%=Jp=fS?83{1OTuSC13ym diff --git a/games/devtest/mods/basetools/textures/basetools_steelsword.png b/games/devtest/mods/basetools/textures/basetools_steelsword.png deleted file mode 100644 index 9909365c32b5646276532b73a63be841f650e478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basetools/textures/basetools_stoneaxe.png b/games/devtest/mods/basetools/textures/basetools_stoneaxe.png deleted file mode 100644 index a374c547d7570d417f66b234b1b14811f9c9eb32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basetools/textures/basetools_stonepick.png b/games/devtest/mods/basetools/textures/basetools_stonepick.png deleted file mode 100644 index d9156ee3a230e0d4a462fe73dbe4b4b50e9f3b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0A_l;*7Ob$<583G-=X` zk2k&mg&0eM{DK)Ap4~_Ta;!XE978H@<(_fmV^H8=c3k@B|Jks|snS)q6%%>0^*uJJ yW-54vdgOY(_%2=Bnwtg8<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 diff --git a/games/devtest/mods/basetools/textures/basetools_stoneshovel.png b/games/devtest/mods/basetools/textures/basetools_stoneshovel.png deleted file mode 100644 index 3c1bb48cb58e1a8f3f75ac8aa05ad0a6d7377d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/basetools/textures/basetools_stonesword.png b/games/devtest/mods/basetools/textures/basetools_stonesword.png deleted file mode 100644 index 6f3e94cda2f7dc43247258e43ebb8e0558701343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X3ZME{-7; zjL8c)KQu5VgSv%OOR=TmUa;{2z=n!G*dH4kxJaSi}-8|Sx87E%x3=UkPX8~Wk3qXpX{sS|BK*yoqq+St5$^{Sz&A!m!i kv4xC08&(}y*FVdQ&MBb@0Ik49DgXcg diff --git a/games/devtest/mods/basetools/textures/basetools_titaniumsword.png b/games/devtest/mods/basetools/textures/basetools_titaniumsword.png deleted file mode 100644 index 55e22c7d5d08c6c1a1d365c01eda7863456566ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X7`%E{-7; zjL8c)1)3O>LZu}nR;*aTAgQvVEkokXs>Fv55vESf>(=RI>IEh~WPIhgLXAUc>Q)^~ zhi?-WSOv%}Y;Q8^DUt~L%%tqMEMyAfsx+XT44$rj JF6*2UngFbsIynFU diff --git a/games/devtest/mods/basetools/textures/basetools_usessword.png b/games/devtest/mods/basetools/textures/basetools_usessword.png deleted file mode 100644 index 0eaf4cf380442e716dff8d4ef17805df912a2235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar*|t3#>1QB>v?;oRX>c z;qs67OO9}wHN>1PV0JTo+#$EgL^*rW^38^fKE@N&;)~a;@k%SPtIas&~43p@G@z}N1(Y3p00i_>zopr0I(e|*Z=?k diff --git a/games/devtest/mods/basetools/textures/basetools_woodaxe.png b/games/devtest/mods/basetools/textures/basetools_woodaxe.png deleted file mode 100644 index 4015e910f8ee3e85cef8923ba061887f7c3cb4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X6mQE{-7; zjL8xf0S}ft&UzIQEvn$zlx3mh#UEqJ`E5dS=VT%E%vBpbdR8qHWMGK1ld#t0E_@F% N!PC{xWt~$(69Dfd9u5Ei diff --git a/games/devtest/mods/basetools/textures/basetools_wooddagger.png b/games/devtest/mods/basetools/textures/basetools_wooddagger.png deleted file mode 100644 index 6e5ab0fd6fe684ec4821cc24631a2a5c3b3d4f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X2#3E{-7; zjL8dxC0J)Etr2jE5Nrv2u>9eYBc1-tF|skHAt-o5tYDj@vZ8NmsG=8tfYc(X gbE*p%Uu8%!GAvsvIJwEim=$EEr>mdKI;Vst0D%W2{r~^~ diff --git a/games/devtest/mods/basetools/textures/basetools_woodpick.png b/games/devtest/mods/basetools/textures/basetools_woodpick.png deleted file mode 100644 index 15c61f408a469d78566a0abd666ff8d9c2f5ea54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJPk>K|E0A_l;*7ObDe%)!;ykz$ z$Y(4G@(X5gcy=QV$T9bHaSW-rm3!hKCxZhIlcVY1?=_V&O_ORll>5@0kN$R6^PTy# sW5Ffs$!wzcLfDS~Tgh|lT-jT8tEUX{oiANWfkrTRy85}Sb4q9e00WXNGynhq diff --git a/games/devtest/mods/basetools/textures/basetools_woodshears.png b/games/devtest/mods/basetools/textures/basetools_woodshears.png deleted file mode 100644 index 4ff92fd7cb24dd214e08b6a6dd34d9e85bc5be8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWox&y^WFeX7Ba`PXnddE$ z=PhNaB9QAPk?$jy>m{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 diff --git a/games/devtest/mods/basetools/textures/basetools_woodshovel.png b/games/devtest/mods/basetools/textures/basetools_woodshovel.png deleted file mode 100644 index 6cc52f8a1607e0ed86566e19301d168eb0dada77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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- diff --git a/games/devtest/mods/broken/init.lua b/games/devtest/mods/broken/init.lua deleted file mode 100644 index 04993ca..0000000 --- a/games/devtest/mods/broken/init.lua +++ /dev/null @@ -1,11 +0,0 @@ --- Register stuff with empty definitions to test if Minetest fallback options --- for these things work properly. - --- The itemstrings are deliberately kept descriptive to keep them easy to --- recognize. - -minetest.register_node("broken:node_with_empty_definition", {}) -minetest.register_tool("broken:tool_with_empty_definition", {}) -minetest.register_craftitem("broken:craftitem_with_empty_definition", {}) - -minetest.register_entity("broken:entity_with_empty_definition", {}) diff --git a/games/devtest/mods/broken/mod.conf b/games/devtest/mods/broken/mod.conf deleted file mode 100644 index a24378a..0000000 --- a/games/devtest/mods/broken/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = broken -description = Register items and an entity with empty definitions to test fallback diff --git a/games/devtest/mods/bucket/init.lua b/games/devtest/mods/bucket/init.lua deleted file mode 100644 index ff58b06..0000000 --- a/games/devtest/mods/bucket/init.lua +++ /dev/null @@ -1,27 +0,0 @@ --- Bucket: Punch liquid source or flowing liquid to collect it - -minetest.register_tool("bucket:bucket", { - description = "Bucket".."\n".. - "Picks up liquid nodes", - 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 - 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"}) - local inv = user:get_inventory() - if inv then - inv:add_item("main", ItemStack(n.name)) - end - end - end, -}) - diff --git a/games/devtest/mods/bucket/mod.conf b/games/devtest/mods/bucket/mod.conf deleted file mode 100644 index d14deb4..0000000 --- a/games/devtest/mods/bucket/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = bucket -description = Minimal bucket to pick up liquids diff --git a/games/devtest/mods/bucket/textures/bucket.png b/games/devtest/mods/bucket/textures/bucket.png deleted file mode 100644 index 6779528753716365ba2d722b3587280e82d3a0e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S)MMAAr*{gCtc)ZP~>sWHw`af zRxfDRyJWj7rvHz}gDGGB@$5Noqx@y3S>>{bImJd%hmPL+EhcvI=Gv|NS+2W&Cw;Fs zK5f`0=E8D1fF-Cw$8qnP@IS&0m;ZdyU2q~K{<)}z!LP5EG~;KAPnv(Zt|oBl44|zH Mp00i_>zopr0FmuKo&W#< diff --git a/games/devtest/mods/bucket/textures/bucket_lava.png b/games/devtest/mods/bucket/textures/bucket_lava.png deleted file mode 100644 index dfcae65fb382d723c64abc12cd84930157d0812d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar*{C5?dbF>-lUs_W!L@ zL)ys$ObHroP0^+E*GzKVq5c{s#?;RL!vR1rj5MorGtvlg5WA6%{*U=6k+b)-KvmEu0pZjUzdq!^E8#PJt Sp(a4989ZJ6T-G@yGywqh>OU6% diff --git a/games/devtest/mods/bucket/textures/bucket_water.png b/games/devtest/mods/bucket/textures/bucket_water.png deleted file mode 100644 index e164b0a50fe3a0f9ce5b022636f3445f34254a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar*{C5?dbF>-lUs_GHgq z4T(s;^=Z7T_co-RJiwHo!M12~+EkrMwwq#JFP!tMiao=E>HX6Q{T(N+ntg~gFn*$u z^#0xIReKW3=g(DO*v9lsm%%9^;WCqj*b0|Kq5n(^)b_5^Wia_y_2tz5Invepu2qK~ SGF1m!&EVE@}T*#e}aWM1P15pKz4&&yN42x#4 zIw`X_`7BK1kaXJ8GGoz9L5(go0VyDE(-Y{^Q;_ml{egjDyNWdTOR2DKpot8gu6{1- HoD!M<-`X*p diff --git a/games/devtest/mods/chest_of_everything/init.lua b/games/devtest/mods/chest_of_everything/init.lua deleted file mode 100644 index 3e9d267..0000000 --- a/games/devtest/mods/chest_of_everything/init.lua +++ /dev/null @@ -1,136 +0,0 @@ -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" .. "\n" .. - "Grants access to all items", - 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/devtest/mods/chest_of_everything/mod.conf b/games/devtest/mods/chest_of_everything/mod.conf deleted file mode 100644 index 4a4425e..0000000 --- a/games/devtest/mods/chest_of_everything/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = chest_of_everything -description = Adds the chest of everything from which you can take all items diff --git a/games/devtest/mods/chest_of_everything/textures/chest_of_everything_chest.png b/games/devtest/mods/chest_of_everything/textures/chest_of_everything_chest.png deleted file mode 100644 index 6b2fd58d51c9f6be98ad202ed0c1749d58703e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)*5pGTvBaR88atuw60 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/devtest/mods/dignodes/mod.conf b/games/devtest/mods/dignodes/mod.conf deleted file mode 100644 index 52a80d6..0000000 --- a/games/devtest/mods/dignodes/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = dignodes -description = Nodes with different digging groups diff --git a/games/devtest/mods/dignodes/textures/dignodes_choppy.png b/games/devtest/mods/dignodes/textures/dignodes_choppy.png deleted file mode 100644 index a73fc2424140e0f429b274ac72f7f20dfa0e2679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/games/devtest/mods/dignodes/textures/dignodes_crumbly.png b/games/devtest/mods/dignodes/textures/dignodes_crumbly.png deleted file mode 100644 index 23f2f7c71997d29bdc50006a6161e2ad72770b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/dignodes/textures/dignodes_dig_immediate.png b/games/devtest/mods/dignodes/textures/dignodes_dig_immediate.png deleted file mode 100644 index a532ad90b20e7b7eb69c87721229852c5d5c3c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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| diff --git a/games/devtest/mods/dignodes/textures/dignodes_rating1.png b/games/devtest/mods/dignodes/textures/dignodes_rating1.png deleted file mode 100644 index d2fee3a23269731a2c9e56a86e04df3c1b386e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/dignodes/textures/dignodes_rating2.png b/games/devtest/mods/dignodes/textures/dignodes_rating2.png deleted file mode 100644 index 15329b93fa9b94075774044d3ec7af828362d072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 - local aborted = false - 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" or def.drawtype == "mesh") then - p2_max = 239 - elseif def.paramtype2 == "colorfacedir" or - def.paramtype2 == "colorwallmounted" or - def.paramtype2 == "colordegrotate" 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" or def.paramtype2 == "colordegrotate") - 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, -}) - -core.register_on_chatcommand(function(name, command, params) - minetest.log("action", "caught command '"..command.."', issued by '"..name.."'. Parameters: '"..params.."'") -end) diff --git a/games/devtest/mods/experimental/detached.lua b/games/devtest/mods/experimental/detached.lua deleted file mode 100644 index 673adfd..0000000 --- a/games/devtest/mods/experimental/detached.lua +++ /dev/null @@ -1,29 +0,0 @@ --- 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/devtest/mods/experimental/init.lua b/games/devtest/mods/experimental/init.lua deleted file mode 100644 index b292f79..0000000 --- a/games/devtest/mods/experimental/init.lua +++ /dev/null @@ -1,23 +0,0 @@ --- --- Experimental things --- - -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 - -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_on_mods_loaded(function() - minetest.log("action", "[experimental] on_mods_loaded()") -end) diff --git a/games/devtest/mods/experimental/items.lua b/games/devtest/mods/experimental/items.lua deleted file mode 100644 index 94be71c..0000000 --- a/games/devtest/mods/experimental/items.lua +++ /dev/null @@ -1,105 +0,0 @@ -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".."\n".. - "Punch: Marks 'infotext' and 'formspec' meta fields of chest as private", - 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".."\n".. - "Punch: Spawn random test particle", - 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/devtest/mods/experimental/mod.conf b/games/devtest/mods/experimental/mod.conf deleted file mode 100644 index cf0f9cb..0000000 --- a/games/devtest/mods/experimental/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = experimental -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/devtest/mods/experimental/textures/experimental_callback_node.png b/games/devtest/mods/experimental/textures/experimental_callback_node.png deleted file mode 100644 index e9d87434c04e6c7c9791b0ef469c41615a66b0ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^P6|{~{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+ diff --git a/games/devtest/mods/experimental/textures/experimental_particle_vertical.png b/games/devtest/mods/experimental/textures/experimental_particle_vertical.png deleted file mode 100644 index 0320b7545a55e89c7438a91c6fbf6a1b6590cc0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308 zcmV-40n7f0P)J+U(t5a@$ z(mz?V(v#q+82$ZHlD`kJh;e6F(!mBC#7p@03sKK`q=DTM^GS5zGi4M^vCbn>W0000)<9uuaTh;PctTxH;|YuYR{?gPD2`5)RwA6J{(j lP`J)ILvLZF*AjaM23@x0qN{zs{skJ&;OXk;vd$@?2>`a$DQ5rx diff --git a/games/devtest/mods/give_initial_stuff/init.lua b/games/devtest/mods/give_initial_stuff/init.lua deleted file mode 100644 index 491a531..0000000 --- a/games/devtest/mods/give_initial_stuff/init.lua +++ /dev/null @@ -1,37 +0,0 @@ -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) - 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/devtest/mods/give_initial_stuff/mod.conf b/games/devtest/mods/give_initial_stuff/mod.conf deleted file mode 100644 index 1ba49f5..0000000 --- a/games/devtest/mods/give_initial_stuff/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = give_initial_stuff -description = Gives items to players on join -depends = basetools, bucket, chest_of_everything, testnodes diff --git a/games/devtest/mods/initial_message/init.lua b/games/devtest/mods/initial_message/init.lua deleted file mode 100644 index 59e9f5f..0000000 --- a/games/devtest/mods/initial_message/init.lua +++ /dev/null @@ -1,9 +0,0 @@ -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 \"Development Test\" [devtest], 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/devtest/mods/initial_message/mod.conf b/games/devtest/mods/initial_message/mod.conf deleted file mode 100644 index 32aa2ac..0000000 --- a/games/devtest/mods/initial_message/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = initial_message -description = Show message to joining players explaining what this testing game is about diff --git a/games/devtest/mods/mapgen/init.lua b/games/devtest/mods/mapgen/init.lua deleted file mode 100644 index a5f9128..0000000 --- a/games/devtest/mods/mapgen/init.lua +++ /dev/null @@ -1,104 +0,0 @@ --- --- 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, - node_riverbed = "basenodes:sand", - depth_riverbed = 2, - node_dungeon = "basenodes:cobble", - node_dungeon_alt = "basenodes:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = 31000, - y_min = 4, - 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 = 3, - node_riverbed = "basenodes:sand", - depth_riverbed = 2, - node_cave_liquid = "basenodes:water_source", - node_dungeon = "basenodes:cobble", - node_dungeon_alt = "basenodes:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = 3, - y_min = -255, - heat_point = 50, - humidity_point = 50, - }) - - minetest.register_biome({ - name = "mapgen:grassland_under", - node_cave_liquid = {"basenodes:water_source", "basenodes:lava_source"}, - node_dungeon = "basenodes:cobble", - node_dungeon_alt = "basenodes:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = -256, - y_min = -31000, - heat_point = 50, - humidity_point = 50, - }) -end diff --git a/games/devtest/mods/mapgen/mod.conf b/games/devtest/mods/mapgen/mod.conf deleted file mode 100644 index 15750cc..0000000 --- a/games/devtest/mods/mapgen/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mapgen -description = Minimal map generator -depends = basenodes diff --git a/games/devtest/mods/modchannels/init.lua b/games/devtest/mods/modchannels/init.lua deleted file mode 100644 index ee925f0..0000000 --- a/games/devtest/mods/modchannels/init.lua +++ /dev/null @@ -1,14 +0,0 @@ --- --- 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/devtest/mods/modchannels/mod.conf b/games/devtest/mods/modchannels/mod.conf deleted file mode 100644 index 7c13aad..0000000 --- a/games/devtest/mods/modchannels/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = modchannels -description = Add experimental mod channel handlers diff --git a/games/devtest/mods/soundstuff/init.lua b/games/devtest/mods/soundstuff/init.lua deleted file mode 100644 index b263a3f..0000000 --- a/games/devtest/mods/soundstuff/init.lua +++ /dev/null @@ -1,174 +0,0 @@ -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^[opacity:190", - }, - special_tiles = { - {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", - backface_culling = false}, - {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", - 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, - use_texture_alpha = "blend", - 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", - }, - 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".."\n".. - "Makes a sound when 'eaten' (with punch key)", - 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".."\n".. - "Digs cracky=3 and more".."\n".. - "Makes a sound when it breaks", - 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/devtest/mods/soundstuff/mod.conf b/games/devtest/mods/soundstuff/mod.conf deleted file mode 100644 index 2c631e2..0000000 --- a/games/devtest/mods/soundstuff/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = soundstuff -description = Example items and nodes for testing sound effects diff --git a/games/devtest/mods/soundstuff/sounds/soundstuff_mono.ogg b/games/devtest/mods/soundstuff/sounds/soundstuff_mono.ogg deleted file mode 100644 index 43428d5664cbb98fe197b7b04330bf0abfd23abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4362 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 Kb6Mw<&;$U~cp97l diff --git a/games/devtest/mods/soundstuff/textures/soundstuff_node_blank.png b/games/devtest/mods/soundstuff/textures/soundstuff_node_blank.png deleted file mode 100644 index 4dffacc4ca3cd9579c07f170de41ca4ffa9ddca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/soundstuff/textures/soundstuff_node_dug.png b/games/devtest/mods/soundstuff/textures/soundstuff_node_dug.png deleted file mode 100644 index bab5fbe516cf878f5bd81987458df8556cd85cd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/soundstuff/textures/soundstuff_node_fall.png b/games/devtest/mods/soundstuff/textures/soundstuff_node_fall.png deleted file mode 100644 index 17b14f1e4aa456f652b0f55b50acc82f12c65577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/soundstuff/textures/soundstuff_node_place_failed.png b/games/devtest/mods/soundstuff/textures/soundstuff_node_place_failed.png deleted file mode 100644 index 780ba946d28da2347913ddd350da00a47d698946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/stairs/init.lua b/games/devtest/mods/stairs/init.lua deleted file mode 100644 index 2701cab..0000000 --- a/games/devtest/mods/stairs/init.lua +++ /dev/null @@ -1,65 +0,0 @@ -stairs = {} - --- Node will be called stairs:stair_ -function stairs.register_stair(subname, recipeitem, groups, images, description) - minetest.register_node(":stairs:stair_" .. subname, { - description = description, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = true, - groups = groups, - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - }, - }, - }) -end - --- Node will be called stairs:slab_ -function stairs.register_slab(subname, recipeitem, groups, images, description) - minetest.register_node(":stairs:slab_" .. subname, { - description = description, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - is_ground_content = true, - groups = groups, - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - }, - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - }, - }) -end - --- Nodes will be called stairs:{stair,slab}_ -function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab) - stairs.register_stair(subname, recipeitem, groups, images, desc_stair) - stairs.register_slab(subname, recipeitem, groups, images, desc_slab) -end - -stairs.register_stair_and_slab("stone", "basenodes:stone", - {cracky=3}, - {"default_stone.png"}, - "Stone Stair", - "Stone Slab") - -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"}, - "Cobblestone Stair", - "Cobblestone Slab") diff --git a/games/devtest/mods/stairs/mod.conf b/games/devtest/mods/stairs/mod.conf deleted file mode 100644 index 724bff8..0000000 --- a/games/devtest/mods/stairs/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = stairs -description = Adds stairs and slabs -depends = basenodes diff --git a/games/devtest/mods/testentities/armor.lua b/games/devtest/mods/testentities/armor.lua deleted file mode 100644 index 415e5bd..0000000 --- a/games/devtest/mods/testentities/armor.lua +++ /dev/null @@ -1,61 +0,0 @@ --- Armorball: Test entity for testing armor groups --- Rightclick to change armor group - -local phasearmor = { - [0]={icy=100}, - [1]={fiery=100}, - [2]={icy=100, fiery=100}, - [3]={fleshy=-100}, - [4]={fleshy=1}, - [5]={fleshy=10}, - [6]={fleshy=50}, - [7]={fleshy=100}, - [8]={fleshy=200}, - [9]={fleshy=1000}, - [10]={fleshy=32767}, - [11]={immortal=1}, - [12]={punch_operable=1}, -} -local max_phase = 12 - -minetest.register_entity("testentities:armorball", { - 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 = {"testentities_armorball.png"}, - spritediv = {x=1, y=max_phase+1}, - initial_sprite_basepos = {x=0, y=0}, - }, - - _phase = 7, - - on_activate = function(self, staticdata) - minetest.log("action", "[testentities] armorball.on_activate") - self.object:set_armor_groups(phasearmor[self._phase]) - self.object:set_sprite({x=0, y=self._phase}) - end, - - on_rightclick = function(self, clicker) - -- Change armor group and sprite - self._phase = self._phase + 1 - if self._phase >= max_phase + 1 then - self._phase = 0 - end - self.object:set_sprite({x=0, y=self._phase}) - self.object:set_armor_groups(phasearmor[self._phase]) - end, - - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) - if not puncher then - return - end - local name = puncher:get_player_name() - if not name then - return - end - minetest.chat_send_player(name, "time_from_last_punch="..string.format("%.3f", time_from_last_punch).."; damage="..tostring(damage)) - end, -}) diff --git a/games/devtest/mods/testentities/callbacks.lua b/games/devtest/mods/testentities/callbacks.lua deleted file mode 100644 index a212fbf..0000000 --- a/games/devtest/mods/testentities/callbacks.lua +++ /dev/null @@ -1,78 +0,0 @@ --- 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_deactivate = function(self, removal) - message("Callback entity: on_deactivate! pos="..spos(self) .. "; removal=" .. tostring(removal)) - 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/devtest/mods/testentities/init.lua b/games/devtest/mods/testentities/init.lua deleted file mode 100644 index df8c72e..0000000 --- a/games/devtest/mods/testentities/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -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/devtest/mods/testentities/mod.conf b/games/devtest/mods/testentities/mod.conf deleted file mode 100644 index 7a8cb5a..0000000 --- a/games/devtest/mods/testentities/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testentities -description = Example entities for testing diff --git a/games/devtest/mods/testentities/textures/testentities_armorball.png b/games/devtest/mods/testentities/textures/testentities_armorball.png deleted file mode 100644 index 708c7b36d88c78f8ef76d90cf2db172c9ddbe46b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1385 zcmXw23pCVu6u$ny|BNy;NDOHi?~}rwYBPBajmLOQ9%G7jkTi%Qw0UMs+1g4Yq$SoP ztx71XY#xJEO*%w5Nlc_1uZX<1CCyG}&z^I?@4NS$`<-*oJ@@|N$#Paw&{6;ZC8i6* zTc*k~bgw}&rae*_lgZj>7r$5l()w?ZgZu&tfE>ruo$aXM$eCU7khMsq(&ov@kA0q( zC6bBGO?@Kuz^6~eRcgIOpf(59`6{%E3ey+RdlY(YK<6@SJO$$lK#2wk5!MGl6A>DT zP)~$EiBLy`S|ZdC;0_V4E8w*VZWG|zTJ$>suFDbv6ceC`067FOH#g5FfDng^IGo3U zFOSl3NG4)@9FmAwk}OA%h(iJn@i?5o;U^r9;}C~KEDkX;MsN&=V+f)VL?Jke;0S_9 z1Q7@hBM3(jh9DFH55XY>AqWm42u7fzqZ5Q65J3O}E`lFrfq@?ae+>2^*oOfJ178f- z7-(r}`C#CUffoiW3_LJ!!@v~-CI*feFfiDS!G;YR95ArQfR2G32DTU|D=T-9r^;nJ zm5cLc`2c;ikN2$zc5`OHS;8h4093?e*t1>4Z*rtQs$Oc3h7=#xyqeDEWc=2&Vc}sWh;DMpV}@Q~7ec-?o=t#ICVIafi)ddS;XIqr5OHI5S zk2O`9?n?R;>v4Y4#PBJQ8-q5h>Xm_c zd^pHoSkUd}k{PJW)MNK zD4-?|EHSl0+b*=73H>9U5VY}Ui>Q7jOYL|K3HD{r8Y6A$u;qAy;YIxehDoomV%GCZ_#;N$aW~x31&M+~EU+Y9Z@NUyZ`cJLNx3X{{e{UY)&wA{s<{@1G#=*RZr;d=TH8 zd*=1w9jW^LRO5r@p#^JdWsyl3WxHO^_q4*olh!+DSXRkWrpn`;d(|_`KDyiP52*V= zL!DU_nZD93b>cZCx1U7xMQX7X%tOq^n%DY2<0)-&~p?>g2q zyVi%CN{*Fv|JG)jrH%ALhGltY?)*|^&#vZ?jDnP@I5Tsr!gWIf!_V&q6WCiga|sef z$?>+9#jg3#Ho|O%t~JRdb&=cBsH2}o-%E^Joep{@e%pU}1|87f+aCwtjo)Il94|3O=$JB3^?x7rKVQ6_%%|$0cZuEwOoI?|$k~ap(XR@r^XzG9 S$CC`%-vZN-#i()!68sCK$tE`d diff --git a/games/devtest/mods/testentities/textures/testentities_callback.png b/games/devtest/mods/testentities/textures/testentities_callback.png deleted file mode 100644 index c4c9066d1732bc8c1ee3405da367b34482a88e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|$(}BbAr*{gCkApg81OjDR|xRG znfd45#5ZQFn?f^SOhrLo^ z*ejWZyO@6JcQbsHS6;d9ao&OXr@!7m$o|J;^1Oqqm^F^9+bfX&;}+0522WQ%mvv4F FO#s?uIivsp diff --git a/games/devtest/mods/testentities/textures/testentities_callback_step.png b/games/devtest/mods/testentities/textures/testentities_callback_step.png deleted file mode 100644 index b67506a9723c6f93c7fb917c0904b6429e2e307f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testentities/textures/testentities_cube1.png b/games/devtest/mods/testentities/textures/testentities_cube1.png deleted file mode 100644 index c667e425f451aae2c5d859d1f32428bb4c361f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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=^ diff --git a/games/devtest/mods/testentities/textures/testentities_cube2.png b/games/devtest/mods/testentities/textures/testentities_cube2.png deleted file mode 100644 index 481823420c1030ae7be3944b1ed0115b7ddb9198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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( diff --git a/games/devtest/mods/testentities/textures/testentities_cube3.png b/games/devtest/mods/testentities/textures/testentities_cube3.png deleted file mode 100644 index 03b5daa15f10cc7bbc998db2dc75f7c7cd40addf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testentities/textures/testentities_cube4.png b/games/devtest/mods/testentities/textures/testentities_cube4.png deleted file mode 100644 index 639204896232e73ba5cb54c9a4a2ed4b632009a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testentities/textures/testentities_cube6.png b/games/devtest/mods/testentities/textures/testentities_cube6.png deleted file mode 100644 index 5f81a64d91be219377841be129da41e48db7856a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testentities/textures/testentities_dungeon_master.png b/games/devtest/mods/testentities/textures/testentities_dungeon_master.png deleted file mode 100644 index 1e31077464eaf2b7e39a24f21687e15b723fb5f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2855 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 L^>bP0l+XkKkyj%p diff --git a/games/devtest/mods/testentities/textures/testentities_upright_sprite2.png b/games/devtest/mods/testentities/textures/testentities_upright_sprite2.png deleted file mode 100644 index a79a760e341eb96412b298df8fc072249bfda002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 5 then - self.bgcolor = { - r = math.random(0, 255), - g = math.random(0, 255), - b = math.random(0, 255), - a = math.random(0, 255), - } - end - end - - assert(self.color) - self.object:set_properties({ - nametag = tostring(math.random(1000, 10000)), - nametag_color = self.color, - nametag_bgcolor = self.bgcolor, - }) - end, - - get_staticdata = function(self) - return minetest.serialize({ color = self.color, bgcolor = self.bgcolor }) - end, -}) diff --git a/games/devtest/mods/testfood/init.lua b/games/devtest/mods/testfood/init.lua deleted file mode 100644 index 39b1213..0000000 --- a/games/devtest/mods/testfood/init.lua +++ /dev/null @@ -1,31 +0,0 @@ -local S = minetest.get_translator("testfood") - -minetest.register_craftitem("testfood:good1", { - description = S("Good Food (+1)"), - inventory_image = "testfood_good.png", - on_use = minetest.item_eat(1), -}) -minetest.register_craftitem("testfood:good5", { - description = S("Good Food (+5)"), - inventory_image = "testfood_good2.png", - on_use = minetest.item_eat(5), -}) - -minetest.register_craftitem("testfood:bad1", { - description = S("Bad Food (-1)"), - inventory_image = "testfood_bad.png", - on_use = minetest.item_eat(-1), -}) -minetest.register_craftitem("testfood:bad5", { - description = S("Bad Food (-5)"), - inventory_image = "testfood_bad2.png", - on_use = minetest.item_eat(-5), -}) - -minetest.register_craftitem("testfood:replace1", { - description = S("Replacing Food (+1)").."\n".. - S("Replaced with 'Good Food (+1)' when eaten"), - inventory_image = "testfood_replace.png", - on_use = minetest.item_eat(1, "testfood:good1"), -}) - diff --git a/games/devtest/mods/testfood/mod.conf b/games/devtest/mods/testfood/mod.conf deleted file mode 100644 index 7bff21b..0000000 --- a/games/devtest/mods/testfood/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testfood -description = For testing food items diff --git a/games/devtest/mods/testfood/textures/testfood_bad.png b/games/devtest/mods/testfood/textures/testfood_bad.png deleted file mode 100644 index 6e92514407228ec296e19cddee0c1ed1d3384b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr*|t4b6cc*u~XuHT<{Y z`G3*SjCsrdhlUI{(?XaR|*ddEN^0$*sz9iy0HGj z^aF!HJmC}$G?T&8)z4*}Q$iB}^Die( diff --git a/games/devtest/mods/testfood/textures/testfood_good2.png b/games/devtest/mods/testfood/textures/testfood_good2.png deleted file mode 100644 index e43dda209b1361c4d465ced4d962d551181b87dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testfood/textures/testfood_replace.png b/games/devtest/mods/testfood/textures/testfood_replace.png deleted file mode 100644 index 1ef6876e5bbf794803a9282601a1836def754849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ex5FlAr*|t5;Gsz%PelRulP_e z67yMpwPL-4&;FG+o!SS~|M{*mZpZEf)hIr*f@dT^6ZjBwh h!bOagoEa6246|yNc^<#LY(LOs22WQ%mvv4FO#sNwDZu~$ diff --git a/games/devtest/mods/testformspec/LICENSE.txt b/games/devtest/mods/testformspec/LICENSE.txt deleted file mode 100644 index 07696cc..0000000 --- a/games/devtest/mods/testformspec/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -License of media files ----------------------- -Content imported from minetest_game. - - -BlockMen (CC BY-SA 3.0) - default_chest_front.png - default_chest_lock.png - default_chest_side.png - default_chest_top.png - -stujones11 (CC BY-SA 3.0) -An0n3m0us (CC BY-SA 3.0) - testformspec_character.b3d diff --git a/games/devtest/mods/testformspec/callbacks.lua b/games/devtest/mods/testformspec/callbacks.lua deleted file mode 100644 index 5593805..0000000 --- a/games/devtest/mods/testformspec/callbacks.lua +++ /dev/null @@ -1,51 +0,0 @@ -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/devtest/mods/testformspec/dummy_items.lua b/games/devtest/mods/testformspec/dummy_items.lua deleted file mode 100644 index 2037ae9..0000000 --- a/games/devtest/mods/testformspec/dummy_items.lua +++ /dev/null @@ -1,14 +0,0 @@ --- 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/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua deleted file mode 100644 index 5f1f897..0000000 --- a/games/devtest/mods/testformspec/formspec.lua +++ /dev/null @@ -1,536 +0,0 @@ -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 inv_style_fs = [[ - style_type[list;noclip=true] - list[current_player;main;-0.75,0.75;2,2] - - real_coordinates[false] - list[current_player;main;1.5,0;3,2] - real_coordinates[true] - - real_coordinates[false] - style_type[list;size=1.1;spacing=0.1] - list[current_player;main;5,0;3,2] - real_coordinates[true] - - style_type[list;size=.001;spacing=0] - list[current_player;main;7,3.5;8,4] - - box[3,3.5;1,1;#000000] - box[5,3.5;1,1;#000000] - box[4,4.5;1,1;#000000] - box[3,5.5;1,1;#000000] - box[5,5.5;1,1;#000000] - style_type[list;spacing=.25,.125;size=.75,.875] - list[current_player;main;3,3.5;3,3] - - style_type[list;spacing=0;size=1.1] - list[current_player;main;.5,7;8,4] -]] - -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;bgcolor=#1cc;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_middle=4,6;padding=5,7;fgimg=testformspec_bg.png;fgimg_middle=1] - style[one_btn16:hovered;bgimg=testformspec_bg_9slice_hovered.png;fgimg=testformspec_bg_hovered.png] - style[one_btn16:pressed;bgimg=testformspec_bg_9slice_pressed.png;fgimg=testformspec_bg_pressed.png] - image_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]".. - "animated_image[0,1;4.5,1;clip_animated_image;testformspec_animation.png;4;100]" .. - "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 .. "]" .. - "hypertext[3,17;3,3;;Hypertext with no scrollbar\\; the scroll container should scroll.]" .. - "textarea[3,21;3,1;textarea;;More scroll within scroll]" .. - "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 window = { - sizex = 12, - sizey = 13, - positionx = 0.5, - positiony = 0.5, - anchorx = 0.5, - anchory = 0.5, - paddingx = 0.05, - paddingy = 0.05 -} - -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[]", - - -- Inv - "size[12,13]real_coordinates[true]" .. inv_style_fs, - - -- Window - function() - return "formspec_version[3]" .. - string.format("size[%s,%s]position[%s,%s]anchor[%s,%s]padding[%s,%s]", - window.sizex, window.sizey, window.positionx, window.positiony, - window.anchorx, window.anchory, window.paddingx, window.paddingy) .. - string.format("field[0.5,0.5;2.5,0.5;sizex;X Size;%s]field[3.5,0.5;2.5,0.5;sizey;Y Size;%s]" .. - "field[0.5,1.5;2.5,0.5;positionx;X Position;%s]field[3.5,1.5;2.5,0.5;positiony;Y Position;%s]" .. - "field[0.5,2.5;2.5,0.5;anchorx;X Anchor;%s]field[3.5,2.5;2.5,0.5;anchory;Y Anchor;%s]" .. - "field[0.5,3.5;2.5,0.5;paddingx;X Padding;%s]field[3.5,3.5;2.5,0.5;paddingy;Y Padding;%s]" .. - "button[2,4.5;2.5,0.5;submit_window;Submit]", - window.sizex, window.sizey, window.positionx, window.positiony, - window.anchorx, window.anchory, window.paddingx, window.paddingy) .. - "field_close_on_enter[sizex;false]field_close_on_enter[sizey;false]" .. - "field_close_on_enter[positionx;false]field_close_on_enter[positiony;false]" .. - "field_close_on_enter[anchorx;false]field_close_on_enter[anchory;false]" .. - "field_close_on_enter[paddingx;false]field_close_on_enter[paddingy;false]" - end, - - -- Animation - [[ - formspec_version[6] - 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] - image[0.5,3;1,1;testformspec_bg.png;1] - animated_image[0.5,4.25;1,1;;[combine:16x48:0,0=testformspec_bg.png:0,16=testformspec_bg_hovered.png:0,32=testformspec_bg_pressed.png;3;250;1;1] - image[0.5,5.5;2,1;testformspec_9slice.png;16,0,-16,-16] - animated_image[2.75,5.5;1.5,0.5;;[combine:300x140:0,0=testformspec_9slice.png:0,70=(testformspec_9slice.png^[transformFX);2;500;1;16,0,-16,-16] - 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] - - ]], - - -- Model - [[ - formspec_version[3] - size[12,13] - style[m1;bgcolor=black] - style[m2;bgcolor=black] - label[5,1;all defaults] - label[5,5.1;angle = 0, 180 -continuous = false -mouse control = false -frame loop range = 0,30] - label[5,9.2;continuous = true -mouse control = true] - model[0.5,0.1;4,4;m1;testformspec_character.b3d;testformspec_character.png] - model[0.5,4.2;4,4;m2;testformspec_character.b3d;testformspec_character.png;0,180;false;false;0,30] - model[0.5,8.3;4,4;m3;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true] - ]], - - -- Scroll containers - "formspec_version[3]size[12,13]" .. - scroll_fs, - - -- Sound - [[ - formspec_version[3] - size[12,13] - style[snd_btn;sound=soundstuff_mono] - style[snd_ibtn;sound=soundstuff_mono] - style[snd_drp;sound=soundstuff_mono] - style[snd_chk;sound=soundstuff_mono] - style[snd_tab;sound=soundstuff_mono] - button[0.5,0.5;2,1;snd_btn;Sound] - image_button[0.5,2;2,1;testformspec_item.png;snd_ibtn;Sound] - dropdown[0.5,4;4;snd_drp;Sound,Two,Three;] - checkbox[0.5,5.5.5;snd_chk;Sound;] - tabheader[0.5,7;8,0.65;snd_tab;Soundtab1,Soundtab2,Soundtab3;1;false;false] - ]], - - -- Background - [[ - formspec_version[3] - size[12,13] - box[0,0;12,13;#f0f1] - background[0,0;0,0;testformspec_bg.png;true] - box[3.9,2.9;6.2,4.2;#d00f] - scroll_container[4,3;6,4;scrbar;vertical] - background9[1,0.5;0,0;testformspec_bg_9slice.png;true;4,6] - label[0,0.2;Backgrounds are not be applied to scroll containers,] - label[0,0.5;but to the whole form.] - scroll_container_end[] - scrollbar[3.5,3;0.3,4;vertical;scrbar;0] - container[2,11] - box[-0.1,0.5;3.2,1;#fff5] - background[0,0;2,3;testformspec_bg.png;false] - background9[1,0;2,3;testformspec_bg_9slice.png;false;4,6] - container_end[] - ]], - - -- Unsized - [[ - formspec_version[3] - background9[0,0;0,0;testformspec_bg_9slice.png;true;4,6] - background[1,1;0,0;testformspec_bg.png;true] - ]], -} - -local page_id = 2 -local function show_test_formspec(pname) - local page = pages[page_id] - if type(page) == "function" then - page = page() - end - - local fs = page .. "tabheader[0,0;11,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound,Background,Unsized;" .. 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 - page_id = tonumber(fields.maintabs) - show_test_formspec(player:get_player_name()) - 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 - - for name, value in pairs(fields) do - if window[name] then - print(name, window[name]) - local num_val = tonumber(value) or 0 - - if name == "sizex" and num_val < 4 then - num_val = 6.5 - elseif name == "sizey" and num_val < 5 then - num_val = 5.5 - end - - window[name] = num_val - print(name, window[name]) - end - end - - if fields.submit_window then - show_test_formspec(player:get_player_name()) - 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/devtest/mods/testformspec/init.lua b/games/devtest/mods/testformspec/init.lua deleted file mode 100644 index 23b565f..0000000 --- a/games/devtest/mods/testformspec/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -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/devtest/mods/testformspec/mod.conf b/games/devtest/mods/testformspec/mod.conf deleted file mode 100644 index 00eac30..0000000 --- a/games/devtest/mods/testformspec/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testformspec -description = Contains an example formspec to test all the features of formspecs diff --git a/games/devtest/mods/testformspec/models/testformspec_character.b3d b/games/devtest/mods/testformspec/models/testformspec_character.b3d deleted file mode 100644 index 8edbaf6377891568c248cd73d2d691f97c775311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73433 zcmeEvcX$)W6Sgq6>AiPjz?kMH+gQ@sGQET89Zc`d^lH(2@7?qe0 zEnY?u(WzaB_W4UFV)5c$&;}0l&DgZ@d~E!{c{2YDsDbB99T<R=veAjVyU9JYmca9GoI1jHU^Ff{NQ4AkP{j|p|?E238Q-415{+NEs=ecyW zXQupE)PFF$zIr@~U!U1Wd)#?_ZTW26$H!5B=eYCw>T$o! z`B9C-b@9l&f0y|~+wgHFpV`Mb|9l+n;~aO|M?LOm-nj9+ReSz)+`fUu54EqM=*M+u z3c$Dp_5TFM_bb;|kH@m{%_LuY+|N7!{Bymg|HhI1=dtmDANhZL<~ZC#toFEt$;WZ0 zeNcDQ6Xh%8czwk_+&0LGW%5P+)Z>bNIPR41I_|u_wtR~@PACKewDdWXp{A2mb{Nm@gWZH+zW(vT6{Fr;4i|G~Md*B|u2e^Cy`!}*E9_@zCbf&RtDF+P0!c^r58|HtDx zkk7_d^40n|<>U1SLmY>c_6Hd>-ZEfqs-JpV{Z*aUH)t z#YfbSAIuN={j>P-@#j&#(>~5|t|RKl?91dk?WZ1B@|W}e@cMk5$=C7x^Rav!ch0YB z9Onh)2;-{jtH#;&nSDMU*Wvx)^AL?;MKheKk$6fQAdOXuVRQd_ypak>JSm*t@jw|=?Tp#N3%>1KT zU#{cKzN-C`FwX6-+W)zZTX23<`$zS767zo?ckW+Z$Cc}YZ&3bHkF$Bi{HBV(uH!m( zeMLUYPvl#C{*-Z)uf$j3^Qd18&;QQ#oylSM&&QqqqaN2`d~u1Nd>rl1{M#jdsK@dC zmHnM_{jvLo`^a2>Z2#ws4}3fpIDVP?JMD1`laKL5TfQ=m>swi$JT~Ap{Fr=EKlQkx zAC5cayN)}ruPvXAv-m>es`<;jzACs`twfxvx|TH{uTYW z?Gf?wEWWb&`Pe^Vg>mQna2;^m59f#7zxMnn*9ejl>6iH-6@}sqkOjiX7aVi zQNC;b27 z9aruT?W5RVJsv0AzxKGF#`@thGOy44TQ$FQ|2U5Kr})3hKWH4U?;Ll|FPD$w?D}ke zobusQ%!bZ!=l$Ur9w<;6|9BkbJMH5f=Q_p<@}2Xe9@pv6e$M+t{rEVOpE>@qd>nVq zuWB6if#IJ`$Kdi{8`4kZKd$4h_EV4h;q{sS zIj`?JZi(s8u37uvbF%B{@cU5wUK9`fC+y?l3(W_bH?&;T$Md|<@<7WCEg$vqydbm! z(DFkoM14Fj3atpV!qAFQAJ0odgRfuI((5gbKPJKMD39SaSKxnn7kLUR1bRB55p#@VP&%>bM7u6xq z^wh`mNN5qz!lBirKAsz)8K6Z$Gf^MUG4bH$OoE1!gnc}(53L@wSZEEPVIR*MLu&-B zA+#pc$MfdUnn7y{tp)Y*yfw5|&{{%kLw!7N2dyo%IB4yukLR7Bb%fRdT4(Cxc{gZX zp>=`Qo%(p*3tCTTJ)rfbKA!i5)(2WVw0_XAkLLrS4S?1k+92xV`A}#>pbdsLjQV&! z650r8!=a6$KAz*Z{$rqxhBlV^cs>EzcxdCGO{6}aPk}ZW+9YUGsgLI~piPH14O$}g z@q8Avnb0iIW<$e1p3j3e7upf`w`XiK3jfwr9bc)kkSN@y#f zt)@PnuYk-x` zY(UtMun}Qn!X|`G37Zi%Cu~93lCTwFYr-~!afEFN+Yz=W>_CXY4v$U>u%L&hU8vuc zup41_!X6AQ=AMMT2zwL8GgN{gp7y1FKf?Zm0|*Ba4k8>(ID~L0;V{DCgd+$?5{@Dq zO*n=yfp9G0I6@4TcuY`$1x-AiME%KxQwXOLP9vO7ID;^e&_Xzqa2DZg!a0O<3Fi^c zCtN_dkZ=*CBx_G*Q`Wp#15pE{jLb#Q1 z8{u}sB*GnpI|+9Y?k3zrxR-DrVT(px+v9E}7xZ&LysLVfhQrm)DtL^M%fT-P_N=op|Jo z4Q=7db(MP$xEZAj*mG-eU2SFq?z}$H_BcZudddgpW$a)Ub^xcL(b zISRYMEeG5VIm$YUxWPUBZ=yNqroW@88{DbDZTe*mM=>|Jje)!NM3AGn2G`ZT)qtB~ z4|SAqgIgB3SB{1`O1i;Cxu1hv+*`Q%uj{;_zUx5W(r$3k4$Z(0W!&JReS^WiW!>QN zc`N4zm-|C`H@Mu-D!9Q#|2+x*TTz4SI&ZixWLOuKG`Ozz1`5GSi?a9!nM{G9{w7gEfB`Xt8n z%@EhCyTL`BHbA}zbd&1~d8me)T%fTB_5WH!sDn4it>vcNQ=o5cH@Ikr*= zE&=-nX>hgXZ9L3dum;yvF3)cv8eCVoJimo%a9!o{{1&Fcb(PE4h29M=t~U$hH`ug% zo`J#>#76Bhf@$ABHiF(-1#5mx4Ld{c|419gIf;dc7*(9aD&U^uh9)I z#`Pu;*G+D4F<-2Qd?9IYUG2;BP_!Fdp5J2J;G*1Skl%1~_g`xh^&NRU$Pw!XcN%cd zIBGcRxxqaP+&2z?M}0TA6=B}IZj^B}(BQh-%mUo`frT6m-QfNJ+>5_^IU2daZ43VU zMZur!josi{fg3dIvb~80*L7XwgZ0*;a*DmF8{Ce-{p!|gdovBLs~uJX_lM%6?D!n+ zI>)ZuW58YRZ?w12;JWI2AGp2h=e4(VgZm1&eXF0awQ_^|4{%e~O|-RkgNt#!=9|2> zHg0fH|FwI^r^mU;_5EaQT3a`{Kx1FbqJ6Jk%5U~9JOn}^f6i0BUjvE-|LwC6K8xBz z#~p65uvKXtG`OzwhH{tpTbNNaCoH#j*WkL^EH7{i4NkH5(BQh-VLPnj z*kw2DJ>B5?0k`RuKkdET;I4tVW6NE@(c2B~dx(?Ut5tBsyTKg@+?fE(O#z)fx3(J{~sZa?52 z9^c6^$PF&at<$8VW3U@s)c5nlZ5>10;Qj*KW%d>h{2tJC&Aa+!XRz<{0Sz3(G`Oxl zc@wz)m!llR-Qe~Ge`x4m+cClo?%%+T+FQXf(hcr1@Za8t3phq;a9!`MEUb&=6aTi4 z*5JC{+eY9%nQ+TK#tp77tmD85Ry%%A`d{|#4%{nqR@%pEa9wrS4BS2S`q{_1!954u zV{tX?*od&Btq1H|9O8eG?V z<8gh78(hp62O(c9b%Tp}Cz9zb$uzi*k#A+!bzcQQzyZJQfhjK4k`*4wtb!Ns_~Y*tNMk{evK zVe!1{(|5SZ^(nh9ZKs>uqo;B$-lgWU_j~Yt38ldh9+qFdBjn$`Bh0&@lQ|dv!QJBl zcdrNBeI9T>@qoLZxcGiacE4|yI{J0mr^F4A&t=OkvujM+0pi~5d^TI|&QbZ(J|pg# zdZ)7GrtZr)dXTu|?qy`lje9%g=po|jblG!(ru*DYxxd~$SvQ%u|E2HH`5mKDi2Gl5 zcsFK8R4Q@*%f5fzJ`-gnt{d|fb=U*BUwEMJ5#s)r9fpG)juQ93=Iu4uH;uUN%v-vf za$(+%+T7F^<}J-mTsP(|%|To@<}K|Qaow1=wBv4acggGW$Zl{aK>RIPe6A@&gX@~# zw)_R(8x@@(op6IY^ZP_|dW)Z>lNwytTv+~6qPfDK{?Vu0;3l0&G@CvRi$3iJHwxrl zzvv%*MuY2mZ)ZT?p8{S=XEnI4`d$M&1kOs3zSQ8l%AE!F{j=f>(>V>Ut6Zh8)1CK# zdx5w&d@p3iJ}n*osW`)ak+{>07c;r8I^exkpOxUaMBF)NE@g6E<)Y1A1iW;7Mcg`n zf0fB~m5X!n^+o?j2G{?uTxFPrI%|!E>UyB~Qs-dr|4om({G`D{x-)Ng-H?m^a1H$7o`$|z`PqHqW;bu#e;*K6J#VgZac%lmnqhxP-0bE} zu_3&`4KLwNuLUo559otmf$A*yAw;K<`40r}uXKnn;X2>s_oDHfgx-WcguaBi2y+wW zA{*pIM3L**|L@N^*c z2N4b?96~sha2Vlm!V!cc2}co*CLBYUKsc6g9N~Dv34{{~ClO92oI*I2a2nxs!Wo2# zgcib?gtG`|6V4%=OE`~kKH&nwg@lU;7ZWZaTuQi%a5>=$h8FWm!c~N;3D*#=C0s|i zo^S)mn+dlNZYA7CxScSGa0lT|!d-;B3HK20CEQ2o`VubuGmpP`3d>C0bQbn8 z_>Y%z@(~vk0)A$9tq)Oq!ltBoh2}h(lW{Ep_?MIPu}r!6WktC*I^(}vr>4*UC1;wq z!rey|rqr4AJdA4zfWP951s>CZ>wFZxKzlXm4^!*p(e{c%{!PzIa*3NM z7x{DHi@8F*N=Yw79mNHp*M zdyW*_*UNF;zQ9(9xHNC6YHsLniRMY6DBFcxj?Rz2uoWk{iXAMO`l9@fz|DASm74Sq zag2YPW-CEll517#Pyx6^JBQ6yQj{yqaa-WpLGG#3A&#B#>9$fX`l@aA z61aUp-%oxHa;#4{YAa20xgFFt`|)RZQ5Wnm_);xL`r6TOntELy{o&W zv0bV=?#=kzR+e;doj3f<)7OdS@i1?O<&_=NM(nqhBe~ok)Np1#$ zhpjwuxu0<^eyMo$_e66~@UyYyiaLrIHri;i^m&*PUalByxqh=nY@;8(_WN8}rmYf7@uAALHsQTI={Jtj*7Q zmXbQm_{u)O(%Dv7k;~&l3fh&=M*zf!c!&>YGY;DaE{nGLlU%YHix1oul_Borg18fK zXtTXegDSQv#MO#t_kf!p;@J;}XW3U4&10)dT*W8FIN1&Kd0M)uY0AhB_L5(IlU_~K zA(`undVC7p{Sbf47pi72U*=$X0OMM?eTBGwAGoC*u3sp-`fu4caY9k@jx zUo>5#SD zCpAAr{nM$qar27JQMIzr7q5@{9%-#JK5w$gxaneLLv4kdr5#dEt}rI%cx^17I@M5z zbf7s-cIs&{?+3Zf!M+;@S2LBEc+e2!qOY3U6}Ww1-oE&|gQg|0KlRs;V{oA`%m z-LNlAU)GB;LSSTM*L8uPc?|2KDXfckahFZIdUi4D6)LwGi>X|X9@xXmCBRhL7hO@nO4Xi;B5 zhoZop0{N|8w=fCbjWouHas~UM+(ExvrKKZ6CGVm(BWxb=u(U$5l?NX$iH-n_| zU5^@L73yA|-|*gevx6PZM;(;>FVvK-m$Mq{DO}oXD7hPD;){UyU{5gO);`H^YBeco z(LrN<#^rHc$M!JDMcLJ1-o9(QL-HzENs9k!udxB?K>B9xcaXmk_AqlVZj@4YmXenE zY&SL}xmxzE411$|y;n*zI~0=6w^?UwL~?1~1e>LSPj0WeK#Dc_O2y7BF*eSEi#oId zU*Fwtnl$3hU#9e_vy4qdE)=9y?hEhjA?*8p4j&}l|Ko{iY~fKx<@uS%b!Wc7HPjRK zlk*Ax5A1&%4yr7b zsj}TP<4J(A1>^DtEr>hm%W_Nicg-`M4J%-5slmnj!&VXE+2OI@m@0JWZYq-V znV}VNX)f6F1zsPykAYja(*aYLSAnL7fhmU8#HG9`EPmO5Nll!-c=O6zR=#CkJ*aI+HZC0zLT0L2cEK3D62 z_ZHQopy@B)rMAX-&ZKn|z64PKT`#`)s8+i9op619y@AddKZEFD3gmi1Yyo9pIaJzYo0x! zpCi31=<5jl#$@YFTxE`vGUcMa z5fGyS->i_**A{XV*wWM%FL1G_h;!Z!LG0VuWuxT%qLkxebO&1>kqbR1HwI$r@_R|r z+b)$HFL(5^^<`Xc2R|kkp8@bQZy;6==)O-fT&U)#wR4cIpD34cQCH;NfE;kf_L+3F zd@aX?BBN~m1-Z(13S5srAh*=GmMpcd8SEHiA7>k&aLLz|e8IW>fGa0hrS+#n9o>3O zvJE616#K>rb_fP;yS|5|pHspdFZWNj4HD$)GM}YUXOw%epHLeR|e@8J@ zu>;rP9dO_DNtSjQLmWTXonTYG9+|@RM?4WRCnGVRsb_#s*#;Q5eX1`*Nz~!xMBLy9Fnfl_r9S2`O z9XC=cu^^8lPxV;aC`B&qCoRHr%U;+cE;-p&s(y;ht%R|?uPY`s_1#=#9@ma4#ZJjCPSvC8N^MleSirf(7 zaQ;2u)~UC`xbgIB+q=-f^hu1%^~Lu?oLqc%N7=69l|lU!wv3x8yXN??a|r(YZEgasOA2;A7ry$0%n_ALeW4SH71bm{yc zL!zMXBS9|C+ahJ&OqW8}8Z3;`2oAT~HYM3eLfE}lO(a#oupB-Gc z#Uy`u&oE2i#tVLi{##t}U(>;&?+vpV*Ft;n6#|#9iv{N{o7RmhY@9<}#U~4=s&(M& zt=Fq(rpoOr8|MmK?R6Y`^PTCNcA>_3q%Zk;rVcp27#~hTd?>XbkF>pdtZ}{~m%e|9 zWn6XKxdm}&t6wqc`tnvr`u%{OMHXZg&!jIqcQw*)41E8axsFi>jFUeqaZ+m9y`OQB zaBmr*YCEXnuVkD%%($5JRlaM>GOkN6zZzp)BG^H+FXoG1lzbswjhbLwN^)r~H1p8* zl3~(~uO}Iok=(5ETYJcFFH^##YoAUwE_acuzBkNo8IU(OoDP+Yy(bx02>L3ykjD~L zK9=Gf`3_weUUVcu}Rvq9PKNXue67}qknd=Fy@<+`Fha32)_ z`>3O93rT0TG&QahxPEM1a6azOhQR(T-$Y;O);A{OdO=@5;dvAHeb1DApJ|hSka2^+ z)v>t4<>G#_4D2V@bo$;jeRd_|M&c@S?2-#%pL!4WsmV<*o4S=NY*c>7;?Kt!EJopd zp={j${t5fvW#*$MYfhbUGu@jacLQ5*+$Z?H`ltBqrmF|PF>GpI-9 zU65-L?hT(?s>5@ODd#KWmPP@FBtdRG%NP9K@Oda2o`>H0E;YW+b0&&?@d$&;ddv9e zIqMBPXI-@3G!$)KB5J3g19qITS~+*-w_S=3Y`;^uU#K-Z?rsmbdpzLo^?#55o&!?5nc_#3i|h)N=9V8RWtXU=q?k z6S$T`+#eC~1z9-8|dd_fAw@Fll+FI3=SUq*g5E^%*QTxmd3%SIRd0a&;cA4yF8}ic_vpm*I5E%+cGyl zOkB$I0+-AEK1YB9XMP|X{ci+b~Q;R7##C4vs@2LEH;luPS$$HjYtp3@G>xig;03U{A!Zx$iP zx^go}F8?k*JGm!_tLz`JleG>fiL2#jt~#7z+)Q5w7yVf7hYugBy#MfF?`cu4UW@yd zxMxT%?RT`|ddfTEo+U2XjO}+s+04FGfwu2U;wtx+rF|Lq9OGuj66k$=Zwf_u2^R_3 z*^I~E3+zLD%{%u-=x^v}vGBJ9Zz=v>BreGnY^L&GX?;#holC@3{J|O5QSZ}iU06ae z{w5W$9QulJd3?|b_Qmz~qKqyD)>|~vE|Xl+AzW<-)jE#uR=-c^6_QKyCg{uK1IFK9 z%zZ+y5_i4w&WJE?s<;z9$j~qJYvR&x?!xaaO8nI&Lp+lvhV%=)MqJWYxHldrG5(IP z(L3}y<7V%_JpSHrLoScMH{H{hg`8W&RqTKTiJg9?vI7e_w~0&ZSm1K|^7wm)aWn5N zt9d&H^Oka#6&tn}+qG}XL((_9^`=mimvCp+f-1@b2K8<^VBk0%l(1(>7zh@%u}LP5>4J`#^#A`w zT*V@O3@ql#g#Lt82r*is9jg%r5LPD)WT=$r#?zYAhdE(KZ9>=uvLlEvm=K;q*a6v) z9S|wl0p7$8@N9NO5JnQ#C5$385E=>D4j0ZP*0-2hw1fMIp+0j2=*P0YQqmhw>r=l0 zVMB%%b0fmWgiQ#WGE_=@<7sp1w;*gu*ov?E2`3RwCY(Yzm2ev2bix^giG&uynS`?lXA{mLoJ%;5 za6aJzLi&=7l^e%@T1@}Ggm5Y0GQ#DAD+pH-t|DAbxQ1{o;X1YZ{;JbpSzF}&KSb3=ZcgG_?hgE1m+>J;%{{krIxKyQ{O#|CI>`0rT!UA#?&=4S z?bKm@-aFYYRf$Kxu_(6k`b+zLm6e(Zy;AU-Qof$@`#3)x7WDKeSTwmf2 z{$Nek75-O{JL$+7BUE^l2fSYqR%_QM!N$eoT<9zg`Y13f$bp z9X+IWitg{%Ob4zrRH8K5fE)TaZ}3}($%;?-XtTqYdZg$EIYQNPp~9sJDh0|1AA|WFd0_FGPHUvikw*YaAd)-d4yzmy}LWMvRR0@=h`h&s0 z*iF`g#0}8@lA^04a-l+?1eF5i9?2QOJAqq>xR!NZsk+fQ1-S(i3Q5y}yQBZL;LgA; zOxyUIG^?1WM(AyZpQFf(rt-2ywee#ZxU6MJ`lmm7r3fT<*rJ;43zhwJ34F zTUItzw>gI(H|kOi2`UB3X>b1u-U!@c#BHAIZMY>$cNp;7>FPq+38=?>fy#67pj>kHkFBDdyeVG>jdlvk9`nH&e)lEj^@ zA$J?e&2=$na#!G%azo!Ud3=*m-_pd*&JJ^J zy!8($k&N?Jj<{O>P=Nfw>zDG$=nv(Io1LGvIA1M!2XHG8x3q@;o+khOXMS+&=h2TI)E1)^XPsZITZH7x!=&AJQ;B zYcrK`7f=D0<%=m>W+r342qdmfBM(6ZT$YEPS!XeB4bBBr4rgwmzKn=+YXWAK-?-e} zl;3I*S4-bBr0+w@Z?!pB!wz%E4reL9)gi8yeV37a%Tay{BCgiFL4|iAzXcQ5o%{w) z$n2oyXRi4zl(_EXw=m*rtqa%urYG(+jr=x~*4rJ*Z{fu4ps|im(mMV?`7MIDTJhm5 z#RrMJv9dUf7pphtAbA&X8xc48-OUus8*$H7 zzt2ymHn2b2a4k6bSKu}#?l_$z#j;!6_pN_^*^~<0Jq?V>QIId15cgcY9Vxm-;(qe@ z+7we>*iSyr*@)%0roMu1l(3!-$8wnb;(M8<2v~7 znQZ(AxMx0B@>^@-#{c{8=ekGYbIbWw`Pp;JhEyfLwIQxw;az~iYpY*n#Jn60PK-@b) zzRB?C@oX-*+?RiboBt^iVJ>#T+xq6bx4t8BJ6>21+zd#$P8}va4>u3>k1#jA5@EjB$;W!LgO9#Dahrs!vFgf) zfi0Z#);CYMxyFYGbMq-a)<+Y4^gW1cpII+eS2%>p<^0~a_2xApk!G*$KGsTGeDpnu zJ7;5`R9#3hfm?fz-dwzIr1|_QAM3CTAAK+4F6j?{T=D3sFmD~k>CIJFMVb?z`&bV= z@zM7tZofjyQ+1XdjLUWC)L3tBB}bYI=JBtkH*JG0B{%`JY2 zG|#H;YrW_1tM5bHH+eq+Zl8l{n?3(C%v>>lU9*3EU#nlVuf8vF8=g%8?nq%S+T0B@ zd)2IK?$X8Anzy~Lz8`Vh3`(w=XImFjmufMOpKXEHRIS%*M zhjID66-o{>$F{3$t~bHgx^%R!egJVN2b@gR#m{409{bMk2{SkBQP-S2-Pij4L|^?t z;x;m#0=Y{CxdV2FnOF9%Yu=;FX^orWs~<$%7b>}Y4WZlyAUE{Am-Q*g9ZcL+&py`I z8}w}f`kwutmvs&3JA}BYJr7xR8RY~WDuErgf*tz*=w@xha+}R7 zr#Clz5oxx6;$>Z0#aBOqxMSylpZRTPTyBRS8tTo5Ga}7v7kOE)`uOTc68EBRCUBn! z++hiNv-g@vbKfCe)_hNW^rMJ-yj(xdk}uN1Anwy{wf_`sha!cX>>M zR9#Y#u!i>C0Dbk5=BbsvtR=Sj=*JMZYM&~gLleg3c9`HBZZ6;zY5wuw99G>FAAJIG zJ1$=VbJ0!U9*zt*H@g;L9)356_3utT`mw~__x)vvJBQg^aDD&j7jEvgC&FAPEr-=N z(nmjzxW8511o5n~z%8~k+&p($g!$;k9M+-vIa=7_qmk4t} zVh-!Aci#F5#Erk57r6O__?zQOxcR0r!u(=z4(qe$-uj8eJ>75%#Ii?1T;KQ%?yX9M zc|_+N)*ZLJ^^=IZW>#L{iuug~`C>rP2=k-nIjk`ky!Dfbo7fIoR^(N$@DZ~Y!!x?{F^V?KlU@n}blFRL|8RWJEx!*#5L%Gw4+b|n_`$2v)gTB*= zdq%?!o4^iD!45AWzwH7$%ph+6Z0tMy2XE^SVBbXI{-v5X9;0yHPQbkFd+%+%4fAFp z?i-aq@Rv%9fIrLwe=wEtu@(V;m`U9IDnH|PKtJmZezvNv5A(BG#Ldos-*oX|{yUqv zRaEPO>&w^0sA)cIUCbfwGL7}NAJ$tvSZ_IY_*jd>dYen!W4Ml2bPqw9+#jyeI-YaJ zhpppz#66!)e0cVQ4~q};i91deceuVh?v%;vYrO(-X900DRPl^+F`hMmcqRq?q@u2Vt#u9a#s-d!qboQ zTS3Tg^&r2=kl&VozAK4aXB_1DSS7!4`!=LJ-xTs&4A@~6ac%c-|DfbI&W(fpLk`Gq zx9)gZ^MHL<6E`Xp^IO-0YCq%qk{u_#tQBG2))05`4$N!6`Hjy7-=Do5!<2oi}@`c_LHk&KRLaUm$d@yCpQw;?{|Or-d@RX zTrS_Ip8Y2W+ox_K?&|#BU^DIgZ^@(?`Cx&8dMi@0-Awpl~$Z`q64xZZH?zRPnurQ?<9@+Y789KZ3` zg4Ep}aQAq?-Rl8&p9kDeJmBspuI}gKur9^D1`NSrkt>{=R{)=nKZPE9K7QBzBW|QV zfAq$?iSpDPUxj$@Fj)_9?%@v*8x*-bp5<$tD`wA$>2kZlXG8xfWwd_Ax&1%SR7?K6mI{NI$U4Qty4QaMm{i7u2ydjoi@M9@)2i6aA<<3Z1AG2ZR zIJxoZl+>0 z?~c4rz5C8+g$EFY`}6USxG)5VMPB~ZzEU`EhoQ&jO(mDl#SlfVxzKlWL+`&c>c8Mz z4Sj<_-`TmQnol+;76$t2k8rMr9cF?Z*3BGeUNF5^SeG_>{ZY=;EF)~9hUpmI2${Y$~T^_o50JR0WhctRb0IuO{s^-uZ8AHGri!8~Bp*3<@%5HyKfB&%qWR?IQ>l%IMdR+XddI#rLJp2(i z4A#Y_yHM;RFt1g&!=yjPx!J5Yps?Rtj&m;l13R2{fC{*B|2B?(CHNa(04r9bT00bvrcVr=uqQ z3F5AJb34p$_Ruioa^Jb_|57>wFKX7Ub1)=)ze#_RxOvUR^?qSUX*X{n=@tfa+Cfvannl`*T+X`%bjqjU<%4T zL);F}Z-vG87xleP`X#d+95-_KGJm*0+)ug= zO5r+i8%q>_XG8q;f%tooxCtkEq`KZ)F~xu71c<+XLj1i%+;-1zrIy}^HC~+hj#1Wy zT#@4MSHwM9s<_p4E*`*oYp068mx&8=Y;~REq7;9JDC^jIg}AR%;5)t0G0e}n9vFX* zL;S4*@fYHQ^(t{swr!iLoBJ2@Up^O;DE>Bs_zQ8z`ZaOSv~3&4xm<2-C7#K@K>W>F zI?8&@se_*Dz~v64`1_LL?{(s8`7aE?;f%jGpoen|_x6!o9)Bf@zc-0{RzqLc_&ibk*CtlO#TRkwC5%vB#ND*9S*%X?2{fIB8(Km57q)2rUwjeQVlIQX2lrQ& zupD7|!U}{H2`dr$G1TcQ6Z#WYA*@PRjWB?)I$j*T5bgu#R% zgrS5GRoDR$jve8I5rmP1bqS*g4TMHQ6QM*HO&CK6PZ8{hC9FqSpRfU8L&8RcjR~6& zHYIFE*qpEhVN1eRgslnN5XKRRKjV5(+Ot~CK6f*XA;gLoJ}}~p~XCxa30}&!UYU6qdC`UiD)@WUCR|({d6whZ5HXxh+;SGr$Hw zwm+y|_hJ2{bnk4qI|n~8{0rQ#`yQ)%;$pbXhqxa;?2Cm{2tiJLd*p9!d=1%0`51DXGN`i^0zIQz_kb!e=^!WG9CbKjjOh(YaPPuxrs~n z#&p094az^VsHCYsa7!NlCu(H(QT9B7T=B25e!dWE(gFA4GCxC?h8yj9iL2b3s6+Uv z5vD2d;zXoZV?%rIWA=Q+^v*#DMVkNgu_4b$w z0r&gu3k^TO|6aQQab4#P@2}Z0yD1!AVoB(_#UPtYI0_P1%f96vUNyCPn{N*u&v1Np#u!~&eajxn1@216nC(2EpUo`CBUEfiJ zxQZQg%nqFUa#RlK{9lQ3*!tUscFjc{*mF<>Q0Vg#C@;$ z8T1r=kzeJ?Mlf%m!n~CuuG(gtn?nB36#T&e z{!rdUF4~s23gl-c$j>Sem+Z^zz~`=s%72f8|5hX}`HrA3Ul&hkT~rdd;=J+oRtVNx zC0K8M#MN5I5wwo$(mJk8T)u|54N<6d%q*eCQ1E!JoLaHdFY0As(i4HK zM7f&rtQN(ysxDlV$J;B4llLJ`&W1Qyjkq*#Li~-R_?rXbZ(fMM0iwRpbIRp${Q<=F zV-VM?i`)=3w>ssE1CTF1K)whhF1MMQn}_mHk)Hx06NhhS6>+o5Ss(@u=YvU2=sCHT zAhq0?BzHOFx8{)FY7v*_LeRGf>6;Gv-UoeaXT#k_`RyyRLmlFh?+9|ckbU!jeT#v8 zK|z(i%1ixR=YMG49>TmWhj|MYxMFT`&2Ml~CYSCl+x!NDY8`~?jjs6(79-!9=0`gk~ap~Tmr}!lDTTpx$2l?#;#D_@Y@;J%4 zh?P`v=MLnzy2Pb*kr{uH>l)8sqolT(ps!h#-#&vlX&~-@#oxmae~qGCHWxgu*QdB1 zOL5&q-2ciKnBOGg(!6EHRCONW`7N5bihad6>6+hS1i8>r#fOva3rGVY7v>!BlcC<> zcn1U|mG5K-HXB(#pR@s?kmtLvdu-6P?Bb|L zTy-qLAG49a?MhB*HgNkazHfN3s;#5Gpo31BNb;R;Y8{5S2I9(NNGq;c|T+cKqJd7xqT+fyWK&=SDah333%3xZS$nzG*53d#*+$ zQw`TY)NnKwvbp=Ng;^w6NB)>lLZ?E~nG#2)KYogX0 zW_K&>Xe!Euo^uT~EU?>D7WR|vw=XcfAL`}6XKakArrd|bW*?{Ke*_bqyi8 zY;6TDbX59c5Bf6xm%oVX%x`QgGtcjic@K{&7WwiEFUD;T!%nUR(vouxoxFO3>5y7$ zPThH7xojPXtJp!Qh>Q9%okuM(J_mgpj|z&KI4srHQQ#^SarwRNd;ijy2HZb`S4Xv4 zQqtZ@;EL6_Vnzg-MgezC_}5Vt-gdNi7W7TdtS*SMHy-F_$`9Nnmvb2k{IJO0Mc`V5 zN{>%X^GqwicYd-581gLo)ZUf2ivPwj|K&0D$i8i+58%K3i!?HPy5hXOn;_TutcN;W z9dyLh1-NTg_BB*L_T1iGkn5MCp11GXeP!AW>#b^@M8lL3UXC6DSF9A$ufY@3cd(8# zsxCE1JqtT}3OZy6awALpWhxEaM@2UozFk+r(TljQ{)=(_f*`5@Xrb0Y3PD?TTx*)<4FX-U31KwlfTBW2T5L16UZ8yjTVjX>4xN1A> zTTxMZ3vvC}@23rQ#x`^GC9a~cUuGV{&kX;&suTy@ORp{&4zFwL=qJh*VqeaBH6{6f ziSnya*A3sa>Eh@w$X&p43)kad`yi<`a7!+@V^}e=r(=L97kbLNKszkD9U|of?%|~S z218oBW1zrwR>Z~6Jh%`lz4!y{aQA^B$M=04g9NTKuA|(M=R+hPkQ=h@zM;#Wc*kJk zDs~X(_{4)cQg`6~^S|4M@W(wILx`*7`6OmD^j~bbz73R~0r%MPuMJn-;wFbsS4oqdcT z*CMR9{1?`kq9K+Tu0|PN*~;&RqEV(KME`S{A4f^=?;^ZK9yB7^|zcDaihSWyh)Hy53j9 zZIcAKI(Rg3%5^lF23uZ>9CEOHUGK(8>5~PnSP{4Iy(zGjw#X$fl#84-dONF#>&#j3 zL6uzWAs7FPxo|3=lPgxl-E>!xdky4P1G&>guJByAjP!l@S^2uh8YQJqC$8dW;xnY4 z>>!gJW(aa)1^YfG`*r~P=G>iROBA@4&+*=H&aiz)^L7#Dtv1Y?Md0cLf9OR1P!#;3 zBKX5h;*!3C{|1wv4Fo@X1%5V5;KpbA4(h`FHwFB+9{BHUfh+n$KGnMT8P>%dL0=1t z5B&aI*V|k{uE-thvX18oaur`kx!8Dos0{I86~u@60ymc3n`_+JN^xfaaVeg$dE;~8 z8qXFAa>Y3LgyQ5nh?8cBlZyndUuN7veG5|jEe`Q_B*fpv#MO%H-VoQHLR_~&T>l*6 z`V!(QbNncj+W^ruUn~`LC>+MQcz^0V)D7~`GJ%_Yep@bZ6}c!AZM?g8sPrCk;iZfR zhH%K6D+I2X3)@A7NKtTag+6;=us}XuDR4&%&xI$a1W7A_TXgIL!*R&-s|4-_G0(rP zCHX*pYxv`R!xY#*tQNRpzSw^=P+AGx$uI92zE5c8SVLUJz8TDS&~CVodKFSlstNm@ zz~sAzL9pLhOI-4uOfK@}Z~UaIz>PeA+pre)QR@U9ME|Yws+=?v@@C7nHw|07YC6^n zT+w%`bt@@_L*8s$@tR>0?E5wd+}BJ8?!P~lEiC;6+%g3(8y@y3?AR!9#dUnVY946^ zio-+i(K6Mju6+8F|_x5&R4k-?D?1#N44Lcmq?VAN|tWcqT#hN#!e}Eft&t_;3 z`|2&kRcz+0;ETTVzS}pZO^}bPN2M5^Ed12IRp2@+;^O@+$~b2Vf*kv-!5%{ycn;Vm zaG?WpfDO5mLX%Bj05`b7I>S3SgueLM19-eC3A#gK<=d9RO`AqPCd6diE%55kVk;}GI;6jJ=Rgm>%{4eIW zU4WS1&}LU(?M=md;{39QPTCi}nk@fsNzdbfg=VrBaoy$a@j&ig54ih0;C|u(cRz9I zxm(z4zz`f3Iqw)Bf3(@B&~xqy*jT1NOi8#UB|lFzKVQAy-n_2Wbbz?zlbMxZ(Z=6@ z_$qq#&KYLEM}-|#t9>SYCUT+Y-0!4qY#P(?@)UD{pMo79c2ti(NL=;z1bl7A^jjDc zQfGpB_R%Ouj%@>?4{30@>{G^dF{L8MnFrS~I0hA;8Vwr;;oj8#@Z!nRm~)H9o4daV zbjrOQt?|Fr%O`_aUJXjtS~ayx7(6Eh{>bo2F&)9g2j z9FQQPWvN5Ly~WX91L38|7qe{zAEcVBBA4xVoO-|@%-jBZy3#mrhea-qW%~N#$BUzX z9SFZQ*KQU1x~0kb1#v0<3io#TaG97HWv0uG$9xz1$rgk4h`@!8O78IqgJWLDO_mo; zsTtPuR;2YPano=T-c~?;nuWlxP>;ai`o3yIJwf(9$`;M>aFS7 zaE~W1j5)k=f_&t+W?{RogGuP4#mQ1z)R8gY`CrJT#hbi zogoj=uMf?6-e`4b=zzHm+lGy|q&Y9(kN^8_4N3mYWIZNwHP;(ZSd2O@a-rv(x6xe+ z!*<9b-)o)If^&?44c8{cU$!sdK3uu)Z}!{}tB*eHXt>d|uswsg>fiOa?ET$-kXk;0 z7jbL1v^_kYM>;`VTF2maP8~ip=o?*db)xy)wX?R#{_~`h#8u|lB5f4I za^$g(d5|WZa?t_ha(%lNI}p9i7yeHK?MvDdZeEa16PLb=2X}Vr@D$|!402C_+ysz& zhPY%0y_&nCp`!13(03B(dsg6DgdA{)?9dPF@Br-arN|BC`l8N}WZ(T@-*3Ub=ZLH2 z>o5d|^EvB0^t56s%J=Wmhs|-Jnm%lfFNoaCy(e=22l02o4^WY|_8eOR#NUe|7q6Ka ztC!`t9KCY)4D+j>r`!7ld?sBYu3}${V6(8zO=BXiPBGtV^rv0Ft9tZT#3g@VT=a94 zzXjs&b%?(Uy4G;4hWLA#xb)i$^9Q~z&Qkns4e@s%#NR8#rFmmqu5;SAOJnBG9&i3C zu#V%)@*|?Jid^V9{b645!7#Ne}E!(9llGKBdw-~A{Tm2-+>PHF_g0Si!b8Ns-;xKZ8v1lU{(?rM=eVG z=#wy0?34eOmBh7}OQ7OliIRk+2um~6>BI4R*j1WJfq*1Ysm$UBW0r z1EG=7L?{tP6UGoSM}YHK*0-4J5!NScK-iF>PS=RAF<}$Jri9H1n-jJmY)ROPur*;D z!Z?N&b6di8gzX7CFx2Tf5_Tf&OxT5?#oU#!8)0|C9t?H5o`k&!dlSYJ_95&`*pIM3 z;Q+#cgo6kN6AmF9N;r&gIN=Dwk%XfNM-z@AOduRfIF4{U;RM2ogp&v-6HXzVN;r+7 z#XOyG24Nzhg`rM2lW-Q{Y{EH&a|!1W&L>_JIf*@Kd}a(1OkT}tB0?vxBHO!t;uX;qh! zxUvT&apmkv!Mc>hl|3klD|=89S9YglU`et=cBKeiO5$d#uS-eXZ0+Du5?9WyB%@17 zTsgaWb18|d=?__y#Ld>vTuS1~S|u;DD2Xe3P!d_JIfxAI#}T5s9Obt#Ffsc#k~ zaW(T>7A0{t?VCkOT+MmQq9m?c`7MO(pyg*-l*EsSB#LYJTx|GC~Jt&DQdr%Tr&MptRl*Dx_zu|Ko`h!+U z+(Mr#rR2LqNn9)?Zzir*N!%0ZK~fX=<<9F5pJXiI8%tcRlDG$~HKb|4%}7#8zT-0_ z>Yy%(%YNa5Z+p7h{H3$N-FKm2@>P&qpSW5jaVuXbBUON31oa(-lDM)~N!-nTg(M4b z<(fiCTv=Tbm+!;PFTA85f!o_JAbGE|B(AJg68H8mKbqRYH_{>h1}DF9mc*5{O5&F4 zaoKbjxR)jvlMPVj0H2M~4q7E~=lqe(-elYp(-kbxBITjUwGup(L)X zRTB5b?7XZb?wT)!lDM*FN!**`;Hwae+{>Dqzso?Ic~BBp_MjxL>_JIf*@Kd}vIiw`We-Z?${v)&l|3klD|=89SN5PJ zuIxccTzQH6C2?gBO5(~Ml*E-iD2Xe3P!d=6pd_yBK}lTMgOa$iJ0%10yE$BM9+bqD zJt&DQt4k;HSe->lTsgavj4mZ{Wp$}XUdksSB z#1-Ns-*aVA5;xoU>rxU|i0k+lgxInui7R_h5?A)1B(7We4Szeq_2xlIT-k$?xUvT& zab*um;>sSB#FafLi7R_h5?A)1B(Cg1NnF{3lDM)5C2?gBO5(~Ml*E-iD2Xe3P!d=6 zpd_yBK}lTMgOa$i2PJXc%5V5vAg(v9lDIGOoDQXuxG|TXtheIth3<0kH$`{3_`9RK zT>Nd)UG66yaQ728yOOy6=jJWtZ{ng3I*pRJ;Z*u_l2Q^^e}KzXmBi)y>grIEaTk;n z9ifzD)PKgg8YOYZDkX8vrJy7umMT5Sxf&&LsU)M>tdzvnAL3j<<#7IX>ss3Hb0DyL z(O9logC2{r1oSRK4*oI0;MtutBYLu8YQHj}CP?FKBbd)}obF(O2Tk-7-^J^%{ zh^1?-oSS_~-1YoTTy}3NxqL2WLa9fPD@Q9O8QGh-jH{t<9V+2_S}BRk-o#~G4Le{- z#`RDdI1x%RVrk%`Twe|Q1}P)hmwrtp;YNH&UL>et`N`o{bf-SSN5PJuIxccT-k$?xUvT&ab>NNqFI#0l|3kl zD|=89SN5PJuIxccT+Mld>4(Glw%>W^G5=-%&c@7qj@$mWY7ugwByQ%LxX4wP#N|GD zk4k?Y*v?9l>o1aAt&*ZesHF2~h`->!`b)%Bmn!8tV5w**Np3Dr@%Jm@YL&$OmP%0b z_bw`m&E1z@=~x^k{nCHeob7hlDItn{zmclno|eO z(zO_W-$MMo3Gw$jakcyxhTvc&aasJm0X>{It&+IIsMIdT-v?0Y{3da=O5%o63Exu` ze{T_2T@shuY%0ayi4=ct6IZJwZf&qHmVB?Ql*F~(A+FZExt21%OI)pzxa#-|C2_6y zh^ysiy!5hNDT!;nPuy($SFQ%}7fb3tAg;P3F82omm5Ppq_?r*n??d7O(BaH2%0D>Q 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 ZXpY6Y*b3|77Oab}F$*L6x^P}^{{uEY)gk}@ diff --git a/games/devtest/mods/testformspec/models/testformspec_chest.obj b/games/devtest/mods/testformspec/models/testformspec_chest.obj deleted file mode 100644 index 72ba175..0000000 --- a/games/devtest/mods/testformspec/models/testformspec_chest.obj +++ /dev/null @@ -1,79 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' -# www.blender.org -o Top_Cube.002_None_Top_Cube.002_None_bottom -v -0.500000 0.408471 0.720970 -v -0.500000 1.115578 0.013863 -v -0.500000 0.894607 -0.207108 -v -0.500000 0.187501 0.499999 -v 0.500000 1.115578 0.013863 -v 0.500000 0.408471 0.720970 -v 0.500000 0.187501 0.499999 -v 0.500000 0.894607 -0.207108 -v -0.500000 0.187500 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 -0.500000 0.500000 -v 0.500000 0.187500 -0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 -0.500000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 1.0000 0.6875 -vt 0.0000 0.6875 -vt 1.0000 1.0000 -vt 0.0000 0.6875 -vt 1.0000 0.6875 -vt 1.0000 0.6875 -vt 1.0000 0.0000 -vt 0.0000 0.0000 -vt 1.0000 0.6875 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 1.0000 0.6875 -vt 1.0000 0.0000 -vt 0.0000 1.0000 -vt 0.0000 0.6875 -vt 0.0000 0.6875 -vt 0.0000 0.0000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vn 0.0000 0.7071 0.7071 -vn -0.0000 -1.0000 -0.0000 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 -0.0000 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.0000 1.0000 -vn -0.0000 0.7071 -0.7071 -vn -0.0000 0.0000 -1.0000 -vn -0.0000 -0.7071 -0.7071 -vn -0.0000 1.0000 -0.0000 -g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top -s off -f 6/1/1 5/2/1 2/3/1 1/4/1 -g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom -f 11/5/2 10/6/2 14/7/2 13/8/2 -g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left -f 1/9/3 2/10/3 3/11/3 4/12/3 -f 5/13/4 6/1/4 7/14/4 8/15/4 -f 4/12/3 9/16/3 10/17/3 11/18/3 -f 12/19/4 7/14/4 13/8/4 14/20/4 -g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back -f 6/21/5 1/9/5 4/12/5 7/22/5 -f 7/22/6 4/12/6 11/18/6 13/23/6 -g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front -f 2/10/7 5/24/7 8/25/7 3/11/7 -f 9/16/8 12/26/8 14/27/8 10/17/8 -g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside -f 4/28/9 3/29/9 8/30/9 7/31/9 -f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/games/devtest/mods/testformspec/textures/default_chest_front.png b/games/devtest/mods/testformspec/textures/default_chest_front.png deleted file mode 100644 index 85227d8fd636ace9592070a2f7e86df531dc03a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmV;Y0a*TtP)i&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0JKR&K~xyiWzI#i!!Qs<(JxtGvCM3T^TSO0-&i_h z-{GmQuJfE_l-{oE`T}5=5$C4V3&q&H0!WvEqLgLXY__8{K&+!MG8kioLN@@6 zN>kDk@*aBGOD_RVl&R|knQ6>5Cjg{HdNti|CKb)I1AvErQM3I&FVvh>0Bdbfh?>Um zAmA$iTLe&1C`R-A2rxJ}fDLU}me>LiC%WV=gmA9K@ef4uc|E)2k#quJ)ECCe4HTG& R7=Qo(002ovPDHLkV1m!~wG03N diff --git a/games/devtest/mods/testformspec/textures/default_chest_inside.png b/games/devtest/mods/testformspec/textures/default_chest_inside.png deleted file mode 100644 index 5f7b6b13270890618c6a6332eee1c6c721b91f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2~3yyw0Buq;x%9978NlCvUkPo}j=vVadU` z_{Ppg7lT!aA;@D3{h6xK;WWK5B?*(dP@O1TaS?83{1OQEB B9=-qo diff --git a/games/devtest/mods/testformspec/textures/default_chest_side.png b/games/devtest/mods/testformspec/textures/default_chest_side.png deleted file mode 100644 index 44a65a43d3c3f2ba44bceb519a0696e1ba441800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G diff --git a/games/devtest/mods/testformspec/textures/default_chest_top.png b/games/devtest/mods/testformspec/textures/default_chest_top.png deleted file mode 100644 index f4a92ee07edb9c3b6b8e33320082ca222656c252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 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 S>?lOK2*q;saw%IHnD8H*3=CBO diff --git a/games/devtest/mods/testformspec/textures/testformspec_animation.jpg b/games/devtest/mods/testformspec/textures/testformspec_animation.jpg deleted file mode 100644 index b98ca267772348b17ca5210640ebf789ae70c7c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4376 zcmbVP3p|ur8-L!pn8C;lL&D}-35iKa7m`bC%AnO<$fd#*+HPvJrHftLcCl9Nt|;BM zR@P#>P8VytS*$JOtBJmi#4k#uG4p=U`wnS;zpdT}j0rXnhysvI25>N98-hu%GY~rw4A8-O0g?!@ z5a&3gR3v*8rsM}_KmWiWbCH9Sql1$OxgAB0?v5gNCs%VP7k9@A?#`1ay#$Mv@kBXd z08w-;A&`a zG}v4Yhoh;<)#3?tc-q>$5qkQ%!ViqiMt)#yYHDunFvi@{-pbU}#&xW{qm#3o;uOmcD(*&RrRM_wCR6GW)BX1Nn!K6dXNv{KUy0ihnFAE&J*0 zxvSU8f3EoD`i+~v)&73xZe4xDy{6_z|NY}}OY4)iuIDehU-tCA>U&N3MPO0~$6xv- zK))C)7L&!H{2~}@k(dG&+rmjhZ@QQhv0C3!w1q45+LKpwMbm0RaHm0JQjM0OwR6*` zF3L69vw!B;C;yjcZyX!)>mKl!1SXFu01xPWZIhp-WmEXYw9);6B&265vq{j~-A=-p z^|I$L9zT;8E7L1nHoiQhTi9BdOF~R|-vMbyEeR{bs)Zo-p^0cAL4WfI>D3C=EfRLg zdZhJJA$GZNT@}6DCy9qgp%)CwZJAngC;vveQ%{I zTB6v9U}85rl>|kg^!8~IBvOTMnr=h3DkfKvf}3~Ln<5f!qy34wiUpU_4ly!pXwpUB zmKXMA$vU2q5LcHLChrd7TsFXe{-oCi@-rxULAj|fZCXSEx>bHyF{48z>A%po&?TOP zh~jTl_idQf{~)Y|9*1;gt%YfJauS-3%G$&v+{6s5IHY@s^3bkIHM$=SR_8@uI*^wR zIxi(uUJ5<))25(o_OLUyiQOl5AnOR}u705-4vit->HqZog>YDufJNh37K*DoE8=VaXOB`W!Uld#T!tydDxLJ5C>T zk)CPz6^nO2(TY}Vc)ztjrqY_UO%$}I1`?K1sw(9&sbb}4@x4zy&BANw8~o1{{@pFF z>AZ#UwU>0v!T821x89`U>$+Jz|j#%T?E6Co9i|)xGRw1C?B15J4pr53`qGLh&%vNM%%l z8go0oS1S|}R7No+>QG9Q>QFAeK!viD4rNx$%U-3BQ0H{Qcx9lx4`0HL5=`mf`v&50 zzy|>*4^?gW3p;6}TvcR(F)z2rsChy=Czx9^w9(u}tA1FAg=#b3bVHR~4sM?p34P-OpjQ@-o;X%Q3 zeEnznU>AcO$f5YCgk+W@Ktf_lQm~(wIewvVGly z+@%{Ms2xY0^%o59Thdt;og9VjfH^XGMy*OpLA(^P%i5Gx6#fdaFe)x$8RAoj?UT?z z#P!sAq#CzVIF`m#=Lf>1(BK*98`bie$G(Ll-@;LGNeRf~j6BxM5)$!z#ymA%Mq#Q= zv`&a$gSOFwYHN7WiE~46wnj1qKk$b@2m*76gf*}n;vogb;hcyo$qo^@8~_*{i)Sx-hu>6}`zCJhL1x!9F7K;r^VxGYiVoi4AbN53=<5~*5(`X1^Pk*0|TD!a3e#Zk)F^%NO!$V zlwq+o*=$Xrj<$~QUk~yscD>*Ud?tYn-(c5kgoTfd)LVlIYz;2bPN0YhcF0t(ImnL@W)Tdwh7eGai|YiNae0y77%yAx4-Xt~ z-mu{FSmAM&?fXPR;IJQm@-f zStWSubXt!meKxA~AUN+~U<@+YsM~l<#h{^7n=jA<3rl^c=|U@!mpC|ry?Vf64G+c% zNy5pz^vByL{ro6Cv^f0Yb!PNrvoUSgSfOnpSDdu$MeFt)l$h)*{m%O4gt;~AqB7?H z#x6c=H7&5rt8a z>?`7n7ZN@vVM^hnkYBeO?zP>PZfmjAYs@+QG3-%prtI3pFuC~}lUo1TRTJ+P966Qo zt@pzEikw`#`|X?OsT%x5?1D9xZYP3E-3tWI8gd`5mJef_J(jWUyjoyJ@5q(laswas7u$8P(8^6ld;+h34Bl~-0AIgvN>we!opp2p7C z8YW+n-gxBDvZ<`=SofMNVNU-!z5TaTjeZ5rNiSv9Cr>Ro7~OHB_Hyo(=5^ovvZoL; z`2imj^rw2l!o{Cj;?-OB4Azr}MT$*eK0l~hr+VqDnTt1UIdsl^9%vXP1ZrnK^KKZi zZ+mF9+uiQPSvf&xs(ec9UJ;jOhgiDCr{64{WLha8ypA3r+@P7CaZ!KSu8#xwb<;B) zGFd`S{SQewg7eE9<`!LdG`ib%WjdsOI)3aPlTzQNg}iMm$7;HR;f4{c%OR`hd-LZN zod2n9Qrm|vhGDN;Li8?~KbC989hIVu^ludUnc?gCv-Zxkeoui?70my;3Z@y1F);La zbI%BY1vrU2-$aF<%<}%!%ds}$mQ~^u!!0~32HW2Nj_%_dSTlotJjb3YFIWh}W_&$g zx7;{sc4UOWi@`Is5U)$UZ(n03{18_USeE5E3? zEUm&hUu>(-&EP{^6L;s>yld`@yg%a-*JkgX99{jbtE7{CujtF$Q#U^BWIuC#G;_lo Gvf+Ou20{4% diff --git a/games/devtest/mods/testformspec/textures/testformspec_animation.png b/games/devtest/mods/testformspec/textures/testformspec_animation.png deleted file mode 100644 index b972e5dbbb6e6bfa4af0f88c5fd0b334f318672c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testformspec/textures/testformspec_bg.png b/games/devtest/mods/testformspec/textures/testformspec_bg.png deleted file mode 100644 index cd1e50900354b48dfeadd44e74fb2926399e96b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|%APKcAr*|tGpzUaR!o^Kd!Auo phfCwXh0MznLk_QC<8ZZMVsJcTmus{sG#03w!PC{xWt~$(69C7B7{CAk diff --git a/games/devtest/mods/testformspec/textures/testformspec_bg_9slice.png b/games/devtest/mods/testformspec/textures/testformspec_bg_9slice.png deleted file mode 100644 index 34433ac82a89114e0be99fd1f2a9bd1bfdfd0a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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@ diff --git a/games/devtest/mods/testformspec/textures/testformspec_bg_pressed.png b/games/devtest/mods/testformspec/textures/testformspec_bg_pressed.png deleted file mode 100644 index 2fb5fc21ecd7d0ac75f0bb293d91269c4fdc33f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|N}eu`Ar*|t1*PAV2uX*6~`Is8-X;*&E0SAO>&cvke%!y3xOmA1X`so?O2^U+G=e9kx~mtSV|M1>{}P0 z6tr}4X|WZxTJ;a`g>NiW*4CH)5y$g6w}*Qt8RupuDVh1s@A;i`o`-wBXM29k$@kY+ zT_PRjMY1?qD2r2t(os7`&f#QNIw0MOPIVqq za1wcI%A7}z-ffUgi-4)m>>tkJ+(1o8hIKux4lh^d-C3N67}m(qk7R9TP5{mkNiv~d zqu^LlRbo!w{QYUUaruZ`d*=oD_|4t&@ugjc>z5D9tv|jpV*+rFNRkO(X-VA0Xj9Cb zobyHh5q%uR>B%7djez%$$@O;+$kjK;4FCS^e!20xqjKvHFVFY~lKMD`)045HF?J6K zNKGZ6SEEk`7y(yKYqXCz0UG_E%fH^(i3|c}+5^adDFm!+ipywY?A{PSjkhas7RPx) z2v7P08F1}a6Y|NgC*<1Od*$j|d$b((%FXwWPbq=?r7-nxpvGz)XGwdW5WqL3Lz+Iy@oQ-#Y|IeJz25a`o-;Ss@^&$$6t=63`cDj9)wfbbbf`IGhV6 z!KWXcmm43PG~E2)6d?5tw`YL>IzI&9EMz!%Up5|8p&r+nY%QSVVXk@g+{SR+G+4YurIFK2KT?|wGG)(K$ka%!BY*pKbXLnPL4Qb7otX5P%H$yXk0hev9LF=aJ?@LzHoDq#@hw zeG(u;hYhx#8JxjcoS8WrLJUrTznjkHJfNw4`j_)^`%h;)JxOtXD0S`xIFO;k#_ie5 z8JxwL4$lrR70)tsM9h$TZT0lz^1~1Pf8~n~8@G2kXZg7}=}px82Ww>Lyvv&d|9tl( zPUJeQmz)#AUuWlkUB(&_x?DooYiD@Pdv@`Js2sSC6!w~&wT|vJ&)J>{5S0sLMgY<9 zruErhU!M|foV@erv;OWthHgq$aE3Qk?+KKMmyQD&xuKnY>R&;7gnd5ncjJ1dl#zF9DzH{McEY z>72>g{uRkY@aVHfW(4@BEjK!!-`P3-Do>5HkwC-&Yh<}Lx!^22le0DebBk|y#H@USFm zzT=Sx)5?JMT`{6fLsVE(g$T=vt``#0_;lFTJ$sVUH<6P5{TX!ZNU$&O`H;9&NgI8= zN`_CT-Fbh`oPcQMH*nrah*v)%!C;WcTLzSrl;r&fM$T4B{gWZmpYHA+ zo5NE3eZ6!&6OsBKXXJHCM(@59WnuC~PXu`yNiACw1eucyG+2 zT=}q$zim-<{1{-33>`Muvd8xJ9!;8j;8dA(?ADv#p;GDDr#M(DUC$?^=fzTK*rZPH z(DTQXz}-=Mb{|mUp3R)oxH%+?$0E|YJu1CNN`*eexq~Mw@)JN57X%tI&X<49(!aF! zyEH)00waLlkXZO_D~-(hQOL0<)cznSjXw$5vteV1Xqyww>mz_QGIY7N>?NXF|8a}l zfYx{SZgu{JQp$t~T4ZY;4_JnD?o3z-4V_9;LY4_Nj|HUesi4&TFl5uAWph;e52Q@L z@?3R(0*I!kH<5P&a1?SNg=i;g9z||8j7l0Lqq60>s71A7Ph3XMr=?k=OEjA|M1_tG zSR+G+4YurIFA<|T4!&Gw5nFMwQhIf~^&L-|UFUe52;2VEmln!HSL$W$TeY(MOa&3Q z3~1AoA3B$ofulMaPo!)_uKi67cKHb)jd2tQW7_oM8fBcrQOJP+);JF!3VYTNK>g9Z zd!AQE#uBpV$r9?4PED5wtdXI^23z*9*W_*6tvPDVCv6(^?9J#~l^`;u{^<~7)FQh4 zSehq#GKmZzGZ?4Ht+(_}B;9U01gs&YamYc0y~h1Qp+cnCRqlh=JO`#!CUPc8vOpD05N8Niy+=z5$-?zctinwd`2h%QlW z-4gX^0oKUSVS_Du*vpNOu5FpJ;!LGQa`_3nP0}N{a&!H*i|t-m zcubb;FLk@D{pm7UyfupRQ@%*~;KD(lGF-HB3BYmmpZ)FPGzdsRK(@wXmFooryr^G;Xx0dc=tuvz%!14p<{Y=NZ8s_FBqz?n=1apWGL)C)xm~Cx3b) z=Z?WuJC^`H$^AV)0VV2WFuBs4b`%s8$btn6jDV8Fu-*;UxK7vf1tqOQvmmw7qB!(g z+M{Rn+&Q5WL7nCuuttW?Bg`K5c9H@6repva!~MZ;lamQhCoib(q<_WUmEXGZ5})PM zCx8!~qM{L|M~~n6 z0Wt`19Wt_lHDJx&CGq>DKQUJZllRF;`In?OK37^pbEPXfS3WtM0IZRr!vFxgk;~+!m1FZS~2?+7e@Vo^44=1Z?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= diff --git a/games/devtest/mods/testformspec/textures/testformspec_node.png b/games/devtest/mods/testformspec/textures/testformspec_node.png deleted file mode 100644 index c107f28a31020c89606f4e8b7882bac829aed00e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testformspec/textures/testformspec_pressed.png b/games/devtest/mods/testformspec/textures/testformspec_pressed.png deleted file mode 100644 index 45c504f275aa726991eb2b327792aa2855187d37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testhud/init.lua b/games/devtest/mods/testhud/init.lua deleted file mode 100644 index 2fa12fd..0000000 --- a/games/devtest/mods/testhud/init.lua +++ /dev/null @@ -1,81 +0,0 @@ -local player_huds = {} - -local states = { - {0, "Normal font"}, - {1, "Bold font"}, - {2, "Italic font"}, - {3, "Bold and italic font"}, - {4, "Monospace font"}, - {5, "Bold and monospace font"}, - {7, "ZOMG all the font styles"}, -} - - -local default_def = { - hud_elem_type = "text", - position = {x = 0.5, y = 0.5}, - scale = {x = 2, y = 2}, - alignment = { x = 0, y = 0 }, -} - -local function add_hud(player, state) - local def = table.copy(default_def) - local statetbl = states[state] - def.offset = {x = 0, y = 32 * state} - def.style = statetbl[1] - def.text = statetbl[2] - return player:hud_add(def) -end - -minetest.register_on_leaveplayer(function(player) - player_huds[player:get_player_name()] = nil -end) - -local etime = 0 -local state = 0 - -minetest.register_globalstep(function(dtime) - etime = etime + dtime - if etime < 1 then - return - end - etime = 0 - for _, player in ipairs(minetest.get_connected_players()) do - local huds = player_huds[player:get_player_name()] - if huds then - for i, hud_id in ipairs(huds) do - local statetbl = states[(state + i) % #states + 1] - player:hud_change(hud_id, "style", statetbl[1]) - player:hud_change(hud_id, "text", statetbl[2]) - end - end - end - state = state + 1 -end) - -minetest.register_chatcommand("hudfonts", { - params = "", - description = "Show/Hide some text on the HUD with various font options", - func = function(name, param) - local player = minetest.get_player_by_name(name) - local param = tonumber(param) or 0 - param = math.min(math.max(param, 1), #states) - if player_huds[name] == nil then - player_huds[name] = {} - for i = 1, param do - table.insert(player_huds[name], add_hud(player, i)) - end - minetest.chat_send_player(name, ("%d HUD element(s) added."):format(param)) - else - local huds = player_huds[name] - if huds then - for _, hud_id in ipairs(huds) do - player:hud_remove(hud_id) - end - minetest.chat_send_player(name, "All HUD elements removed.") - end - player_huds[name] = nil - end - return true - end, -}) diff --git a/games/devtest/mods/testhud/mod.conf b/games/devtest/mods/testhud/mod.conf deleted file mode 100644 index ed9f65c..0000000 --- a/games/devtest/mods/testhud/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testhud -description = For testing HUD functionality diff --git a/games/devtest/mods/testitems/init.lua b/games/devtest/mods/testitems/init.lua deleted file mode 100644 index 33ebf50..0000000 --- a/games/devtest/mods/testitems/init.lua +++ /dev/null @@ -1,55 +0,0 @@ -local S = minetest.get_translator("testitems") - --- --- Texture overlays for items --- - --- For the global overlay color test -local GLOBAL_COLOR_ARG = "orange" - --- Punch handler to set random color with "color" argument in item metadata -local overlay_on_use = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - local color = math.random(0x0, 0xFFFFFF) - local colorstr = string.format("#%06x", color) - meta:set_string("color", colorstr) - minetest.log("action", "[testitems] Color of "..itemstack:get_name().." changed to "..colorstr) - return itemstack -end --- Place handler to clear item metadata color -local overlay_on_place = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - meta:set_string("color", "") - return itemstack -end - -minetest.register_craftitem("testitems:overlay_meta", { - description = S("Texture Overlay Test Item, Meta Color") .. "\n" .. - S("Image must be a square with rainbow cross (inventory and wield)") .. "\n" .. - S("Item meta color must only change square color") .. "\n" .. - S("Punch: Set random color") .. "\n" .. - S("Place: Clear color"), - -- Base texture: A grayscale square (can be colorized) - inventory_image = "testitems_overlay_base.png", - wield_image = "testitems_overlay_base.png", - -- Overlay: A rainbow cross (NOT to be colorized!) - inventory_overlay = "testitems_overlay_overlay.png", - wield_overlay = "testitems_overlay_overlay.png", - - on_use = overlay_on_use, - on_place = overlay_on_place, - on_secondary_use = overlay_on_place, -}) -minetest.register_craftitem("testitems:overlay_global", { - description = S("Texture Overlay Test Item, Global Color") .. "\n" .. - S("Image must be an orange square with rainbow cross (inventory and wield)"), - -- Base texture: A grayscale square (to be colorized) - inventory_image = "testitems_overlay_base.png", - wield_image = "testitems_overlay_base.png", - -- Overlay: A rainbow cross (NOT to be colorized!) - inventory_overlay = "testitems_overlay_overlay.png", - wield_overlay = "testitems_overlay_overlay.png", - color = GLOBAL_COLOR_ARG, -}) - - diff --git a/games/devtest/mods/testitems/mod.conf b/games/devtest/mods/testitems/mod.conf deleted file mode 100644 index f91febe..0000000 --- a/games/devtest/mods/testitems/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testitems -description = Test mod to test misc. items that are neither tools nor nodes diff --git a/games/devtest/mods/testitems/textures/testitems_overlay_base.png b/games/devtest/mods/testitems/textures/testitems_overlay_base.png deleted file mode 100644 index f473623beceb882cf5e982fe4a99d049443cc625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|hMq2tAr*|t3haN>r4&r|C^0R_ z-q9|eaJ@i?{lM~v0&Egj9XvM(^;vjLV!PNdX9+LE+zQtD$-mA`1ZrmRboFyt=akR{ E01!DH@&Et; diff --git a/games/devtest/mods/testitems/textures/testitems_overlay_overlay.png b/games/devtest/mods/testitems/textures/testitems_overlay_overlay.png deleted file mode 100644 index 75a7d9fc3c58528ed454b68afd2f203618e4f7a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE0F&G|Nj>~y;sIx#1%h^ zD}47=m z^W>+l<+;V{qGi7P6?1ZA$~mAg#pJARCC95@7n9{IS5_}swb)%RbK^$l?xS4gDL 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=-140, 180, 20 do - local val = math.floor(((i-20)/200)*255) - minetest.register_node(("testnodes:bouncy"..i):gsub("-","NEG"), { - 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 - --- Move resistance nodes (various resistance levels) -for r=0, 7 do - if r > 0 then - minetest.register_node("testnodes:move_resistance"..r, { - description = S("Move-resistant Node (@1)", r), - walkable = false, - move_resistance = r, - - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_move_resistance.png" }, - is_ground_content = false, - groups = { dig_immediate = 3 }, - color = { b = 0, g = 255, r = math.floor((r/7)*255), a = 255 }, - }) - end - - minetest.register_node("testnodes:move_resistance_liquidlike"..r, { - description = S("Move-resistant Node, liquidlike (@1)", r), - walkable = false, - move_resistance = r, - liquid_move_physics = true, - - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_move_resistance.png" }, - is_ground_content = false, - groups = { dig_immediate = 3 }, - color = { b = 255, g = 0, r = math.floor((r/7)*255), a = 255 }, - }) -end - -minetest.register_node("testnodes:climbable_move_resistance_4", { - description = S("Climbable Move-resistant Node (4)"), - walkable = false, - climbable = true, - move_resistance = 4, - - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = {"testnodes_climbable_resistance_side.png"}, - is_ground_content = false, - groups = { dig_immediate = 3 }, -}) - --- 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/devtest/mods/testnodes/textures.lua b/games/devtest/mods/testnodes/textures.lua deleted file mode 100644 index 2faacdd..0000000 --- a/games/devtest/mods/testnodes/textures.lua +++ /dev/null @@ -1,290 +0,0 @@ --- 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 = "blend", - - groups = { dig_immediate = 3 }, - }) - - -- Transparency set via texture modifier - minetest.register_node("testnodes:alpha_"..alpha, { - description = S("Alpha Test Node (@1)", alpha), - drawtype = "glasslike", - paramtype = "light", - tiles = { - "testnodes_alpha.png^[opacity:" .. alpha, - }, - use_texture_alpha = "blend", - - groups = { dig_immediate = 3 }, - }) -end - --- Generate PNG textures - -local function mandelbrot(w, h, iterations) - local r = {} - for y=0, h-1 do - for x=0, w-1 do - local re = (x - w/2) * 4/w - local im = (y - h/2) * 4/h - -- zoom in on a nice view - re = re / 128 - 0.23 - im = im / 128 - 0.82 - - local px, py = 0, 0 - local i = 0 - while px*px + py*py <= 4 and i < iterations do - px, py = px*px - py*py + re, 2 * px * py + im - i = i + 1 - end - r[w*y+x+1] = i / iterations - end - end - return r -end - -local function gen_checkers(w, h, tile) - local r = {} - for y=0, h-1 do - for x=0, w-1 do - local hori = math.floor(x / tile) % 2 == 0 - local vert = math.floor(y / tile) % 2 == 0 - r[w*y+x+1] = hori ~= vert and 1 or 0 - end - end - return r -end - -local fractal = mandelbrot(512, 512, 128) -local frac_emb = mandelbrot(64, 64, 64) -local checker = gen_checkers(512, 512, 32) - -local floor = math.floor -local abs = math.abs -local data_emb = {} -local data_mb = {} -local data_ck = {} -for i=1, #frac_emb do - data_emb[i] = { - r = floor(abs(frac_emb[i] * 2 - 1) * 255), - g = floor(abs(1 - frac_emb[i]) * 255), - b = floor(frac_emb[i] * 255), - a = frac_emb[i] < 0.95 and 255 or 0, - } -end -for i=1, #fractal do - data_mb[i] = { - r = floor(fractal[i] * 255), - g = floor(abs(fractal[i] * 2 - 1) * 255), - b = floor(abs(1 - fractal[i]) * 255), - a = 255, - } - data_ck[i] = checker[i] > 0 and "#F80" or "#000" -end - -local textures_path = minetest.get_modpath( minetest.get_current_modname() ) .. "/textures/" -minetest.safe_file_write( - textures_path .. "testnodes_generated_mb.png", - minetest.encode_png(512,512,data_mb) -) -minetest.safe_file_write( - textures_path .. "testnodes_generated_ck.png", - minetest.encode_png(512,512,data_ck) -) - -minetest.register_node("testnodes:generated_png_mb", { - description = S("Generated Mandelbrot PNG Test Node"), - tiles = { "testnodes_generated_mb.png" }, - - groups = { dig_immediate = 2 }, -}) -minetest.register_node("testnodes:generated_png_ck", { - description = S("Generated Checker PNG Test Node"), - tiles = { "testnodes_generated_ck.png" }, - - groups = { dig_immediate = 2 }, -}) - -local png_emb = "[png:" .. minetest.encode_base64(minetest.encode_png(64,64,data_emb)) - -minetest.register_node("testnodes:generated_png_emb", { - description = S("Generated In-Band Mandelbrot PNG Test Node"), - tiles = { png_emb }, - - groups = { dig_immediate = 2 }, -}) -minetest.register_node("testnodes:generated_png_src_emb", { - description = S("Generated In-Band Source Blit Mandelbrot PNG Test Node"), - tiles = { png_emb .. "^testnodes_damage_neg.png" }, - - groups = { dig_immediate = 2 }, -}) -minetest.register_node("testnodes:generated_png_dst_emb", { - description = S("Generated In-Band Dest Blit Mandelbrot PNG Test Node"), - tiles = { "testnodes_generated_ck.png^" .. png_emb }, - - groups = { dig_immediate = 2 }, -}) - ---[[ - -The following nodes can be used to demonstrate the TGA format support. - -Minetest supports TGA types 1, 2, 3 & 10. While adding the support for -TGA type 9 (RLE-compressed, color-mapped) is easy, it is not advisable -to do so, as it is not backwards compatible with any Minetest pre-5.5; -content creators should therefore either use TGA type 1 or 10, or PNG. - -TODO: Types 1, 2 & 10 should have two test nodes each (i.e. bottom-top -and top-bottom) for 16bpp (A1R5G5B5), 24bpp (B8G8R8), 32bpp (B8G8R8A8) -colors. - -Note: Minetest requires the optional TGA footer for a texture to load. -If a TGA image does not load in Minetest, append eight (8) null bytes, -then the string “TRUEVISION-XFILE.”, then another null byte. - -]]-- - -minetest.register_node("testnodes:tga_type1_24bpp_bt", { - description = S("TGA Type 1 (color-mapped RGB) 24bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type1_24bpp_bt.tga" }, - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type1_24bpp_tb", { - description = S("TGA Type 1 (color-mapped RGB) 24bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type1_24bpp_tb.tga" }, - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type2_16bpp_bt", { - description = S("TGA Type 2 (uncompressed RGB) 16bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_16bpp_bt.tga" }, - use_texture_alpha = "clip", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type2_16bpp_tb", { - description = S("TGA Type 2 (uncompressed RGB) 16bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_16bpp_tb.tga" }, - use_texture_alpha = "clip", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type2_32bpp_bt", { - description = S("TGA Type 2 (uncompressed RGB) 32bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_32bpp_bt.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type2_32bpp_tb", { - description = S("TGA Type 2 (uncompressed RGB) 32bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_32bpp_tb.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type3_16bpp_bt", { - description = S("TGA Type 3 (uncompressed grayscale) 16bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type3_16bpp_bt.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type3_16bpp_tb", { - description = S("TGA Type 3 (uncompressed grayscale) 16bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type3_16bpp_tb.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type10_32bpp_bt", { - description = S("TGA Type 10 (RLE-compressed RGB) 32bpp bottom-top Test Node"), - tiles = { "testnodes_tga_type10_32bpp_bt.tga" }, - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -minetest.register_node("testnodes:tga_type10_32bpp_tb", { - description = S("TGA Type 10 (RLE-compressed RGB) 32bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type10_32bpp_tb.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) diff --git a/games/devtest/mods/testnodes/textures/testnodes_1.png b/games/devtest/mods/testnodes/textures/testnodes_1.png deleted file mode 100644 index 6730997e2db9623daa1bb458e2b2a7e9156a8093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_1g.png b/games/devtest/mods/testnodes/textures/testnodes_1g.png deleted file mode 100644 index 529298ece1d50bbfab913ac99e6a68c388d8bc0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_1w.png b/games/devtest/mods/testnodes/textures/testnodes_1w.png deleted file mode 100644 index d24e571cc90265d6dd09a15d3e8cb20bde91745a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_1wg.png b/games/devtest/mods/testnodes/textures/testnodes_1wg.png deleted file mode 100644 index b2eba0e9a60e0337062d4896c2bb6b781523b258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_2.png b/games/devtest/mods/testnodes/textures/testnodes_2.png deleted file mode 100644 index 6c87c868df0db96160b5fadaef616a5db8ee3ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_2g.png b/games/devtest/mods/testnodes/textures/testnodes_2g.png deleted file mode 100644 index cb9060f7b9f45b814a0f00b7eb13dfe95d897a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_2wg.png b/games/devtest/mods/testnodes/textures/testnodes_2wg.png deleted file mode 100644 index 108dc87bb7e2a89f110ce607604b6e9b279d452a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_3.png b/games/devtest/mods/testnodes/textures/testnodes_3.png deleted file mode 100644 index 05b45629afb1547e6c062c465e3305f2385e7ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_3g.png b/games/devtest/mods/testnodes/textures/testnodes_3g.png deleted file mode 100644 index 5c84f5882b9a185af33e59270ff59ae890f0bc39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|dY&$hAr*|t72Zk`Qc@BL4Exzy yvP{epr8CwrUgrN&F0@R^>KEg3Hnv5KmLTC diff --git a/games/devtest/mods/testnodes/textures/testnodes_3w.png b/games/devtest/mods/testnodes/textures/testnodes_3w.png deleted file mode 100644 index 8b435cf013556c82faea0d69b3e3901ac7f71c47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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} diff --git a/games/devtest/mods/testnodes/textures/testnodes_3wg.png b/games/devtest/mods/testnodes/textures/testnodes_3wg.png deleted file mode 100644 index 9ee9006674e2192e3826177046228cff06c41391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_5.png b/games/devtest/mods/testnodes/textures/testnodes_5.png deleted file mode 100644 index 1ef1c728ca262766ed4d4e897dbcf3844e75246f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_5g.png b/games/devtest/mods/testnodes/textures/testnodes_5g.png deleted file mode 100644 index 30da4793a153a639f718467ac465032117c34f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_5w.png b/games/devtest/mods/testnodes/textures/testnodes_5w.png deleted file mode 100644 index b4cb42426ab0ae0d26f35c3badefe4cac2cf8cf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_5wg.png b/games/devtest/mods/testnodes/textures/testnodes_5wg.png deleted file mode 100644 index fac9db28edfbf19a5bc2b6fceb8128b23a283651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_6.png b/games/devtest/mods/testnodes/textures/testnodes_6.png deleted file mode 100644 index 805813e57509bf2bb6f7b4cbef5bfa5267243580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_6w.png b/games/devtest/mods/testnodes/textures/testnodes_6w.png deleted file mode 100644 index e6bbf97d977a3fd3091bcdeb0dbd3af99752890b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QovysOo>(`UA*P z_jGX#sbEYNc>3Z+fmdKI;Vst0N0ozUH||9 diff --git a/games/devtest/mods/testnodes/textures/testnodes_6wg.png b/games/devtest/mods/testnodes/textures/testnodes_6wg.png deleted file mode 100644 index 29ca933e0aa8bb5307d63c289aaaff44821a9794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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+?% diff --git a/games/devtest/mods/testnodes/textures/testnodes_airlike.png b/games/devtest/mods/testnodes/textures/testnodes_airlike.png deleted file mode 100644 index 5a5664a2ae2458eaff7ff3038b0278cb3f637fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_allfaces.png b/games/devtest/mods/testnodes/textures/testnodes_allfaces.png deleted file mode 100644 index c0a7dc550c077d44a79e87a1b5ef72c8e98d344f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_alpha.png b/games/devtest/mods/testnodes/textures/testnodes_alpha.png deleted file mode 100644 index 157fa7386865f5ec8a4cc616809dea4085890a2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_alpha128.png b/games/devtest/mods/testnodes/textures/testnodes_alpha128.png deleted file mode 100644 index 16babf6c774bd887c6004f23702490b4c9fdf5ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)<= diff --git a/games/devtest/mods/testnodes/textures/testnodes_attached_bottom.png b/games/devtest/mods/testnodes/textures/testnodes_attached_bottom.png deleted file mode 100644 index e01ae576f5df74b8c0ce885a63826e94fdda2839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|vYsxEAr*|tJMPzOoi%K$n8bKU jX`YOgSgTe~DWM4fDkK)i diff --git a/games/devtest/mods/testnodes/textures/testnodes_attached_side.png b/games/devtest/mods/testnodes/textures/testnodes_attached_side.png deleted file mode 100644 index 9459cbb0568dde882a4082a42a50eec9b7dc9c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_attached_top.png b/games/devtest/mods/testnodes/textures/testnodes_attached_top.png deleted file mode 100644 index 0148b41e069734f5937e4976e2dd95f9b3c35e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_attachedw_bottom.png b/games/devtest/mods/testnodes/textures/testnodes_attachedw_bottom.png deleted file mode 100644 index 488ad23a90e3675a73e6e95d7dfd9c3f0983b06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_attachedw_side.png b/games/devtest/mods/testnodes/textures/testnodes_attachedw_side.png deleted file mode 100644 index a02facbc721cdb6e041a4f5467c65febcf542683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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=*fJXS_b}{o+ZENBj~DW~_(gH`x^>vAjPPW$hew zj8}Y9;OQS5TdG}KBB!(IJgD_e_dK&}gN9E5!RoR7P3z`8`TuU;4C{SAy{$+ zpM}~EMWOvHEB}A8j}hSZ$y(L={Po=E9gCkyxnB-{UoM=pYH#uDgI`T%l|D2%wYckU m;Jc%`3*~ZbXQa*lEZ%b7f033%%QK++89ZJ6T-G@yGywn%Ds6!P diff --git a/games/devtest/mods/testnodes/textures/testnodes_climbable_side.png b/games/devtest/mods/testnodes/textures/testnodes_climbable_side.png deleted file mode 100644 index c56ea90d7814c10508a6fbfef1ad5f3afd18df73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr*|tKmIpAwC8Z2Wn?g+ z;o+|XJWgC6PYP~noxm;07uNCr_*zNFWGSYL+)5uZj-@P?WKcW7%iO}PVbD+{e&IIv yj2UKn4jG41CQq4Qkl`a9FmHMh(P7{ryYh1JYRV$P6d`(oZubP0l+XkKkKH6} diff --git a/games/devtest/mods/testnodes/textures/testnodes_drowning.png b/games/devtest/mods/testnodes/textures/testnodes_drowning.png deleted file mode 100644 index 57ffc8fcf996e68f091dcc05e758e8eaaf2fa132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_fall_damage_minus.png b/games/devtest/mods/testnodes/textures/testnodes_fall_damage_minus.png deleted file mode 100644 index 88d3bdf58598e14081f21d398ee50f0fefedb24f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_fencelike.png b/games/devtest/mods/testnodes/textures/testnodes_fencelike.png deleted file mode 100644 index 84dea1b7c2ee318672987049eec68475bfc42820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|ik>cxAr*|t89viBxt=S{OIhKc npx^sMZJvykSgTe~DWM4feG?d* diff --git a/games/devtest/mods/testnodes/textures/testnodes_firelike.png b/games/devtest/mods/testnodes/textures/testnodes_firelike.png deleted file mode 100644 index ee59b0db1be0b51619ad304cb17f44e41e4af283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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$ diff --git a/games/devtest/mods/testnodes/textures/testnodes_glasslike.png b/games/devtest/mods/testnodes/textures/testnodes_glasslike.png deleted file mode 100644 index cf3e35414dbcb42b1d0b52990f97d2fe095251b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_glasslike_detail.png b/games/devtest/mods/testnodes/textures/testnodes_glasslike_detail.png deleted file mode 100644 index 30c9586e84022c1817fb88f90fafad462589a706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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~^~ diff --git a/games/devtest/mods/testnodes/textures/testnodes_glasslike_framed_optional.png b/games/devtest/mods/testnodes/textures/testnodes_glasslike_framed_optional.png deleted file mode 100644 index 37de77dd1aa7e6d027ade771dc898f4fcd8bf6b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_glasslikeliquid.png b/games/devtest/mods/testnodes/textures/testnodes_glasslikeliquid.png deleted file mode 100644 index e1e96ffb9f62b37173e542bf05a0d84b58d2ef2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light.png b/games/devtest/mods/testnodes/textures/testnodes_light.png deleted file mode 100644 index 4ba0081c3dc0544e0fc5b3c3a692b3744ab52f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_1.png b/games/devtest/mods/testnodes/textures/testnodes_light_1.png deleted file mode 100644 index 57adf5a4a89572114625655181540ac70574685e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_10.png b/games/devtest/mods/testnodes/textures/testnodes_light_10.png deleted file mode 100644 index 483834770e84a3072c88a2a20d48d423b5c1d50f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_12.png b/games/devtest/mods/testnodes/textures/testnodes_light_12.png deleted file mode 100644 index bc7946d09ec5a15edcceb96fda9590dd3cc9833c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_13.png b/games/devtest/mods/testnodes/textures/testnodes_light_13.png deleted file mode 100644 index 0b63c84a65bd79fd05e5f57e84fac1eadaf57f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_14.png b/games/devtest/mods/testnodes/textures/testnodes_light_14.png deleted file mode 100644 index a817bd3946eea313015daca3408ca40310ceca13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_2.png b/games/devtest/mods/testnodes/textures/testnodes_light_2.png deleted file mode 100644 index 852eaeff17dd01be999daad14b8829005ba934bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_5.png b/games/devtest/mods/testnodes/textures/testnodes_light_5.png deleted file mode 100644 index b6eede0ae902569625cfecbc4a64a3ee519bd53a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_light_9.png b/games/devtest/mods/testnodes/textures/testnodes_light_9.png deleted file mode 100644 index 2aa9023585aba2055ec03f3ab5f34f89b01897d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_line_curved.png b/games/devtest/mods/testnodes/textures/testnodes_line_curved.png deleted file mode 100644 index ab9f8e7208af8577ebd5df34f7a1d2749b5a95d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_line_straight.png b/games/devtest/mods/testnodes/textures/testnodes_line_straight.png deleted file mode 100644 index 4f33d9c6d9e53ee5ae0b33099fc5995faabc6809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidflowing.png b/games/devtest/mods/testnodes/textures/testnodes_liquidflowing.png deleted file mode 100644 index 1736b89ba5501f6f87ae94546d71249c29948010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r0.png b/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r0.png deleted file mode 100644 index e8a61039d7d4e5a725cf6d54c26e56c335757ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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* diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r3.png b/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r3.png deleted file mode 100644 index bef77396844b1a924c2d32af9941ddecfc5b8691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r4.png b/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r4.png deleted file mode 100644 index de1001b2d9ebd15eb417b4ba002dc2025c6d7f5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r5.png b/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r5.png deleted file mode 100644 index 97b422e9a181b08932b7a4362ac976d75cd2e16e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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#< diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r6.png b/games/devtest/mods/testnodes/textures/testnodes_liquidflowing_r6.png deleted file mode 100644 index 4cd8e4e8e551a3c8881ce47e3bcf788fdc065c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*|t2`>!p@ffnqJ zyQgdmyeFJFzU;vJ6LZcUeErKo;z--aLWzbgTe~DWM4fPvI)? diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r0.png b/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r0.png deleted file mode 100644 index da0a99623d8f84189d3d46914f0b8e3f8b34bdac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r1.png b/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r1.png deleted file mode 100644 index 66bf2be8f9ff80d2e3d76840a16e8d7315d46eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r3.png b/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r3.png deleted file mode 100644 index 0f46e291e81e7da98816774f0d0994cb99afae91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r4.png b/games/devtest/mods/testnodes/textures/testnodes_liquidsource_r4.png deleted file mode 100644 index 0693a04d7fc89f7acdd7bfbb06a724348cea3912..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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} diff --git a/games/devtest/mods/testnodes/textures/testnodes_mesh_stripes2.png b/games/devtest/mods/testnodes/textures/testnodes_mesh_stripes2.png deleted file mode 100644 index 9ea65c1ec05dc1c2e71d35461b935b9ecc14ec40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_mesh_stripes3.png b/games/devtest/mods/testnodes/textures/testnodes_mesh_stripes3.png deleted file mode 100644 index 96bc55ac5f3444eea6b725ec663f6a706ceed461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|GM+AuAr*|t3hXipQVynn)TIK> hwgpPN@K@xRlz++-dR7dHphNk&Az`}acbkv<}Y6H#;M1& diff --git a/games/devtest/mods/testnodes/textures/testnodes_node.png b/games/devtest/mods/testnodes/textures/testnodes_node.png deleted file mode 100644 index 145099b3a82bd303afc1c3e2578bd2896abb5753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|3Z5>GAr*|tKU|d(7!nsTIyvhK lGHh=PBNKfYA2vt22WQ%mvv4FO#m6}6{i3I diff --git a/games/devtest/mods/testnodes/textures/testnodes_node_falling.png b/games/devtest/mods/testnodes/textures/testnodes_node_falling.png deleted file mode 100644 index 44153185c23c46924729b8735bd4b47968f0012b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_nodebox.png b/games/devtest/mods/testnodes/textures/testnodes_nodebox.png deleted file mode 100644 index 66e8dd663e3a117d378b7b3eacd4e8bc0fc67b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_nojump_side.png b/games/devtest/mods/testnodes/textures/testnodes_nojump_side.png deleted file mode 100644 index 6a64cfff0fb1339f4b1daf2a94c088eac96ecc48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|s-7;6Ar*|t3haNb2Pz9Gnh0d- rHMw4xw{Uf02y?1uvxke{B{qg%(@scw8ej1QYGCkm^>bP0l+XkKwOkl} diff --git a/games/devtest/mods/testnodes/textures/testnodes_nojump_top.png b/games/devtest/mods/testnodes/textures/testnodes_nojump_top.png deleted file mode 100644 index fe770838f0cc6a6345c7c3308bc1ff89d7e8de0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_normal1.png b/games/devtest/mods/testnodes/textures/testnodes_normal1.png deleted file mode 100644 index edaba77e4e602f12ec74e2a383e9a148838f52c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_normal2.png b/games/devtest/mods/testnodes/textures/testnodes_normal2.png deleted file mode 100644 index 0080a9ee74ba07a7b0ba0f4c7f81c5548835a08e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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;@% diff --git a/games/devtest/mods/testnodes/textures/testnodes_normal3.png b/games/devtest/mods/testnodes/textures/testnodes_normal3.png deleted file mode 100644 index 0426ab216faf25f645c5b49d202c6f8f79f04318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_normal4.png b/games/devtest/mods/testnodes/textures/testnodes_normal4.png deleted file mode 100644 index 0d1922eb6d383c17e8a9499a8fa7d64585dad665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_normal5.png b/games/devtest/mods/testnodes/textures/testnodes_normal5.png deleted file mode 100644 index 0b7dcd2da9d230c61c56d841a333ce36e3c297f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_overlay.png b/games/devtest/mods/testnodes/textures/testnodes_overlay.png deleted file mode 100644 index 1c69b5e08981723339b03b5011786ed30fde7e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y$ZW{!9W@a@|Lkr1X6yUE{-7; zjL8b}e~xo^gwEw-dr_qzRA9*?#28@mKxv}n4^ssX3+COEFI-W4t)f*^@SBmRfR%xf ucZSMFvjv`lee5Z0Gv}!}@^^Oj=P)o-TAdaMdbHabWP_)xpUXO@geCxIRw(8G diff --git a/games/devtest/mods/testnodes/textures/testnodes_overlayable.png b/games/devtest/mods/testnodes/textures/testnodes_overlayable.png deleted file mode 100644 index 431bc94f43b2626a43e7598bf1894ba79b9cd704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|a-J@ZAr*|tH+B?0zPdWRQ(aO) j=h4Z9$%j|)E(Xf~Z}gP!-^&~URLS7!>gTe~DWM4faB3Jd diff --git a/games/devtest/mods/testnodes/textures/testnodes_palette_facedir.png b/games/devtest/mods/testnodes/textures/testnodes_palette_facedir.png deleted file mode 100644 index 8cf47bbbe2693618e4d7851aa9837720df4deca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_palette_full.png b/games/devtest/mods/testnodes/textures/testnodes_palette_full.png deleted file mode 100644 index e0a5f8b349809a6a6d3febdca04f93a5b09ddebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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#< diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_leveled.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_leveled.png deleted file mode 100644 index 53504dbcdd6224baf262d39e82327788cc7ec45b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_meshoptions.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_meshoptions.png deleted file mode 100644 index d504d459f30d387160543b1001824bcec1b56cf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted.png deleted file mode 100644 index 79cf2125e1aacf3924774801deff8fd2b5cc3942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png deleted file mode 100644 index 85311cb2c388c32855fc67fe3c36f114a15da63f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png deleted file mode 100644 index d100023750f43debb379fcff8fbfc71f959f2e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 a{XE z)7O>#DVvzMq@Lb|GXX%MdQTU}5RLO|CmC`bP~dT$Z)IKfLU7My_m$7TaL8Jf>Ae-$ z;CMvK^Cc%LZit-x&E(7#p|HmN-gH6MGh!3V>nA;`U#XDD(`y=HTQyiXY5$IvVuWBc}eoe TCq-|8PGRtL^>bP0l+XkKHY`w; diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png deleted file mode 100644 index 527817bc16eabcc1ad53d1b1a8eb6f42aa05bc4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|uAVNAAr*|tKh7Tr5O!u_dYF(N znB=j8?a~*8kjIV|xhu|JaS3i0IJkvzep};q#)Aqu%u=2=*miKSOfRyZAW;6r%X^6; Z!=jB>QnxS_9RV81;OXk;vd$@?2>_CQC|Upj diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png deleted file mode 100644 index 45e75bdd329f7ef429b53b89526f27ed0b310eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png deleted file mode 100644 index 8954b2c34c5870465d8f3ff3a09086bbcd633136..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png deleted file mode 100644 index 421466407db7c1af181f1bde0b2d2d78f10ef105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#DVvzMl;mCqt2scS)t)YnAsXkC|C~Qy@KJ;LW5dV)|Nryo`wOqEdK7D{#wK*o z;L?S!30g5LULOpx5TAUI<)KYwIlo@WvI&2m+_mkfnCWEZBA~={l|is|Lgn+Whherr z=|iq!EDW{XE z)7O>#DVvzM6uY}W`+uO&YEKu(5RLQ6f6gB;_^84BvEk$Y|Nr$R!vt4W9o<-<#wK*o z;L?T+aoUzQpK1H6 zle?=0^foCR;yU0AGgOKWHIyO7k-ZEx?r*&vv+itEy4OtB{8ecNh9OSxq z_;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* diff --git a/games/devtest/mods/testnodes/textures/testnodes_rail2_straight.png b/games/devtest/mods/testnodes/textures/testnodes_rail2_straight.png deleted file mode 100644 index 8749330d85388acf6d84f0547b5eb4a69eafba7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_rail2_t_junction.png b/games/devtest/mods/testnodes/textures/testnodes_rail2_t_junction.png deleted file mode 100644 index 0517f6570e8ee361ee9c4aa9cc719e4060c664e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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? diff --git a/games/devtest/mods/testnodes/textures/testnodes_rail_curved.png b/games/devtest/mods/testnodes/textures/testnodes_rail_curved.png deleted file mode 100644 index e4441984858011cd8eaaee23dea9e2a7bea979e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_rail_straight.png b/games/devtest/mods/testnodes/textures/testnodes_rail_straight.png deleted file mode 100644 index 872d04fb9b6105e57f17f76c6e3cee0daf69f660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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; diff --git a/games/devtest/mods/testnodes/textures/testnodes_rail_t_junction.png b/games/devtest/mods/testnodes/textures/testnodes_rail_t_junction.png deleted file mode 100644 index 7e4af5182e1c185c5530ecd21cdddafea0fc31a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_signlike.png b/games/devtest/mods/testnodes/textures/testnodes_signlike.png deleted file mode 100644 index 33ffcba6ca0275756ea01876d6fb479931354013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_street_crossing.png b/games/devtest/mods/testnodes/textures/testnodes_street_crossing.png deleted file mode 100644 index d6e35ad7a6f2e10882ea20effae88edd05bd31d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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!(; diff --git a/games/devtest/mods/testnodes/textures/testnodes_street_t_junction.png b/games/devtest/mods/testnodes/textures/testnodes_street_t_junction.png deleted file mode 100644 index 713621e0661b1b65e2bb8f3e3c6fb76fb31c43c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|uAVNAAr*|tKh7Ue(AE9>Uv?zrCvE@$ diff --git a/games/devtest/mods/testnodes/textures/testnodes_sunlight_filter.png b/games/devtest/mods/testnodes/textures/testnodes_sunlight_filter.png deleted file mode 100644 index b38ea40729b0a336119a8ffd154baf9fd2df8d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga deleted file mode 100644 index 2dc587bc39b9de661dd99bb3777c39398bfdab51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmY+6?FoP|3`EcVDo)`7x{_ki3^8K#fu!9*w^glM_H2iPKEx wc2Z@%$S+{pQS;7eX=enXf1gyv*pE#5)J;+)Z&b-@owu;ZB~D{|^l=Cs9$v37y#N3J diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga deleted file mode 100644 index b44a81c799b56f08c3882a5f34075d47ceb6e2bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmZQz;9`IP4h9fZ&}d>{`2W8JDAvFTB0#)W6kZdE32DFP67DT}x_TNZMvc7@5NeD=w!vORxqrtI=8A(lkDMcg> f%;`l`{M{`AbvwC-qcyJME>At{zD@5^*D~V+v|bC* diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga deleted file mode 100644 index 0206216bb4bb6cc2d8d0ef5281c7de497ed8ca12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmZQzU}As)4h9Ye0Y-)f7?cOHKo|z)fjkKRK{E&<U diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga deleted file mode 100644 index 216de063444160b9e2e69dbc90b8ae35c6370b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmZQzU}As(4h9fZ&|qNr{~v)F8i2A`Fh~tHahMoT9vNb&h00@y!}J4bkbaOnkVbM4 w!d@ivLGmEAFdE%$AaNK*mqXSE)ejV6U1(9v~k0JtfPDoIwYnW%Sr@x9)-gZOv;yMZA{1ft#zC(YfK;@zC2?+{y4f724^!L+^aP#zW)nfnv)Y?BP diff --git a/games/devtest/mods/testnodes/textures/testnodes_torchlike_ceiling.png b/games/devtest/mods/testnodes/textures/testnodes_torchlike_ceiling.png deleted file mode 100644 index 5d9862cc988af30c729428df42cf6731cdc5ac4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_torchlike_floor.png b/games/devtest/mods/testnodes/textures/testnodes_torchlike_floor.png deleted file mode 100644 index adf1e002dd67b65035e93622ae3c93baef3f1c1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testnodes/textures/testnodes_torchlike_wall.png b/games/devtest/mods/testnodes/textures/testnodes_torchlike_wall.png deleted file mode 100644 index cb442b22d84150cad41d4181a7cdca7a9ad64f09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testpathfinder/README.md b/games/devtest/mods/testpathfinder/README.md deleted file mode 100644 index 2b9d46e..0000000 --- a/games/devtest/mods/testpathfinder/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# 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/devtest/mods/testpathfinder/init.lua b/games/devtest/mods/testpathfinder/init.lua deleted file mode 100644 index 67748af..0000000 --- a/games/devtest/mods/testpathfinder/init.lua +++ /dev/null @@ -1,136 +0,0 @@ -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") .."\n".. - S("Finds path between 2 points") .."\n".. - S("Place on node: Select destination") .."\n".. - S("Punch: Find path from here") .."\n".. - S("Sneak+Punch: Change algorithm"), - 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/devtest/mods/testpathfinder/mod.conf b/games/devtest/mods/testpathfinder/mod.conf deleted file mode 100644 index e6034ae..0000000 --- a/games/devtest/mods/testpathfinder/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testpathfinder -description = Tool to test Minetest's pathfinder function diff --git a/games/devtest/mods/testpathfinder/textures/testpathfinder_testpathfinder.png b/games/devtest/mods/testpathfinder/textures/testpathfinder_testpathfinder.png deleted file mode 100644 index 37eef0565458e2210ff0d048e4d79edf5182887e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint_end.png b/games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint_end.png deleted file mode 100644 index 41a1cc549a914cbf81ac93589f8c085df4dc4af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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| diff --git a/games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint_start.png b/games/devtest/mods/testpathfinder/textures/testpathfinder_waypoint_start.png deleted file mode 100644 index a22e31c3bcbf1cf62405a624430f5da27bbb7bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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") .."\n".. - S("Move pointed object towards or away from you") .."\n".. - S("Punch: Move by distance").."\n".. - S("Sneak+Punch: Move by negative distance").."\n".. - S("Place: Increase distance").."\n".. - S("Sneak+Place: Decrease distance"), - 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") .."\n".. - S("Scale visual size of entities") .."\n".. - S("Punch: Increase size") .."\n".. - S("Sneak+Punch: Decrease scale"), - 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") .."\n".. - S("Spawns entities") .."\n".. - S("Punch: Select entity to spawn") .."\n".. - S("Place: Spawn selected entity"), - 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 pointed_thing.type == "node" then - if selections[name] then - local pos = pointed_thing.above - minetest.add_entity(pos, get_entity_list()[selections[name]]) - else - minetest.chat_send_player(name, S("Select an entity first (with punch key)!")) - end - 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).."]".. - "field_close_on_enter[value;false]".. - "button[8,8.5;1,1;submit;"..F(S("Submit")).."]" - ) -end - -minetest.register_tool("testtools:object_editor", { - description = S("Object Property Editor") .."\n".. - S("Edit properties of objects") .."\n".. - S("Punch object: Edit object") .."\n".. - S("Punch air: Edit yourself"), - 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") .."\n".. - S("Attach object to another") .."\n".. - S("Punch objects to first select parent object, then the child object to attach") .."\n".. - S("Punch air to select yourself") .."\n".. - S("Place: Incease attachment Y offset") .."\n".. - S("Sneak+Place: Decease attachment Y offset") .."\n".. - S("Aux1+Place: Incease attachment rotation") .."\n".. - S("Aux1+Sneak+Place: Decrease attachment rotation"), - 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, -}) - -local function print_object(obj) - if obj:is_player() then - return "player '"..obj:get_player_name().."'" - elseif obj:get_luaentity() then - return "LuaEntity '"..obj:get_luaentity().name.."'" - else - return "object" - end -end - -minetest.register_tool("testtools:children_getter", { - description = S("Children Getter") .."\n".. - S("Shows list of objects attached to object") .."\n".. - S("Punch object to show its 'children'") .."\n".. - S("Punch air to show your own 'children'"), - inventory_image = "testtools_children_getter.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() - local selected_object - local self_name - if pointed_thing.type == "object" then - selected_object = pointed_thing.ref - elseif pointed_thing.type == "nothing" then - selected_object = user - else - return - end - self_name = print_object(selected_object) - local children = selected_object:get_children() - local ret = "" - for c=1, #children do - ret = ret .. "* " .. print_object(children[c]) - if c < #children then - ret = ret .. "\n" - end - end - if ret == "" then - ret = S("No children attached to @1.", self_name) - else - ret = S("Children of @1:", self_name) .. "\n" .. ret - end - minetest.chat_send_player(user:get_player_name(), ret) - 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 - --- Item Meta Editor + Node Meta Editor -local node_meta_posses = {} -local meta_latest_keylist = {} - -local function show_meta_formspec(user, metatype, pos_or_item, key, value, keylist) - local textlist - if keylist then - textlist = "textlist[0,0.5;2.5,6.5;keylist;"..keylist.."]" - else - textlist = "" - end - - local form = "size[15,9]".. - "label[0,0;"..F(S("Current keys:")).."]".. - textlist.. - "field[3,0.5;12,1;key;"..F(S("Key"))..";"..F(key).."]".. - "textarea[3,1.5;12,6;value;"..F(S("Value (use empty value to delete key)"))..";"..F(value).."]".. - "button[4,8;3,1;set;"..F(S("Set value")).."]" - - local extra_label - local formname - if metatype == "node" then - formname = "testtools:node_meta_editor" - extra_label = S("pos = @1", minetest.pos_to_string(pos_or_item)) - else - formname = "testtools:item_meta_editor" - extra_label = S("item = @1", pos_or_item:get_name()) - end - form = form .. "label[0,7.2;"..F(extra_label).."]" - - minetest.show_formspec(user:get_player_name(), formname, form) -end - -local function get_meta_keylist(meta, playername, escaped) - local keys = {} - local ekeys = {} - local mtable = meta:to_table() - for k,_ in pairs(mtable.fields) do - table.insert(keys, k) - if escaped then - table.insert(ekeys, F(k)) - else - table.insert(ekeys, k) - end - end - if playername then - meta_latest_keylist[playername] = keys - end - return table.concat(ekeys, ",") -end - -minetest.register_tool("testtools:node_meta_editor", { - description = S("Node Meta Editor") .. "\n" .. - S("Place: Edit node metadata"), - inventory_image = "testtools_node_meta_editor.png", - groups = { testtool = 1, disable_repair = 1 }, - on_place = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - if not user:is_player() then - return itemstack - end - local pos = pointed_thing.under - node_meta_posses[user:get_player_name()] = pos - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - show_meta_formspec(user, "node", pos, "", "", get_meta_keylist(meta, user:get_player_name(), true)) - return itemstack - end, -}) - -local function get_item_next_to_wielded_item(player) - local inv = player:get_inventory() - local wield = player:get_wield_index() - local itemstack = inv:get_stack("main", wield+1) - return itemstack -end -local function set_item_next_to_wielded_item(player, itemstack) - local inv = player:get_inventory() - local wield = player:get_wield_index() - inv:set_stack("main", wield+1, itemstack) -end - -local function use_item_meta_editor(itemstack, user, pointed_thing) - if not user:is_player() then - return itemstack - end - local item_to_edit = get_item_next_to_wielded_item(user) - if item_to_edit:is_empty() then - minetest.chat_send_player(user:get_player_name(), S("Place an item next to the Item Meta Editor in your inventory first!")) - return itemstack - end - local meta = item_to_edit:get_meta() - show_meta_formspec(user, "item", item_to_edit, "", "", get_meta_keylist(meta, user:get_player_name(), true)) - return itemstack -end - -minetest.register_tool("testtools:item_meta_editor", { - description = S("Item Meta Editor") .. "\n" .. - S("Punch/Place: Edit item metadata of item in the next inventory slot"), - inventory_image = "testtools_item_meta_editor.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = use_item_meta_editor, - on_secondary_use = use_item_meta_editor, - on_place = use_item_meta_editor, -}) - -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.key_enter_field == "value" or 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 - elseif formname == "testtools:node_setter" then - local playername = player:get_player_name() - local witem = player:get_wielded_item() - if witem:get_name() == "testtools:node_setter" then - if fields.nodename and fields.param2 then - local param2 = tonumber(fields.param2) - if not param2 then - return - end - local meta = witem:get_meta() - meta:set_string("node", fields.nodename) - meta:set_int("node_param2", param2) - player:set_wielded_item(witem) - end - end - elseif formname == "testtools:node_meta_editor" or formname == "testtools:item_meta_editor" then - local name = player:get_player_name() - local metatype - local pos_or_item - if formname == "testtools:node_meta_editor" then - metatype = "node" - pos_or_item = node_meta_posses[name] - else - metatype = "item" - pos_or_item = get_item_next_to_wielded_item(player) - end - if fields.keylist then - local evnt = minetest.explode_textlist_event(fields.keylist) - if evnt.type == "DCL" or evnt.type == "CHG" then - local keylist_table = meta_latest_keylist[name] - if metatype == "node" and not pos_or_item then - return - end - local meta - if metatype == "node" then - meta = minetest.get_meta(pos_or_item) - else - meta = pos_or_item:get_meta() - end - if not keylist_table then - return - end - if #keylist_table == 0 then - return - end - local key = keylist_table[evnt.index] - local value = meta:get_string(key) - local keylist_escaped = {} - for k,v in pairs(keylist_table) do - keylist_escaped[k] = F(v) - end - local keylist = table.concat(keylist_escaped, ",") - show_meta_formspec(player, metatype, pos_or_item, key, value, keylist) - return - end - elseif fields.key and fields.key ~= "" and fields.value then - if metatype == "node" and not pos_or_item then - return - end - local meta - if metatype == "node" then - meta = minetest.get_meta(pos_or_item) - elseif metatype == "item" then - if pos_or_item:is_empty() then - return - end - meta = pos_or_item:get_meta() - end - if fields.set then - meta:set_string(fields.key, fields.value) - if metatype == "item" then - set_item_next_to_wielded_item(player, pos_or_item) - end - show_meta_formspec(player, metatype, pos_or_item, fields.key, fields.value, - get_meta_keylist(meta, name, true)) - end - return - end - end -end) - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - meta_latest_keylist[name] = nil - node_meta_posses[name] = nil -end) diff --git a/games/devtest/mods/testtools/light.lua b/games/devtest/mods/testtools/light.lua deleted file mode 100644 index afca9a4..0000000 --- a/games/devtest/mods/testtools/light.lua +++ /dev/null @@ -1,37 +0,0 @@ - -local S = minetest.get_translator("testtools") - -local function get_func(is_place) - return function(itemstack, user, pointed_thing) - local pos - if is_place then - pos = pointed_thing.under - else - pos = pointed_thing.above - end - if pointed_thing.type ~= "node" or not pos then - return - end - - local node = minetest.get_node(pos) - local pstr = minetest.pos_to_string(pos) - local time = minetest.get_timeofday() - local sunlight = minetest.get_natural_light(pos) - local artificial = minetest.get_artificial_light(node.param1) - local message = ("pos=%s | param1=0x%02x | " .. - "sunlight=%d | artificial=%d | timeofday=%.5f" ) - :format(pstr, node.param1, sunlight, artificial, time) - minetest.chat_send_player(user:get_player_name(), message) - end -end - -minetest.register_tool("testtools:lighttool", { - description = S("Light Tool") .. "\n" .. - S("Show light values of node") .. "\n" .. - S("Punch: Light of node above touched node") .. "\n" .. - S("Place: Light of touched node itself"), - inventory_image = "testtools_lighttool.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = get_func(false), - on_place = get_func(true), -}) diff --git a/games/devtest/mods/testtools/mod.conf b/games/devtest/mods/testtools/mod.conf deleted file mode 100644 index cde1b26..0000000 --- a/games/devtest/mods/testtools/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testtools -description = Some tools to directly manipulate nodes and entities. Great for development and testing diff --git a/games/devtest/mods/testtools/textures/testtools_children_getter.png b/games/devtest/mods/testtools/textures/testtools_children_getter.png deleted file mode 100644 index b7fa340258f97da1ddb42d66eb3cabfa8dc7c092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI=iG^R)VoT8JM?fLT64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aiF3`PZ!4!i_=SkPxCq`a;!cwH>PQ#&8|7YKlzS{+iR#ys8}fy zy*eQ+=jxQN;>OBcDGS6prha76m<08%4U9uePm)2xA&Zxinl-Oq?%%`Y5NUUcFyBqe84Pt(6G6R T@8&(AV;DSL{an^LB{Ts5?l4~@ diff --git a/games/devtest/mods/testtools/textures/testtools_entity_rotator.png b/games/devtest/mods/testtools/textures/testtools_entity_rotator.png deleted file mode 100644 index 17ebb2d35a89a13ccfd0f5bac53020c20d6390fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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# diff --git a/games/devtest/mods/testtools/textures/testtools_entity_spawner.png b/games/devtest/mods/testtools/textures/testtools_entity_spawner.png deleted file mode 100644 index 6199e0145fdb4252ba60c8bf6845a85f7104bf0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testtools/textures/testtools_falling_node_tool.png b/games/devtest/mods/testtools/textures/testtools_falling_node_tool.png deleted file mode 100644 index 30099a7ef4201f6f6bfe8e8c52c3a5a371c6f615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 nT_j#Hntbdto z!S=Cz8F#`g#Tg|H1`Rs-3wJljFVdQ&MBb@0QKD@O#lD@ diff --git a/games/devtest/mods/testtools/textures/testtools_lighttool.png b/games/devtest/mods/testtools/textures/testtools_lighttool.png deleted file mode 100644 index 6f744b7fa46d8a00e6a59c0929a591ea93add744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659 zcmV->288*EP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SOKDvg0ZY{MRaG2_OLy%fURVW(RlqBQWu?bDY?j zGe0+!4HiObx@8=w|NU<8OMi$c;5ELw2`g8IJ#k<6`A;RMXSHs`7Gq2W)v{u*MB^Q*@Fe}Qy zgPp!c9T%mX#4Q6%8%LeZzKWWff?i5)g z8&`@8d*v#Ou3W#XmkMIr)XfiqA8pEScJ-sBstWo+v*-qsS=JDXw_mkILuXPyul@Q~ zSl}`PC`FpvD;P_vfC*atHdw=mY_0MrDo|47NDdcOzdT zZq~C&h42)JRhvjj#d6MT{jd|Qq2$Rs?|ty>1$^`=P;kMA5IFQhE-|rV&w-hRBPSto z;w1=+NR$*YlAeJ+hR9K3j42@`O_VfNQvalu1s7V};+L@SB1>FS*7C_N`y4W7$uXyb zg^C^%B@`}FVoB9P)sv#S>T9T6rN)|?)>@VCYb zrdD8ngs}ZM@m(`j44qZQxhtRrja@S%);a9TbP=kic&eG5CMhV<>z`6>xe)T1paNYY`;ORkx! z4gCq1<_$^4G56jLZu;%qp8Itfe7x>OTKJo7oTY*HdG2oye$4W8gW<<^wbx*ZdzsbL z=@oO9=UKqd_V#ib&i8)A*jVP1m-2!q=#Y83C6`}p;0cHsE@F0g;T+J#{!Z}1d%$Ou zpW}x!1#So3A%lBVUL%7&wJ#{W>Ia2z!QpM7aKYhi3gLpo+sNRix+fGKs|zlx@uZ56 zC&P*#KH9(=ydXb&{WrXD_XxZ?vf#~`)t3IjI*%*QCNTeoYlI`#&nj^Txq;mMa9w;* z;DXNg5OgfL$XkRdL|6u#EY9D`%^q*yfKYo2-0#3ysHUIzt zglR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsH=xst$G#aR^eKS`Za+)G8FALZ}s5 zbuhVpLX(Ch#l=x@EjakGSaoo5*44pP5ClI!oE)7LU8KbSC509-9vt`M-Mz=%J3weu zm}+*71FB{jsYG1NWLL%RR|FA2A4U+BnW@i7QWBoy>mEM7-o<#9_qjhuZ!T{#z$X&V zGTpF@)hJ)cxSZp>#aXS?SnHnrg`vE*vdndw!$@EeOOPN!K@DY8U?E1UMv93P?Z-X* zLylh}mqM;G7&#VDg$mj6ga5(rZq35vgqswK1A!OY{ul+icY$Wzw!e>UyLkfmpMfi_ z?XNa~nNQN|Z7p&H^lt+f*KJMN11@)f!6#idWJmJT6bc34{fxdT3k=)>!8NzH);>-j zfHZZLya5glfw3ZGuY0_^r?an0U60WO;~d-o7e1-RLBt&={?ZX#e6zRbe%kztQDBP)|5LF^%}=d-j{iRZi~l5np8R>8|NGV^2O|3kaNXYA6WtrQzNscirN002ovPDHLk FV1hb0459!4 diff --git a/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png b/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png deleted file mode 100644 index 89eafd65cf92dda7565c70cbbc46a4a2d20ca566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ex5FlAr*|t3M_v5Ovx5M{yZ~@ z`}*I|p!0$K1v8B{$%X>PDZaC~4R{yqXwsS}~a0j1cRaWG= iV3^44;d}223&YAw%kNGpxaI&fnZeW5&t;ucLK6THcPrii diff --git a/games/devtest/mods/testtools/textures/testtools_node_setter.png b/games/devtest/mods/testtools/textures/testtools_node_setter.png deleted file mode 100644 index 8599438def3981bff86847fe5a77229a2e11d8c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*{gCo-}faNuG2&i(g_ zt;zkH?y)ZwG6XFb9kw#4_BJ_L_sCmy&lClrOlz)9&C};^J`fnw)bm5oi%Uj~VRLZK uiJeO{nZ+Y`f7Z@z<6$@Y6Uz3aGH;VuX2AJ-Qs04=FnGH9xvXgTe~DWM4f`a?yO diff --git a/games/devtest/mods/testtools/textures/testtools_object_editor.png b/games/devtest/mods/testtools/textures/testtools_object_editor.png deleted file mode 100644 index d1ce9cecdb5919c281848625c5532b808cdd4fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testtools/textures/testtools_object_mover.png b/games/devtest/mods/testtools/textures/testtools_object_mover.png deleted file mode 100644 index 8b14e9fb2a680154ede93137b9a3928f6f4c9d7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testtools/textures/testtools_param2tool.png b/games/devtest/mods/testtools/textures/testtools_param2tool.png deleted file mode 100644 index dbc66357589142a637ad07b4a34e98b8e475bf87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/testtools/textures/testtools_remover.png b/games/devtest/mods/testtools/textures/testtools_remover.png deleted file mode 100644 index 73f14cd549949a103d0799da7bdb64c03e8f3382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/tiled/init.lua b/games/devtest/mods/tiled/init.lua deleted file mode 100644 index 68ead8e..0000000 --- a/games/devtest/mods/tiled/init.lua +++ /dev/null @@ -1,33 +0,0 @@ -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/devtest/mods/tiled/mod.conf b/games/devtest/mods/tiled/mod.conf deleted file mode 100644 index 78b19f9..0000000 --- a/games/devtest/mods/tiled/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = tiled -description = Add nodes with a special texture that spans multiple nodes (aka "world-aligned") -depends = stairs diff --git a/games/devtest/mods/tiled/textures/tiled_tiled.png b/games/devtest/mods/tiled/textures/tiled_tiled.png deleted file mode 100644 index 363a264870a5927f03e7fd4c74e22066cf09d403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/unittests/async_env.lua b/games/devtest/mods/unittests/async_env.lua deleted file mode 100644 index b7edf94..0000000 --- a/games/devtest/mods/unittests/async_env.lua +++ /dev/null @@ -1,168 +0,0 @@ --- helper - -core.register_async_dofile(core.get_modpath(core.get_current_modname()) .. - DIR_DELIM .. "inside_async_env.lua") - -local function deepequal(a, b) - if type(a) == "function" then - return type(b) == "function" - elseif type(a) ~= "table" then - return a == b - elseif type(b) ~= "table" then - return false - end - for k, v in pairs(a) do - if not deepequal(v, b[k]) then - return false - end - end - for k, v in pairs(b) do - if not deepequal(a[k], v) then - return false - end - end - return true -end - --- Object Passing / Serialization - -local test_object = { - name = "stairs:stair_glass", - type = "node", - groups = {oddly_breakable_by_hand = 3, cracky = 3, stair = 1}, - description = "Glass Stair", - sounds = { - dig = {name = "default_glass_footstep", gain = 0.5}, - footstep = {name = "default_glass_footstep", gain = 0.3}, - dug = {name = "default_break_glass", gain = 1} - }, - node_box = { - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5} - }, - type = "fixed" - }, - tiles = { - {name = "stairs_glass_split.png", backface_culling = true}, - {name = "default_glass.png", backface_culling = true}, - {name = "stairs_glass_stairside.png^[transformFX", backface_culling = true} - }, - on_place = function(itemstack, placer) - return core.is_player(placer) - end, - sunlight_propagates = true, - is_ground_content = false, - light_source = 0, -} - -local function test_object_passing() - local tmp = core.serialize_roundtrip(test_object) - assert(deepequal(test_object, tmp)) - - local circular_key = {"foo", "bar"} - circular_key[circular_key] = true - tmp = core.serialize_roundtrip(circular_key) - assert(tmp[1] == "foo") - assert(tmp[2] == "bar") - assert(tmp[tmp] == true) - - local circular_value = {"foo"} - circular_value[2] = circular_value - tmp = core.serialize_roundtrip(circular_value) - assert(tmp[1] == "foo") - assert(tmp[2] == tmp) - - -- Two-segment cycle - local cycle_seg_1, cycle_seg_2 = {}, {} - cycle_seg_1[1] = cycle_seg_2 - cycle_seg_2[1] = cycle_seg_1 - tmp = core.serialize_roundtrip(cycle_seg_1) - assert(tmp[1][1] == tmp) - - -- Duplicated value without a cycle - local acyclic_dup_holder = {} - tmp = ItemStack("") - acyclic_dup_holder[tmp] = tmp - tmp = core.serialize_roundtrip(acyclic_dup_holder) - for k, v in pairs(tmp) do - assert(rawequal(k, v)) - end -end -unittests.register("test_object_passing", test_object_passing) - -local function test_userdata_passing(_, pos) - -- basic userdata passing - local obj = table.copy(test_object.tiles[1]) - obj.test = ItemStack("default:cobble 99") - local tmp = core.serialize_roundtrip(obj) - assert(type(tmp.test) == "userdata") - assert(obj.test:to_string() == tmp.test:to_string()) - - -- object can't be passed, should error - obj = core.raycast(pos, pos) - assert(not pcall(core.serialize_roundtrip, obj)) - - -- VManip - local vm = core.get_voxel_manip(pos, pos) - local expect = vm:get_node_at(pos) - local vm2 = core.serialize_roundtrip(vm) - assert(deepequal(vm2:get_node_at(pos), expect)) -end -unittests.register("test_userdata_passing", test_userdata_passing, {map=true}) - --- Asynchronous jobs - -local function test_handle_async(cb) - -- Basic test including mod name tracking and unittests.async_test() - -- which is defined inside_async_env.lua - local func = function(x) - return core.get_last_run_mod(), _VERSION, unittests[x]() - end - local expect = {core.get_last_run_mod(), _VERSION, true} - - core.handle_async(func, function(...) - if not deepequal(expect, {...}) then - return cb("Values did not equal") - end - if core.get_last_run_mod() ~= expect[1] then - return cb("Mod name not tracked correctly") - end - - -- Test passing of nil arguments and return values - core.handle_async(function(a, b) - return a, b - end, function(a, b) - if b ~= 123 then - return cb("Argument went missing") - end - cb() - end, nil, 123) - end, "async_test") -end -unittests.register("test_handle_async", test_handle_async, {async=true}) - -local function test_userdata_passing2(cb, _, pos) - -- VManip: check transfer into other env - local vm = core.get_voxel_manip(pos, pos) - local expect = vm:get_node_at(pos) - - core.handle_async(function(vm_, pos_) - return vm_:get_node_at(pos_) - end, function(ret) - if not deepequal(expect, ret) then - return cb("Node data mismatch (one-way)") - end - - -- VManip: test a roundtrip - core.handle_async(function(vm_) - return vm_ - end, function(vm2) - if not deepequal(expect, vm2:get_node_at(pos)) then - return cb("Node data mismatch (roundtrip)") - end - cb() - end, vm) - end, vm, pos) -end -unittests.register("test_userdata_passing2", test_userdata_passing2, {map=true, async=true}) diff --git a/games/devtest/mods/unittests/crafting.lua b/games/devtest/mods/unittests/crafting.lua deleted file mode 100644 index 8c16d3e..0000000 --- a/games/devtest/mods/unittests/crafting.lua +++ /dev/null @@ -1,112 +0,0 @@ -dofile(core.get_modpath(core.get_current_modname()) .. "/crafting_prepare.lua") - --- Test minetest.clear_craft function -local function test_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 -unittests.register("test_clear_craft", test_clear_craft) - --- Test minetest.get_craft_result function -local function test_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:is_empty()) -end -unittests.register("test_get_craft_result", test_get_craft_result) diff --git a/games/devtest/mods/unittests/crafting_prepare.lua b/games/devtest/mods/unittests/crafting_prepare.lua deleted file mode 100644 index 5cf5775..0000000 --- a/games/devtest/mods/unittests/crafting_prepare.lua +++ /dev/null @@ -1,94 +0,0 @@ --- 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 }, -}) - --- Use aliases in recipes for more complete testing - -minetest.register_alias("unittests:steel_ingot_alias", "unittests:steel_ingot") -minetest.register_alias("unittests:coal_lump_alias", "unittests:coal_lump") -minetest.register_alias("unittests:iron_lump_alias", "unittests:iron_lump") - --- Recipes for tests: Normal crafting, cooking and fuel - -minetest.register_craft({ - output = 'unittests:torch 4', - recipe = { - {'unittests:coal_lump_alias'}, - {'unittests:stick'}, - } -}) - -minetest.register_craft({ - type = "cooking", - output = "unittests:steel_ingot_alias", - recipe = "unittests:iron_lump_alias", -}) - -minetest.register_craft({ - type = "fuel", - recipe = "unittests:coal_lump_alias", - 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/devtest/mods/unittests/entity.lua b/games/devtest/mods/unittests/entity.lua deleted file mode 100644 index 68635ca..0000000 --- a/games/devtest/mods/unittests/entity.lua +++ /dev/null @@ -1,132 +0,0 @@ -local log = {} - -local function insert_log(...) - log[#log+1] = string.format(...) -end - -local function objref_str(self, ref) - if ref and ref:is_player() then - return "player" - end - return self.object == ref and "self" or tostring(ref) -end - -core.register_entity("unittests:callbacks", { - initial_properties = { - hp_max = 5, - visual = "upright_sprite", - textures = { "unittests_stick.png" }, - static_save = false, - }, - - on_activate = function(self, staticdata, dtime_s) - self.object:set_armor_groups({test = 100}) - assert(self.object:get_hp() == self.initial_properties.hp_max) - insert_log("on_activate(%d)", #staticdata) - end, - on_deactivate = function(self, removal) - insert_log("on_deactivate(%s)", tostring(removal)) - end, - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) - insert_log("on_punch(%s, %.1f, %d)", objref_str(self, puncher), - time_from_last_punch, damage) - end, - on_death = function(self, killer) - assert(self.object:get_hp() == 0) - insert_log("on_death(%s)", objref_str(self, killer)) - end, - on_rightclick = function(self, clicker) - insert_log("on_rightclick(%s)", objref_str(self, clicker)) - end, - on_attach_child = function(self, child) - insert_log("on_attach_child(%s)", objref_str(self, child)) - end, - on_detach_child = function(self, child) - insert_log("on_detach_child(%s)", objref_str(self, child)) - end, - on_detach = function(self, parent) - insert_log("on_detach(%s)", objref_str(self, parent)) - end, - get_staticdata = function(self) - assert(false) - end, -}) - --- - -local function check_log(expect) - if #expect ~= #log then - error("Log mismatch: " .. core.write_json(log)) - end - for i, s in ipairs(expect) do - if log[i] ~= s then - error("Log mismatch at " .. i .. ": " .. core.write_json(log)) - end - end - log = {} -- clear it for next time -end - -local function test_entity_lifecycle(_, pos) - log = {} - - -- with binary in staticdata - local obj = core.add_entity(pos, "unittests:callbacks", "abc\000def") - check_log({"on_activate(7)"}) - - obj:set_hp(0) - check_log({"on_death(nil)", "on_deactivate(true)"}) - - -- objectref must be invalid now - assert(obj:get_velocity() == nil) -end -unittests.register("test_entity_lifecycle", test_entity_lifecycle, {map=true}) - -local function test_entity_interact(_, pos) - log = {} - - local obj = core.add_entity(pos, "unittests:callbacks") - check_log({"on_activate(0)"}) - - -- rightclick - obj:right_click(obj) - check_log({"on_rightclick(self)"}) - - -- useless punch - obj:punch(obj, 0.5, {}) - check_log({"on_punch(self, 0.5, 0)"}) - - -- fatal punch - obj:punch(obj, 1.9, { - full_punch_interval = 1.0, - damage_groups = { test = 10 }, - }) - check_log({ - -- does 10 damage even though we only have 5 hp - "on_punch(self, 1.9, 10)", - "on_death(self)", - "on_deactivate(true)" - }) -end -unittests.register("test_entity_interact", test_entity_interact, {map=true}) - -local function test_entity_attach(player, pos) - log = {} - - local obj = core.add_entity(pos, "unittests:callbacks") - check_log({"on_activate(0)"}) - - -- attach player to entity - player:set_attach(obj) - check_log({"on_attach_child(player)"}) - player:set_detach() - check_log({"on_detach_child(player)"}) - - -- attach entity to player - obj:set_attach(player) - check_log({}) - obj:set_detach() - check_log({"on_detach(player)"}) - - obj:remove() -end -unittests.register("test_entity_attach", test_entity_attach, {player=true, map=true}) diff --git a/games/devtest/mods/unittests/init.lua b/games/devtest/mods/unittests/init.lua deleted file mode 100644 index 0e041be..0000000 --- a/games/devtest/mods/unittests/init.lua +++ /dev/null @@ -1,202 +0,0 @@ -unittests = {} - -unittests.list = {} - --- name: Name of the test --- func: --- for sync: function(player, pos), should error on failure --- for async: function(callback, player, pos) --- MUST call callback() or callback("error msg") in case of error once test is finished --- this means you cannot use assert() in the test implementation --- opts: { --- player = false, -- Does test require a player? --- map = false, -- Does test require map access? --- async = false, -- Does the test run asynchronously? (read notes above!) --- } -function unittests.register(name, func, opts) - local def = table.copy(opts or {}) - def.name = name - def.func = func - table.insert(unittests.list, def) -end - -function unittests.on_finished(all_passed) - -- free to override -end - --- Calls invoke with a callback as argument --- Suspends coroutine until that callback is called --- Return values are passed through -local function await(invoke) - local co = coroutine.running() - assert(co) - local called_early = true - invoke(function(...) - if called_early == true then - called_early = {...} - else - coroutine.resume(co, ...) - co = nil - end - end) - if called_early ~= true then - -- callback was already called before yielding - return unpack(called_early) - end - called_early = nil - return coroutine.yield() -end - -function unittests.run_one(idx, counters, out_callback, player, pos) - local def = unittests.list[idx] - if not def.player then - player = nil - elseif player == nil then - out_callback(false) - return false - end - if not def.map then - pos = nil - elseif pos == nil then - out_callback(false) - return false - end - - local tbegin = core.get_us_time() - local function done(status, err) - local tend = core.get_us_time() - local ms_taken = (tend - tbegin) / 1000 - - if not status then - core.log("error", err) - end - print(string.format("[%s] %s - %dms", - status and "PASS" or "FAIL", def.name, ms_taken)) - counters.time = counters.time + ms_taken - counters.total = counters.total + 1 - if status then - counters.passed = counters.passed + 1 - end - end - - if def.async then - core.log("info", "[unittest] running " .. def.name .. " (async)") - def.func(function(err) - done(err == nil, err) - out_callback(true) - end, player, pos) - else - core.log("info", "[unittest] running " .. def.name) - local status, err = pcall(def.func, player, pos) - done(status, err) - out_callback(true) - end - - return true -end - -local function wait_for_player(callback) - if #core.get_connected_players() > 0 then - return callback(core.get_connected_players()[1]) - end - local first = true - core.register_on_joinplayer(function(player) - if first then - callback(player) - first = false - end - end) -end - -local function wait_for_map(player, callback) - local check = function() - if core.get_node_or_nil(player:get_pos()) ~= nil then - callback() - else - core.after(0, check) - end - end - check() -end - -function unittests.run_all() - -- This runs in a coroutine so it uses await(). - local counters = { time = 0, total = 0, passed = 0 } - - -- Run standalone tests first - for idx = 1, #unittests.list do - local def = unittests.list[idx] - def.done = await(function(cb) - unittests.run_one(idx, counters, cb, nil, nil) - end) - end - - -- Wait for a player to join, run tests that require a player - local player = await(wait_for_player) - for idx = 1, #unittests.list do - local def = unittests.list[idx] - if not def.done then - def.done = await(function(cb) - unittests.run_one(idx, counters, cb, player, nil) - end) - end - end - - -- Wait for the world to generate/load, run tests that require map access - await(function(cb) - wait_for_map(player, cb) - end) - local pos = vector.round(player:get_pos()) - for idx = 1, #unittests.list do - local def = unittests.list[idx] - if not def.done then - def.done = await(function(cb) - unittests.run_one(idx, counters, cb, player, pos) - end) - end - end - - -- Print stats - assert(#unittests.list == counters.total) - print(string.rep("+", 80)) - print(string.format("Unit Test Results: %s", - counters.total == counters.passed and "PASSED" or "FAILED")) - print(string.format(" %d / %d failed tests.", - counters.total - counters.passed, counters.total)) - print(string.format(" Testing took %dms total.", counters.time)) - print(string.rep("+", 80)) - unittests.on_finished(counters.total == counters.passed) - return counters.total == counters.passed -end - --------------- - -local modpath = core.get_modpath("unittests") -dofile(modpath .. "/misc.lua") -dofile(modpath .. "/player.lua") -dofile(modpath .. "/crafting.lua") -dofile(modpath .. "/itemdescription.lua") -dofile(modpath .. "/async_env.lua") -dofile(modpath .. "/entity.lua") - --------------- - -if core.settings:get_bool("devtest_unittests_autostart", false) then - core.after(0, function() - coroutine.wrap(unittests.run_all)() - end) -else - core.register_chatcommand("unittests", { - privs = {basic_privs=true}, - description = "Runs devtest unittests (may modify player or map state)", - func = function(name, param) - unittests.on_finished = function(ok) - core.chat_send_player(name, - (ok and "All tests passed." or "There were test failures.") .. - " Check the console for detailed output.") - end - coroutine.wrap(unittests.run_all)() - return true, "" - end, - }) -end diff --git a/games/devtest/mods/unittests/inside_async_env.lua b/games/devtest/mods/unittests/inside_async_env.lua deleted file mode 100644 index 4ed0fcc..0000000 --- a/games/devtest/mods/unittests/inside_async_env.lua +++ /dev/null @@ -1,25 +0,0 @@ -unittests = {} - -core.log("info", "Hello World") - -local function do_tests() - assert(core == minetest) - -- stuff that should not be here - assert(not core.get_player_by_name) - assert(not core.set_node) - assert(not core.object_refs) - -- stuff that should be here - assert(ItemStack) - assert(core.registered_items[""]) - -- alias handling - assert(core.registered_items["unittests:steel_ingot_alias"].name == - "unittests:steel_ingot") -end - -function unittests.async_test() - local ok, err = pcall(do_tests) - if not ok then - core.log("error", err) - end - return ok -end diff --git a/games/devtest/mods/unittests/itemdescription.lua b/games/devtest/mods/unittests/itemdescription.lua deleted file mode 100644 index b4c218c..0000000 --- a/games/devtest/mods/unittests/itemdescription.lua +++ /dev/null @@ -1,42 +0,0 @@ -local full_description = "Description Test Item\nFor testing item decription" -minetest.register_tool("unittests:description_test", { - description = full_description, - inventory_image = "unittests_description_test.png", -}) - -minetest.register_chatcommand("item_description", { - param = "", - description = "Show the short and full description of the wielded item.", - func = function(name) - local player = minetest.get_player_by_name(name) - local item = player:get_wielded_item() - return true, string.format("short_description: %s\ndescription: %s", - item:get_short_description(), item:get_description()) - end -}) - -local function test_short_desc() - local function get_short_description(item) - return ItemStack(item):get_short_description() - end - - local stack = ItemStack("unittests:description_test") - assert(stack:get_short_description() == "Description Test Item") - assert(get_short_description("unittests:description_test") == "Description Test Item") - assert(minetest.registered_items["unittests:description_test"].short_description == nil) - assert(stack:get_description() == full_description) - assert(stack:get_description() == minetest.registered_items["unittests:description_test"].description) - - stack:get_meta():set_string("description", "Hello World") - assert(stack:get_short_description() == "Hello World") - assert(stack:get_description() == "Hello World") - assert(get_short_description(stack) == "Hello World") - assert(get_short_description("unittests:description_test") == "Description Test Item") - - stack:get_meta():set_string("short_description", "Foo Bar") - assert(stack:get_short_description() == "Foo Bar") - assert(stack:get_description() == "Hello World") - - return true -end -unittests.register("test_short_desc", test_short_desc) diff --git a/games/devtest/mods/unittests/misc.lua b/games/devtest/mods/unittests/misc.lua deleted file mode 100644 index 4811c80..0000000 --- a/games/devtest/mods/unittests/misc.lua +++ /dev/null @@ -1,82 +0,0 @@ -local function test_random() - -- Try out PseudoRandom - local pseudo = PseudoRandom(13) - assert(pseudo:next() == 22290) - assert(pseudo:next() == 13854) -end -unittests.register("test_random", test_random) - -local function test_dynamic_media(cb, player) - if core.get_player_information(player:get_player_name()).protocol_version < 40 then - core.log("warning", "test_dynamic_media: Client too old, skipping test.") - return cb() - end - - -- Check that the client acknowledges media transfers - local path = core.get_worldpath() .. "/test_media.obj" - local f = io.open(path, "w") - f:write("# contents don't matter\n") - f:close() - - local call_ok = false - local ok = core.dynamic_add_media({ - filepath = path, - to_player = player:get_player_name(), - }, function(name) - if not call_ok then - return cb("impossible condition") - end - cb() - end) - if not ok then - return cb("dynamic_add_media() returned error") - end - call_ok = true - - -- if the callback isn't called this test will just hang :shrug: -end -unittests.register("test_dynamic_media", test_dynamic_media, {async=true, player=true}) - -local function test_v3f_metatable(player) - assert(vector.check(player:get_pos())) -end -unittests.register("test_v3f_metatable", test_v3f_metatable, {player=true}) - -local function test_v3s16_metatable(player, pos) - local node = minetest.get_node(pos) - local found_pos = minetest.find_node_near(pos, 0, node.name, true) - assert(vector.check(found_pos)) -end -unittests.register("test_v3s16_metatable", test_v3s16_metatable, {map=true}) - -local function test_clear_meta(_, pos) - local ref = core.get_meta(pos) - - for way = 1, 3 do - ref:set_string("foo", "bar") - assert(ref:contains("foo")) - - if way == 1 then - ref:from_table({}) - elseif way == 2 then - ref:from_table(nil) - else - ref:set_string("foo", "") - end - - assert(#core.find_nodes_with_meta(pos, pos) == 0, "clearing failed " .. way) - end -end -unittests.register("test_clear_meta", test_clear_meta, {map=true}) - -local on_punch_called -minetest.register_on_punchnode(function() - on_punch_called = true -end) -unittests.register("test_punch_node", function(_, pos) - minetest.place_node(pos, {name="basenodes:dirt"}) - on_punch_called = false - minetest.punch_node(pos) - minetest.remove_node(pos) - -- currently failing: assert(on_punch_called) -end, {map=true}) diff --git a/games/devtest/mods/unittests/mod.conf b/games/devtest/mods/unittests/mod.conf deleted file mode 100644 index fa94e01..0000000 --- a/games/devtest/mods/unittests/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = unittests -description = Adds automated unit tests for the engine -depends = basenodes diff --git a/games/devtest/mods/unittests/player.lua b/games/devtest/mods/unittests/player.lua deleted file mode 100644 index fa05579..0000000 --- a/games/devtest/mods/unittests/player.lua +++ /dev/null @@ -1,70 +0,0 @@ --- --- HP Change Reasons --- -local expect = nil -minetest.register_on_player_hpchange(function(player, hp, reason) - if expect == nil 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_hpchangereason_tests(player) - local old_hp = player:get_hp() - - player:set_hp(20) - expect = { type = "set_hp", from = "mod" } - player:set_hp(3) - assert(expect == nil) - - expect = { a = 234, type = "set_hp", from = "mod" } - player:set_hp(7, { a= 234 }) - assert(expect == nil) - - expect = { df = 3458973454, type = "fall", from = "mod" } - player:set_hp(10, { type = "fall", df = 3458973454 }) - assert(expect == nil) - - player:set_hp(old_hp) -end -unittests.register("test_hpchangereason", run_hpchangereason_tests, {player=true}) - --- --- Player meta --- -local function run_player_meta_tests(player) - local meta = player:get_meta() - meta:set_string("foo", "bar") - assert(meta:contains("foo")) - assert(meta:get_string("foo") == "bar") - assert(meta:get("foo") == "bar") - - local meta2 = player:get_meta() - assert(meta2:get_string("foo") == "bar") - assert(meta2:get("foo") == "bar") - assert(meta:equals(meta2)) - - meta:set_string("bob", "dillan") - assert(meta:get_string("foo") == "bar") - assert(meta:get_string("bob") == "dillan") - assert(meta:get("bob") == "dillan") - assert(meta2:get_string("foo") == "bar") - assert(meta2:get_string("bob") == "dillan") - assert(meta2:get("bob") == "dillan") - assert(meta:equals(meta2)) - - meta:set_string("foo", "") - assert(not meta:contains("foo")) - assert(meta:get("foo") == nil) - assert(meta:get_string("foo") == "") - assert(meta:equals(meta2)) -end -unittests.register("test_player_meta", run_player_meta_tests, {player=true}) diff --git a/games/devtest/mods/unittests/textures/default_dirt.png b/games/devtest/mods/unittests/textures/default_dirt.png deleted file mode 100644 index 58670305d007716c3fee12b45e8acf301cbd4c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 790 zcmV+x1L^#UP)+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 diff --git a/games/devtest/mods/unittests/textures/unittests_coal_lump.png b/games/devtest/mods/unittests/textures/unittests_coal_lump.png deleted file mode 100644 index f460d909ef35804cd8d640574bf879646947ef97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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!p7f8d@ zBeIx*fm;}a85w5HkpK!x1o(uw{{R0!H#gVQ(^Ex71tnbg3%hpqpdaC;=Nl9+Ty&mrSj_s3lft2$!D z1@*3N%En1LybLN)qN~4p-jD%W#^CAd=d#Wzp$Py& C$1{-t diff --git a/games/devtest/mods/unittests/textures/unittests_repairable_tool.png b/games/devtest/mods/unittests/textures/unittests_repairable_tool.png deleted file mode 100644 index 46fbbaa74530c32ef3b02fb0e4fdd7f606fb4ef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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| diff --git a/games/devtest/mods/unittests/textures/unittests_steel_ingot.png b/games/devtest/mods/unittests/textures/unittests_steel_ingot.png deleted file mode 100644 index 6977696a23832867b5c0499997dfcfc0d71777db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/unittests/textures/unittests_unrepairable_tool.png b/games/devtest/mods/unittests/textures/unittests_unrepairable_tool.png deleted file mode 100644 index c676213a5de29a6e3c656f29bead261595ed63ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/games/devtest/mods/util_commands/init.lua b/games/devtest/mods/util_commands/init.lua deleted file mode 100644 index c373640..0000000 --- a/games/devtest/mods/util_commands/init.lua +++ /dev/null @@ -1,309 +0,0 @@ -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_on_joinplayer(function(player) - player:set_properties({zoom_fov = 15}) -end) - -minetest.register_chatcommand("zoomfov", { - 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.is_creative_enabled("") -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, -}) - -minetest.register_chatcommand("use_tool", { - params = "(dig ) | (hit ) []", - description = "Apply tool wear a number of times, as if it were used for digging", - func = function(name, param) - local player = minetest.get_player_by_name(name) - if not player then - return false, "No player." - end - local mode, group, level, uses = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+) (%d+)") - if not mode then - mode, group, level = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+)") - uses = 1 - end - if not mode or not group or not level then - return false - end - if mode ~= "dig" and mode ~= "hit" then - return false - end - local tool = player:get_wielded_item() - local caps = tool:get_tool_capabilities() - if not caps or tool:get_count() == 0 then - return false, "No tool in hand." - end - local actual_uses = 0 - for u=1, uses do - local wear = tool:get_wear() - local dp - if mode == "dig" then - dp = minetest.get_dig_params({[group]=3, level=level}, caps, wear) - else - dp = minetest.get_hit_params({[group]=100}, caps, level, wear) - end - tool:add_wear(dp.wear) - actual_uses = actual_uses + 1 - if tool:get_count() == 0 then - break - end - end - player:set_wielded_item(tool) - if tool:get_count() == 0 then - return true, string.format("Tool used %d time(s). ".. - "The tool broke after %d use(s).", uses, actual_uses) - else - local wear = tool:get_wear() - return true, string.format("Tool used %d time(s). ".. - "Final wear=%d", uses, wear) - end - end, -}) - - - --- Use this to test waypoint capabilities -minetest.register_chatcommand("test_waypoints", { - params = "[change_immediate]", - description = "tests waypoint capabilities", - func = function(name, params) - local player = minetest.get_player_by_name(name) - local regular = player:hud_add { - hud_elem_type = "waypoint", - name = "regular waypoint", - text = "m", - number = 0xFF0000, - world_pos = vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0}) - } - local reduced_precision = player:hud_add { - hud_elem_type = "waypoint", - name = "better waypoint", - text = "m (0.5 steps, precision = 2)", - precision = 10, - number = 0xFFFF00, - world_pos = vector.add(player:get_pos(), {x = 0, y = 1, z = 0}) - } - local function change() - if regular then - player:hud_change(regular, "world_pos", vector.add(player:get_pos(), {x = 0, y = 3, z = 0})) - end - if reduced_precision then - player:hud_change(reduced_precision, "precision", 2) - end - end - if params ~= "" then - -- change immediate - change() - else - minetest.after(0.5, change) - end - regular = regular or "error" - reduced_precision = reduced_precision or "error" - local hidden_distance = player:hud_add { - hud_elem_type = "waypoint", - name = "waypoint with hidden distance", - text = "this text is hidden as well (precision = 0)", - precision = 0, - number = 0x0000FF, - world_pos = vector.add(player:get_pos(), {x = 0, y = 0.5, z = 0}) - } or "error" - local image_waypoint = player:hud_add { - hud_elem_type = "image_waypoint", - text = "wieldhand.png", - world_pos = player:get_pos(), - scale = {x = 10, y = 10}, - offset = {x = 0, y = -32} - } or "error" - minetest.chat_send_player(name, "Waypoint IDs: regular: " .. regular .. ", reduced precision: " .. reduced_precision .. - ", hidden distance: " .. hidden_distance .. ", image waypoint: " .. image_waypoint) - 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 - -minetest.register_chatcommand("set_displayed_itemcount", { - params = "(-s \"\" [-c ]) | -a ", - description = "Set the displayed itemcount of the wielded item", - func = function(name, param) - local player = minetest.get_player_by_name(name) - local item = player:get_wielded_item() - local meta = item:get_meta() - local flag1 = param:sub(1, 2) - if flag1 == "-s" then - if param:sub(3, 4) ~= " \"" then - return false, "Error: Space and string with \"s expected after -s." - end - local se = param:find("\"", 5, true) - if not se then - return false, "Error: String with two \"s expected after -s." - end - local s = param:sub(5, se - 1) - if param:sub(se + 1, se + 4) == " -c " then - s = minetest.colorize(param:sub(se + 5), s) - end - meta:set_string("count_meta", s) - elseif flag1 == "-a" then - local num = tonumber(param:sub(4)) - if not num then - return false, "Error: Invalid number: "..param:sub(4) - end - meta:set_int("count_alignment", num) - else - return false - end - player:set_wielded_item(item) - return true, "Displayed itemcount set." - end, -}) - -minetest.register_chatcommand("dump_item", { - params = "", - description = "Prints a dump of the wielded item in table form", - func = function(name, param) - local player = minetest.get_player_by_name(name) - local item = player:get_wielded_item() - local str = dump(item:to_table()) - print(str) - return true, str - end, -}) - --- shadow control -minetest.register_on_joinplayer(function (player) - player:set_lighting({shadows={intensity = 0.33}}) -end) - -core.register_chatcommand("set_shadow", { - params = "", - description = "Set shadow parameters of current player.", - func = function(player_name, param) - local shadow_intensity = tonumber(param) - minetest.get_player_by_name(player_name):set_lighting({shadows = { intensity = shadow_intensity} }) - end -}) diff --git a/games/devtest/mods/util_commands/mod.conf b/games/devtest/mods/util_commands/mod.conf deleted file mode 100644 index fea6dd3..0000000 --- a/games/devtest/mods/util_commands/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = util_commands -description = Random server commands to make testing easier and more convenient diff --git a/games/devtest/screenshot.png b/games/devtest/screenshot.png deleted file mode 100644 index 7324883f6c29aafd8e50f3eac6c8515c8e39b866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133364 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

4%yUDEE|K!g0i|NJd+q22I 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 |6GO9W4VB4JgCbKLjfAXx8c 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 i83Y=qUNv#v{vQDd5?!>&%R(Li0000