From f11f05a7bbca9c3f8dbbb5bcb9c68186b299ac43 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 19 Dec 2024 12:55:40 +0100 Subject: [PATCH] first_try_to_update_after_years --- README.md | 2 +- config-file-example | 3 +- mods-download | 58 +- mods-list | 50 +- mods/3d_armor/.ldoc/crafting.luadoc | 39 + mods/3d_armor/.ldoc/gendoc.sh | 8 +- mods/3d_armor/.ldoc/parse_crafts.py | 46 - mods/3d_armor/.luacheckrc | 1 + mods/3d_armor/3d_armor/LICENSE.txt | 26 - mods/3d_armor/3d_armor/README.md | 14 +- mods/3d_armor/3d_armor/api.lua | 42 +- mods/3d_armor/3d_armor/armor.conf.example | 4 - mods/3d_armor/3d_armor/armor.lua | 1027 --- mods/3d_armor/3d_armor/depends.txt | 9 - mods/3d_armor/3d_armor/description.txt | 1 - mods/3d_armor/3d_armor/init.lua | 158 +- mods/3d_armor/3d_armor/locale/3d_armor.de.tr | 65 +- mods/3d_armor/3d_armor/locale/3d_armor.eo.tr | 7 + mods/3d_armor/3d_armor/locale/3d_armor.es.tr | 63 +- mods/3d_armor/3d_armor/locale/3d_armor.fr.tr | 63 +- mods/3d_armor/3d_armor/locale/3d_armor.it.tr | 91 +- mods/3d_armor/3d_armor/locale/3d_armor.ms.tr | 91 +- mods/3d_armor/3d_armor/locale/3d_armor.pl.tr | 7 + mods/3d_armor/3d_armor/locale/3d_armor.pt.tr | 91 +- .../3d_armor/locale/3d_armor.pt_BR.tr | 91 +- mods/3d_armor/3d_armor/locale/3d_armor.ru.tr | 86 +- mods/3d_armor/3d_armor/locale/3d_armor.sv.tr | 7 + mods/3d_armor/3d_armor/locale/template.txt | 63 +- mods/3d_armor/3d_armor/mod.conf | 5 +- .../3d_armor/textures/3d_armor_trans.png | Bin 274 -> 0 bytes .../3d_armor/textures/preview_index.txt | 49 - mods/3d_armor/3d_armor_ip/LICENSE.txt | 18 - mods/3d_armor/3d_armor_ip/depends.txt | 2 - mods/3d_armor/3d_armor_ip/description.txt | 1 - mods/3d_armor/3d_armor_ip/init.lua | 2 +- .../3d_armor_ip/locale/3d_armor_ip.de.tr | 3 + .../3d_armor_ip/locale/3d_armor_ip.eo.tr | 3 + .../3d_armor_ip/locale/3d_armor_ip.fr.tr | 7 +- .../3d_armor_ip/locale/3d_armor_ip.pt_BR.tr | 3 + .../3d_armor_ip/locale/3d_armor_ip.sv.tr | 3 + mods/3d_armor/3d_armor_ip/locale/template.txt | 7 +- mods/3d_armor/3d_armor_sfinv/LICENSE.txt | 18 - mods/3d_armor/3d_armor_sfinv/depends.txt | 2 - mods/3d_armor/3d_armor_sfinv/description.txt | 1 - mods/3d_armor/3d_armor_sfinv/init.lua | 2 +- .../locale/3d_armor_sfinv.de.tr | 2 + .../locale/3d_armor_sfinv.eo.tr | 2 + .../locale/3d_armor_sfinv.es.tr | 5 - .../locale/3d_armor_sfinv.fr.tr | 5 - .../locale/3d_armor_sfinv.pt_BR.tr | 2 + .../locale/3d_armor_sfinv.sv.tr | 2 + .../3d_armor_sfinv/locale/template.txt | 5 - mods/3d_armor/3d_armor_stand/LICENSE.txt | 43 - mods/3d_armor/3d_armor_stand/depends.txt | 2 - mods/3d_armor/3d_armor_stand/init.lua | 124 +- .../locale/3d_armor_stand.de.tr | 5 + .../locale/3d_armor_stand.eo.tr | 5 + .../locale/3d_armor_stand.es.tr | 6 + .../locale/3d_armor_stand.fr.tr | 9 +- .../locale/3d_armor_stand.pt_BR.tr | 5 + .../locale/3d_armor_stand.ru.tr | 5 + .../locale/3d_armor_stand.sv.tr | 5 + .../3d_armor_stand/locale/template.txt | 10 +- .../models/3d_armor_stand_shared.png | Bin 0 -> 1011 bytes mods/3d_armor/3d_armor_ui/LICENSE.txt | 18 - mods/3d_armor/3d_armor_ui/description.txt | 1 - mods/3d_armor/3d_armor_ui/init.lua | 5 +- .../3d_armor_ui/locale/3d_armor_ui.de.tr | 8 + .../3d_armor_ui/locale/3d_armor_ui.eo.tr | 8 + .../3d_armor_ui/locale/3d_armor_ui.fr.tr | 12 +- .../3d_armor_ui/locale/3d_armor_ui.pt_BR.tr | 8 + .../3d_armor_ui/locale/3d_armor_ui.sv.tr | 8 + mods/3d_armor/3d_armor_ui/locale/template.txt | 12 +- mods/3d_armor/LICENSE.md | 4 +- mods/3d_armor/README.md | 25 +- mods/3d_armor/armor_admin/init.lua | 94 + .../armor_admin/locale/armor_admin.de.tr | 5 + .../armor_admin/locale/armor_admin.eo.tr | 5 + .../armor_admin/locale/armor_admin.es.tr | 5 + .../armor_admin/locale/armor_admin.fr.tr | 5 + .../armor_admin/locale/armor_admin.it.tr | 5 + .../armor_admin/locale/armor_admin.ms.tr | 5 + .../armor_admin/locale/armor_admin.pt.tr | 5 + .../armor_admin/locale/armor_admin.pt_BR.tr | 5 + .../armor_admin/locale/armor_admin.ru.tr | 5 + .../armor_admin/locale/armor_admin.sv.tr | 5 + mods/3d_armor/armor_admin/locale/template.txt | 5 + mods/3d_armor/armor_admin/mod.conf | 3 + .../textures/3d_armor_boots_admin.png | Bin .../textures/3d_armor_boots_admin_preview.png | Bin .../textures/3d_armor_chestplate_admin.png | Bin .../3d_armor_chestplate_admin_preview.png | Bin .../textures/3d_armor_helmet_admin.png | Bin .../3d_armor_helmet_admin_preview.png | Bin .../textures/3d_armor_inv_boots_admin.png | Bin .../3d_armor_inv_chestplate_admin.png | Bin .../textures/3d_armor_inv_helmet_admin.png | Bin .../textures/3d_armor_inv_leggings_admin.png | Bin .../textures/3d_armor_leggings_admin.png | Bin .../3d_armor_leggings_admin_preview.png | Bin mods/3d_armor/armor_bronze/init.lua | 180 + .../armor_bronze/locale/armor_bronze.de.tr | 5 + .../armor_bronze/locale/armor_bronze.eo.tr | 5 + .../armor_bronze/locale/armor_bronze.es.tr | 5 + .../armor_bronze/locale/armor_bronze.fr.tr | 5 + .../armor_bronze/locale/armor_bronze.it.tr | 5 + .../armor_bronze/locale/armor_bronze.ms.tr | 5 + .../armor_bronze/locale/armor_bronze.pt.tr | 5 + .../armor_bronze/locale/armor_bronze.pt_BR.tr | 5 + .../armor_bronze/locale/armor_bronze.ru.tr | 5 + .../armor_bronze/locale/armor_bronze.sv.tr | 5 + .../3d_armor/armor_bronze/locale/template.txt | 5 + mods/3d_armor/armor_bronze/mod.conf | 3 + .../textures/3d_armor_boots_bronze.png | Bin .../3d_armor_boots_bronze_preview.png | Bin .../textures/3d_armor_chestplate_bronze.png | Bin .../3d_armor_chestplate_bronze_preview.png | Bin .../textures/3d_armor_helmet_bronze.png | Bin .../3d_armor_helmet_bronze_preview.png | Bin .../textures/3d_armor_inv_boots_bronze.png | Bin .../3d_armor_inv_chestplate_bronze.png | Bin .../textures/3d_armor_inv_helmet_bronze.png | Bin .../textures/3d_armor_inv_leggings_bronze.png | Bin .../textures/3d_armor_leggings_bronze.png | Bin .../3d_armor_leggings_bronze_preview.png | Bin mods/3d_armor/armor_cactus/init.lua | 183 + .../armor_cactus/locale/armor_cactus.de.tr | 5 + .../armor_cactus/locale/armor_cactus.eo.tr | 5 + .../armor_cactus/locale/armor_cactus.es.tr | 5 + .../armor_cactus/locale/armor_cactus.fr.tr | 5 + .../armor_cactus/locale/armor_cactus.it.tr | 5 + .../armor_cactus/locale/armor_cactus.ms.tr | 5 + .../armor_cactus/locale/armor_cactus.pt.tr | 5 + .../armor_cactus/locale/armor_cactus.pt_BR.tr | 5 + .../armor_cactus/locale/armor_cactus.ru.tr | 5 + .../armor_cactus/locale/armor_cactus.sv.tr | 5 + .../3d_armor/armor_cactus/locale/template.txt | 5 + mods/3d_armor/armor_cactus/mod.conf | 3 + .../textures/3d_armor_boots_cactus.png | Bin .../3d_armor_boots_cactus_preview.png | Bin .../textures/3d_armor_chestplate_cactus.png | Bin .../3d_armor_chestplate_cactus_preview.png | Bin .../textures/3d_armor_helmet_cactus.png | Bin .../3d_armor_helmet_cactus_preview.png | Bin .../textures/3d_armor_inv_boots_cactus.png | Bin .../3d_armor_inv_chestplate_cactus.png | Bin .../textures/3d_armor_inv_helmet_cactus.png | Bin .../textures/3d_armor_inv_leggings_cactus.png | Bin .../textures/3d_armor_leggings_cactus.png | Bin .../3d_armor_leggings_cactus_preview.png | Bin mods/3d_armor/armor_crystal/init.lua | 169 + .../armor_crystal/locale/armor_crystal.de.tr | 5 + .../armor_crystal/locale/armor_crystal.eo.tr | 5 + .../armor_crystal/locale/armor_crystal.es.tr | 5 + .../armor_crystal/locale/armor_crystal.fr.tr | 5 + .../armor_crystal/locale/armor_crystal.it.tr | 5 + .../armor_crystal/locale/armor_crystal.ms.tr | 5 + .../armor_crystal/locale/armor_crystal.pt.tr | 5 + .../locale/armor_crystal.pt_BR.tr | 5 + .../armor_crystal/locale/armor_crystal.ru.tr | 5 + .../armor_crystal/locale/armor_crystal.sv.tr | 5 + .../armor_crystal/locale/template.txt | 5 + mods/3d_armor/armor_crystal/mod.conf | 4 + .../textures/3d_armor_boots_crystal.png | Bin .../3d_armor_boots_crystal_preview.png | Bin .../textures/3d_armor_chestplate_crystal.png | Bin .../3d_armor_chestplate_crystal_preview.png | Bin .../textures/3d_armor_helmet_crystal.png | Bin .../3d_armor_helmet_crystal_preview.png | Bin .../textures/3d_armor_inv_boots_crystal.png | Bin .../3d_armor_inv_chestplate_crystal.png | Bin .../textures/3d_armor_inv_helmet_crystal.png | Bin .../3d_armor_inv_leggings_crystal.png | Bin .../textures/3d_armor_leggings_crystal.png | Bin .../3d_armor_leggings_crystal_preview.png | Bin mods/3d_armor/armor_diamond/init.lua | 166 + .../armor_diamond/locale/armor_diamond.de.tr | 5 + .../armor_diamond/locale/armor_diamond.eo.tr | 5 + .../armor_diamond/locale/armor_diamond.es.tr | 5 + .../armor_diamond/locale/armor_diamond.fr.tr | 5 + .../armor_diamond/locale/armor_diamond.it.tr | 5 + .../armor_diamond/locale/armor_diamond.ms.tr | 5 + .../armor_diamond/locale/armor_diamond.pt.tr | 5 + .../locale/armor_diamond.pt_BR.tr | 5 + .../armor_diamond/locale/armor_diamond.ru.tr | 5 + .../armor_diamond/locale/armor_diamond.sv.tr | 5 + .../armor_diamond/locale/template.txt | 5 + mods/3d_armor/armor_diamond/mod.conf | 3 + .../textures/3d_armor_boots_diamond.png | Bin .../3d_armor_boots_diamond_preview.png | Bin .../textures/3d_armor_chestplate_diamond.png | Bin .../3d_armor_chestplate_diamond_preview.png | Bin .../textures/3d_armor_helmet_diamond.png | Bin .../3d_armor_helmet_diamond_preview.png | Bin .../textures/3d_armor_inv_boots_diamond.png | Bin .../3d_armor_inv_chestplate_diamond.png | Bin .../textures/3d_armor_inv_helmet_diamond.png | Bin .../3d_armor_inv_leggings_diamond.png | Bin .../textures/3d_armor_leggings_diamond.png | Bin .../3d_armor_leggings_diamond_preview.png | Bin mods/3d_armor/armor_gold/init.lua | 183 + .../armor_gold/locale/armor_gold.de.tr | 5 + .../armor_gold/locale/armor_gold.eo.tr | 5 + .../armor_gold/locale/armor_gold.es.tr | 5 + .../armor_gold/locale/armor_gold.fr.tr | 5 + .../armor_gold/locale/armor_gold.it.tr | 5 + .../armor_gold/locale/armor_gold.ms.tr | 5 + .../armor_gold/locale/armor_gold.pt.tr | 5 + .../armor_gold/locale/armor_gold.pt_BR.tr | 5 + .../armor_gold/locale/armor_gold.ru.tr | 5 + .../armor_gold/locale/armor_gold.sv.tr | 5 + mods/3d_armor/armor_gold/locale/template.txt | 5 + mods/3d_armor/armor_gold/mod.conf | 3 + .../textures/3d_armor_boots_gold.png | Bin .../textures/3d_armor_boots_gold_preview.png | Bin .../textures/3d_armor_chestplate_gold.png | Bin .../3d_armor_chestplate_gold_preview.png | Bin .../textures/3d_armor_helmet_gold.png | Bin .../textures/3d_armor_helmet_gold_preview.png | Bin .../textures/3d_armor_inv_boots_gold.png | Bin .../textures/3d_armor_inv_chestplate_gold.png | Bin .../textures/3d_armor_inv_helmet_gold.png | Bin .../textures/3d_armor_inv_leggings_gold.png | Bin .../textures/3d_armor_leggings_gold.png | Bin .../3d_armor_leggings_gold_preview.png | Bin mods/3d_armor/armor_mithril/init.lua | 162 + .../armor_mithril/locale/armor_mithril.de.tr | 5 + .../armor_mithril/locale/armor_mithril.eo.tr | 5 + .../armor_mithril/locale/armor_mithril.es.tr | 5 + .../armor_mithril/locale/armor_mithril.fr.tr | 5 + .../armor_mithril/locale/armor_mithril.it.tr | 5 + .../armor_mithril/locale/armor_mithril.ms.tr | 5 + .../armor_mithril/locale/armor_mithril.pt.tr | 5 + .../locale/armor_mithril.pt_BR.tr | 5 + .../armor_mithril/locale/armor_mithril.ru.tr | 5 + .../armor_mithril/locale/armor_mithril.sv.tr | 5 + .../armor_mithril/locale/template.txt | 5 + mods/3d_armor/armor_mithril/mod.conf | 4 + .../textures/3d_armor_boots_mithril.png | Bin .../3d_armor_boots_mithril_preview.png | Bin .../textures/3d_armor_chestplate_mithril.png | Bin .../3d_armor_chestplate_mithril_preview.png | Bin .../textures/3d_armor_helmet_mithril.png | Bin .../3d_armor_helmet_mithril_preview.png | Bin .../textures/3d_armor_inv_boots_mithril.png | Bin .../3d_armor_inv_chestplate_mithril.png | Bin .../textures/3d_armor_inv_helmet_mithril.png | Bin .../3d_armor_inv_leggings_mithril.png | Bin .../textures/3d_armor_leggings_mithril.png | Bin .../3d_armor_leggings_mithril_preview.png | Bin mods/3d_armor/armor_nether/init.lua | 168 + .../armor_nether/locale/armor_nether.de.tr | 5 + .../armor_nether/locale/armor_nether.eo.tr | 5 + .../armor_nether/locale/armor_nether.es.tr | 5 + .../armor_nether/locale/armor_nether.fr.tr | 5 + .../armor_nether/locale/armor_nether.it.tr | 5 + .../armor_nether/locale/armor_nether.ms.tr | 5 + .../armor_nether/locale/armor_nether.pt.tr | 5 + .../armor_nether/locale/armor_nether.pt_BR.tr | 5 + .../armor_nether/locale/armor_nether.ru.tr | 5 + .../armor_nether/locale/armor_nether.sv.tr | 5 + .../3d_armor/armor_nether/locale/template.txt | 5 + mods/3d_armor/armor_nether/mod.conf | 4 + .../textures/3d_armor_boots_nether.png | Bin .../3d_armor_boots_nether_preview.png | Bin .../textures/3d_armor_chestplate_nether.png | Bin .../3d_armor_chestplate_nether_preview.png | Bin .../textures/3d_armor_helmet_nether.png | Bin .../3d_armor_helmet_nether_preview.png | Bin .../textures/3d_armor_inv_boots_nether.png | Bin .../3d_armor_inv_chestplate_nether.png | Bin .../textures/3d_armor_inv_helmet_nether.png | Bin .../textures/3d_armor_inv_leggings_nether.png | Bin .../textures/3d_armor_leggings_nether.png | Bin .../3d_armor_leggings_nether_preview.png | Bin mods/3d_armor/armor_steel/init.lua | 181 + .../armor_steel/locale/armor_steel.de.tr | 5 + .../armor_steel/locale/armor_steel.eo.tr | 5 + .../armor_steel/locale/armor_steel.es.tr | 5 + .../armor_steel/locale/armor_steel.fr.tr | 5 + .../armor_steel/locale/armor_steel.it.tr | 5 + .../armor_steel/locale/armor_steel.ms.tr | 5 + .../armor_steel/locale/armor_steel.pt.tr | 5 + .../armor_steel/locale/armor_steel.pt_BR.tr | 5 + .../armor_steel/locale/armor_steel.ru.tr | 5 + .../armor_steel/locale/armor_steel.sv.tr | 5 + mods/3d_armor/armor_steel/locale/template.txt | 5 + mods/3d_armor/armor_steel/mod.conf | 3 + .../textures/3d_armor_boots_steel.png | Bin .../textures/3d_armor_boots_steel_preview.png | Bin .../textures/3d_armor_chestplate_steel.png | Bin .../3d_armor_chestplate_steel_preview.png | Bin .../textures/3d_armor_helmet_steel.png | Bin .../3d_armor_helmet_steel_preview.png | Bin .../textures/3d_armor_inv_boots_steel.png | Bin .../3d_armor_inv_chestplate_steel.png | Bin .../textures/3d_armor_inv_helmet_steel.png | Bin .../textures/3d_armor_inv_leggings_steel.png | Bin .../textures/3d_armor_leggings_steel.png | Bin .../3d_armor_leggings_steel_preview.png | Bin mods/3d_armor/armor_wood/init.lua | 186 + .../armor_wood/locale/armor_wood.de.tr | 5 + .../armor_wood/locale/armor_wood.eo.tr | 5 + .../armor_wood/locale/armor_wood.es.tr | 5 + .../armor_wood/locale/armor_wood.fr.tr | 5 + .../armor_wood/locale/armor_wood.it.tr | 5 + .../armor_wood/locale/armor_wood.ms.tr | 5 + .../armor_wood/locale/armor_wood.pt.tr | 5 + .../armor_wood/locale/armor_wood.pt_BR.tr | 5 + .../armor_wood/locale/armor_wood.ru.tr | 5 + .../armor_wood/locale/armor_wood.sv.tr | 5 + mods/3d_armor/armor_wood/locale/template.txt | 5 + mods/3d_armor/armor_wood/mod.conf | 3 + .../textures/3d_armor_boots_wood.png | Bin .../textures/3d_armor_boots_wood_preview.png | Bin .../textures/3d_armor_chestplate_wood.png | Bin .../3d_armor_chestplate_wood_preview.png | Bin .../textures/3d_armor_helmet_wood.png | Bin .../textures/3d_armor_helmet_wood_preview.png | Bin .../textures/3d_armor_inv_boots_wood.png | Bin .../textures/3d_armor_inv_chestplate_wood.png | Bin .../textures/3d_armor_inv_helmet_wood.png | Bin .../textures/3d_armor_inv_leggings_wood.png | Bin .../textures/3d_armor_leggings_wood.png | Bin .../3d_armor_leggings_wood_preview.png | Bin mods/3d_armor/cc-by-sa-3.0.txt | 359 + mods/3d_armor/description.txt | 1 - mods/3d_armor/lgpl-2.1.md | 503 ++ mods/3d_armor/modpack.conf | 2 + mods/3d_armor/settingtypes.txt | 4 - mods/3d_armor/shields/LICENSE.txt | 26 - mods/3d_armor/shields/depends.txt | 2 - mods/3d_armor/shields/description.txt | 1 - mods/3d_armor/shields/init.lua | 4 +- mods/3d_armor/shields/locale/shields.de.tr | 18 +- mods/3d_armor/shields/locale/shields.eo.tr | 13 + mods/3d_armor/shields/locale/shields.es.tr | 13 + mods/3d_armor/shields/locale/shields.fr.tr | 20 +- mods/3d_armor/shields/locale/shields.pt_BR.tr | 13 + mods/3d_armor/shields/locale/shields.ru.tr | 13 + mods/3d_armor/shields/locale/shields.sv.tr | 13 + mods/3d_armor/shields/locale/template.txt | 20 +- mods/3d_armor/wieldview/LICENSE.txt | 18 - mods/3d_armor/wieldview/depends.txt | 1 - mods/3d_armor/wieldview/description.txt | 1 - mods/3d_armor/wieldview/get_texture.lua | 215 + mods/3d_armor/wieldview/init.lua | 19 +- mods/Minetest-WorldEdit/.luacheckrc | 28 + mods/Minetest-WorldEdit/.util/run_tests.sh | 40 +- mods/Minetest-WorldEdit/ChatCommands.md | 14 +- mods/Minetest-WorldEdit/README.md | 2 +- mods/Minetest-WorldEdit/WorldEdit API.md | 14 +- mods/Minetest-WorldEdit/modpack.conf | 1 + mods/Minetest-WorldEdit/settingtypes.txt | 4 + mods/Minetest-WorldEdit/worldedit/code.lua | 32 +- mods/Minetest-WorldEdit/worldedit/common.lua | 104 +- .../worldedit/compatibility.lua | 11 +- mods/Minetest-WorldEdit/worldedit/cuboid.lua | 53 +- mods/Minetest-WorldEdit/worldedit/init.lua | 3 +- .../worldedit/manipulations.lua | 406 +- .../worldedit/primitives.lua | 61 +- .../worldedit/serialization.lua | 50 +- .../worldedit/{test.lua => test/init.lua} | 180 +- .../worldedit/test/manipulations.lua | 121 + .../worldedit/test/primitives.lua | 59 + .../worldedit/test/schematic.lua | 162 + .../worldedit/textures/worldedit_wand.png | Bin 442 -> 0 bytes .../worldedit/transformations.lua | 357 + .../worldedit/visualization.lua | 4 +- .../worldedit_brush/init.lua | 57 +- .../worldedit_brush/locale/template.txt | 12 + .../locale/worldedit_brush.de.tr | 12 + .../textures/worldedit_brush.png | Bin 337 -> 301 bytes .../worldedit_commands/code.lua | 59 + .../worldedit_commands/cuboid.lua | 51 +- .../worldedit_commands/init.lua | 1713 +---- .../worldedit_commands/locale/template.txt | 153 + .../locale/worldedit_commands.de.tr | 164 + .../locale/worldedit_commands.ru.tr | 155 + .../worldedit_commands/manipulations.lua | 366 + .../{mark.lua => marker.lua} | 21 +- .../worldedit_commands/nodename.lua | 85 + .../worldedit_commands/primitives.lua | 276 + .../worldedit_commands/region.lua | 234 + .../worldedit_commands/safe.lua | 29 +- .../worldedit_commands/schematics.lua | 284 + .../textures/worldedit_cube.png | Bin 147 -> 79 bytes .../textures/worldedit_pos1.png | Bin 142 -> 100 bytes .../textures/worldedit_pos2.png | Bin 157 -> 112 bytes .../textures/worldedit_wand.png | Bin 0 -> 303 bytes .../worldedit_commands/transform.lua | 269 + .../worldedit_commands/wand.lua | 15 +- .../worldedit_gui/functionality.lua | 2 +- .../Minetest-WorldEdit/worldedit_gui/init.lua | 18 +- .../textures/inventory_plus_worldedit_gui.png | Bin 21724 -> 20864 bytes .../textures/worldedit_gui_unknown.png | Bin 597 -> 382 bytes mods/advtrains/.build.yml | 14 +- mods/advtrains/README.md | 3 +- mods/advtrains/advtrains/api_doc.txt | 7 + mods/advtrains/advtrains/atc.lua | 8 +- mods/advtrains/advtrains/copytool.lua | 18 +- mods/advtrains/advtrains/couple.lua | 45 +- mods/advtrains/advtrains/craft_items.lua | 2 +- mods/advtrains/advtrains/crafting.lua | 17 + mods/advtrains/advtrains/debugitems.lua | 30 + mods/advtrains/advtrains/init.lua | 41 +- mods/advtrains/advtrains/locale/README.md | 1 + .../advtrains/locale/advtrains.de.tr | 77 - .../advtrains/locale/advtrains.zh_CN.tr | 107 - mods/advtrains/advtrains/occupation.lua | 144 +- mods/advtrains/advtrains/path.lua | 24 +- mods/advtrains/advtrains/po/README.md | 70 + mods/advtrains/advtrains/po/advtrains.pot | 632 ++ mods/advtrains/advtrains/po/de.po | 724 ++ mods/advtrains/advtrains/po/fr.po | 728 ++ .../advtrains/po/update-translations.sh | 28 + mods/advtrains/advtrains/po/zh_CN.po | 696 ++ mods/advtrains/advtrains/po/zh_TW.po | 696 ++ mods/advtrains/advtrains/poconvert.lua | 185 + mods/advtrains/advtrains/protection.lua | 14 +- mods/advtrains/advtrains/settingtypes.txt | 3 + mods/advtrains/advtrains/signals.lua | 13 +- .../sounds/advtrains_crossing_bell.ogg | Bin 47722 -> 24656 bytes .../advtrains/spec/poconvert_spec.lua | 70 + .../advtrains/advtrains/spec/texture_spec.lua | 19 + mods/advtrains/advtrains/spec/wagons_spec.lua | 40 + mods/advtrains/advtrains/texture.lua | 228 + .../textures/advtrains_wagon_prop_tool.png | Bin 0 -> 779 bytes mods/advtrains/advtrains/trackplacer.lua | 33 +- mods/advtrains/advtrains/tracks.lua | 17 +- mods/advtrains/advtrains/trainhud.lua | 157 +- mods/advtrains/advtrains/trainlogic.lua | 64 +- mods/advtrains/advtrains/wagonprop_tool.lua | 43 + mods/advtrains/advtrains/wagons.lua | 355 +- .../advtrains_interlocking/database.lua | 9 +- .../advtrains_interlocking/route_prog.lua | 27 +- .../advtrains_interlocking/route_ui.lua | 15 +- .../advtrains_interlocking/routesetting.lua | 9 +- .../advtrains_interlocking/signal_api.lua | 69 +- .../advtrains_interlocking/tcb_ts_ui.lua | 35 +- .../advtrains_interlocking/tsr_rail.lua | 12 +- .../advtrains_line_automation/stoprail.lua | 10 +- .../advtrains_luaautomation/README.md | 45 +- .../advtrains_luaautomation/active_common.lua | 24 +- .../advtrains_luaautomation/atc_rail.lua | 43 +- .../advtrains_luaautomation/environment.lua | 23 +- .../advtrains_luaautomation/init.lua | 6 +- .../mesecon_controller.lua | 3 +- .../operation_panel.lua | 7 +- .../advtrains_luaautomation/pcnaming.lua | 21 +- mods/advtrains/advtrains_signals_ks/init.lua | 25 +- mods/advtrains/advtrains_train_track/init.lua | 559 +- .../advtrains_train_track/settingtypes.txt | 4 + mods/ambience/README.md | 4 + mods/ambience/api.txt | 18 +- mods/ambience/depends.txt | 3 - mods/ambience/description.txt | 1 - mods/ambience/init.lua | 316 +- .../{sounds/SoundLicenses.txt => license.txt} | 191 +- mods/ambience/locale/ambience.eo.tr | 7 + mods/ambience/locale/ambience.es.tr | 7 + mods/ambience/locale/ambience.pl.tr | 7 + mods/ambience/locale/template.txt | 7 + mods/ambience/mod.conf | 4 +- mods/ambience/screenshot.jpg | Bin 0 -> 98108 bytes mods/ambience/screenshot.png | Bin 51812 -> 0 bytes mods/ambience/sounds/bats.ogg | Bin 0 -> 37896 bytes mods/ambience/sounds/icecrack.ogg | Bin 83240 -> 57753 bytes mods/ambience/sounds/jungle_day_1.ogg | Bin 41108 -> 40644 bytes mods/ambience/sounds/swim_splashing.ogg | Bin 21066 -> 0 bytes mods/ambience/soundsets.lua | 307 +- mods/anvils/depends.txt | 9 - mods/anvils/init.lua | 30 +- mods/anvils/mod.conf | 3 + mods/anvils/textures/anvils_anvil_top.png | Bin 191 -> 163 bytes mods/anvils/tools.lua | 89 +- mods/bakedclay/README.md | 4 + mods/bakedclay/depends.txt | 6 - mods/bakedclay/description.txt | 1 - mods/bakedclay/flowers.lua | 135 + mods/bakedclay/init.lua | 392 +- mods/bakedclay/license.txt | 8 + mods/bakedclay/locale/bakedclay.es.tr | 25 + mods/bakedclay/locale/template.txt | 25 + mods/bakedclay/lucky_block.lua | 65 + mods/bakedclay/mod.conf | 5 +- mods/bakedclay/settingtypes.txt | 3 + mods/basic_materials/.luacheckrc | 31 +- mods/basic_materials/README.md | 23 + mods/basic_materials/aliases.lua | 34 + mods/basic_materials/craftitems.lua | 188 + mods/basic_materials/crafts.lua | 441 ++ .../basic_materials/electrical-electronic.lua | 86 - mods/basic_materials/init.lua | 11 +- mods/basic_materials/metals.lua | 300 - mods/basic_materials/misc.lua | 126 - mods/basic_materials/mod.conf | 4 +- mods/basic_materials/nodes.lua | 62 + mods/basic_materials/plastics.lua | 56 - .../textures/basic_materials_aluminum_bar.png | Bin 0 -> 337 bytes .../basic_materials_aluminum_strip.png | Bin 0 -> 383 bytes .../basic_materials_aluminum_wire.png | Bin 0 -> 258 bytes .../basic_materials_carbon_steel_bar.png | Bin 0 -> 292 bytes .../textures/basic_materials_gold_strip.png | Bin 0 -> 358 bytes .../textures/basic_materials_lead_strip.png | Bin 0 -> 366 bytes .../basic_materials_stainless_steel_bar.png | Bin 0 -> 336 bytes .../basic_materials_stainless_steel_strip.png | Bin 0 -> 382 bytes .../basic_materials_stainless_steel_wire.png | Bin 0 -> 280 bytes mods/basic_signs/.luacheckrc | 9 + mods/basic_signs/crafting.lua | 126 +- mods/basic_signs/depends.txt | 3 - mods/basic_signs/init.lua | 21 +- mods/basic_signs/intllib.lua | 45 - mods/basic_signs/locale/basic_signs.de.tr | 14 + mods/basic_signs/locale/basic_signs.es.tr | 14 + mods/basic_signs/locale/basic_signs.fr.tr | 14 + mods/basic_signs/locale/basic_signs.id.tr | 14 + mods/basic_signs/locale/basic_signs.ms.tr | 14 + mods/basic_signs/locale/basic_signs.ru.tr | 15 + mods/basic_signs/locale/de.po | 97 - mods/basic_signs/locale/es.po | 95 - mods/basic_signs/locale/fr.po | 91 - mods/basic_signs/locale/ms.po | 91 - mods/basic_signs/locale/ru.po | 94 - mods/basic_signs/locale/template.pot | 94 - mods/basic_signs/locale/template.txt | 14 + mods/basic_signs/mod.conf | 5 +- .../advtrains_train_industrial/init.lua | 1 + .../advtrains_train_japan/init.lua | 30 + .../advtrains_engine_japan_livery.png | Bin 0 -> 13213 bytes .../textures/advtrains_wagon_japan_livery.png | Bin 0 -> 17772 bytes mods/bees/depends.txt | 3 - mods/bees/description.txt | 1 - mods/bees/init.lua | 353 +- mods/bees/license.txt | 10 + mods/bees/locale/bees.es.tr | 21 + mods/bees/locale/bees.fr.tr | 21 + mods/bees/locale/template.txt | 43 +- mods/bees/mod.conf | 5 +- mods/bees/readme.txt | 6 +- mods/bees/screenshot.jpg | Bin 0 -> 89876 bytes mods/bees/screenshot.png | Bin 19301 -> 0 bytes mods/bees/sounds/bees.1.ogg | Bin 68509 -> 26021 bytes mods/bees/sounds/bees.2.ogg | Bin 28042 -> 11316 bytes mods/bees/sounds/bees.3.ogg | Bin 57883 -> 23057 bytes mods/biome_lib/README.md | 4 +- mods/biome_lib/description.txt | 1 - mods/biome_lib/init.lua | 2 +- mods/biome_lib/mod.conf | 4 +- mods/blox/{LICENSE.txt => LICENSE} | 0 mods/blox/depends.txt | 4 - mods/blox/description.txt | 1 - mods/blox/init.lua | 23 +- mods/blox/mod.conf | 3 + mods/bonemeal/README.md | 214 +- mods/bonemeal/api.txt | 6 +- mods/bonemeal/depends.txt | 11 - mods/bonemeal/description.txt | 1 - mods/bonemeal/init.lua | 411 +- mods/bonemeal/intllib.lua | 45 - mods/bonemeal/license.txt | 3 + mods/bonemeal/locale/bonemeal.de.tr | 1 - mods/bonemeal/locale/bonemeal.en.tr | 1 - mods/bonemeal/locale/bonemeal.es.tr | 1 - mods/bonemeal/locale/bonemeal.fr.tr | 1 - mods/bonemeal/locale/bonemeal.it.tr | 1 - mods/bonemeal/locale/bonemeal.ru.tr | 1 - mods/bonemeal/locale/es.txt | 7 - mods/bonemeal/locale/fr.txt | 7 - mods/bonemeal/locale/it.txt | 7 - mods/bonemeal/locale/ru.txt | 7 - mods/bonemeal/locale/template.txt | 7 - mods/bonemeal/lucky_block.lua | 27 +- mods/bonemeal/mod.conf | 4 +- mods/bonemeal/mods.lua | 288 +- mods/bonemeal/screenshot.jpg | Bin 0 -> 116520 bytes mods/bonemeal/screenshot.png | Bin 15242 -> 0 bytes mods/bonemeal/settingtypes.txt | 2 + mods/bows/arrow.lua | 212 +- mods/bows/depends.txt | 3 - mods/bows/description.txt | 1 - mods/bows/init.lua | 74 +- mods/bows/items.lua | 101 +- mods/bows/license.txt | 21 + mods/bows/lucky_block.lua | 41 +- mods/bows/mod.conf | 5 +- mods/bows/readme.MD | 2 + mods/bows/sounds/bows_arrow_hit.ogg | Bin 0 -> 9142 bytes mods/bows/sounds/bows_shoot.ogg | Bin 10600 -> 7361 bytes mods/builtin_item/README.md | 3 +- mods/builtin_item/depends.txt | 1 - mods/builtin_item/init.lua | 107 +- mods/builtin_item/license.txt | 5 + mods/builtin_item/mod.conf | 4 +- mods/builtin_item/settingtypes.txt | 4 + mods/carpets/api.lua | 2 +- mods/carpets/init.lua | 30 +- mods/carpets/locale/carpets.de.tr | 18 + mods/carpets/locale/carpets.eo.tr | 18 + mods/carpets/locale/carpets.es.tr | 18 + mods/carpets/locale/carpets.fr.tr | 34 +- mods/carpets/locale/carpets.hu.tr | 18 + mods/carpets/locale/carpets.it.tr | 18 + mods/carpets/locale/carpets.pl.tr | 18 + mods/carpets/locale/template.txt | 34 +- mods/carts/README.md | 74 + mods/carts/README.txt | 29 - mods/carts/cart_entity.lua | 92 +- mods/carts/functions.lua | 2 + mods/carts/init.lua | 16 +- mods/carts/screenshot.png | Bin 0 -> 38103 bytes mods/castle/autocraft.lua | 3 +- mods/castle/depends.txt | 3 - mods/castle/init.lua | 63 +- mods/castle/mod.conf | 2 + mods/castle/town_item.lua | 4 +- mods/claycrafter/items.lua | 29 +- mods/cloud_items/LICENSE.md | 40 +- mods/cloud_items/README.md | 53 +- mods/cloud_items/init.lua | 7 +- mods/cloud_items/screenshot.1.png | Bin 0 -> 42569 bytes mods/cloud_items/screenshot.2.png | Bin 0 -> 47683 bytes mods/cloud_items/screenshot.3.png | Bin 0 -> 29956 bytes mods/cloud_items/screenshot.4.png | Bin 0 -> 94865 bytes mods/cloud_items/screenshot.5.png | Bin 0 -> 154438 bytes mods/cloud_items/screenshot.6.png | Bin 0 -> 130051 bytes mods/cloud_items/screenshot.7.png | Bin 0 -> 435755 bytes mods/cloud_items/screenshot.8.png | Bin 0 -> 533101 bytes mods/cloud_items/screenshot.9.png | Bin 0 -> 493597 bytes mods/coloredwood/.luacheckrc | 8 + mods/coloredwood/depends.txt | 4 - mods/coloredwood/description.txt | 1 - mods/coloredwood/init.lua | 26 +- mods/coloredwood/mod.conf | 3 + mods/compost/init.lua | 3 +- mods/cottages/mod.conf | 5 + mods/cottages/models/feldweg_45.b3d | Bin 0 -> 3712 bytes mods/cottages/models/feldweg_d_45.b3d | Bin 0 -> 4988 bytes mods/cottages/models/feldweg_l_45_curve.b3d | Bin 0 -> 10460 bytes mods/cottages/models/feldweg_r_45_curve.b3d | Bin 0 -> 10460 bytes mods/cottages/models/feldweg_s_45.b3d | Bin 0 -> 2684 bytes mods/cottages/nodes_feldweg.lua | 622 +- mods/cottages/nodes_historic.lua | 12 +- mods/currency/.luacheckrc | 21 + mods/currency/barter.lua | 19 +- mods/currency/income.lua | 6 +- mods/currency/locale/currency.id.tr | 45 + mods/currency/shop.lua | 152 +- mods/death_compass/locale/death_compass.ru.tr | 30 + mods/digilines/.luacheckrc | 19 + mods/digilines/LICENSE.txt | 188 + mods/digilines/README.md | 17 + mods/digilines/characters | 282 + mods/digilines/docs/chest.md | 123 + mods/digilines/init.lua | 101 + mods/digilines/internal.lua | 126 + mods/digilines/inventory.lua | 427 ++ mods/digilines/lcd.lua | 366 + mods/digilines/lightsensor.lua | 83 + mods/digilines/locale/digilines.es.tr | 23 + mods/digilines/locale/digilines.zh_TW.tr | 17 + mods/digilines/locale/diglines.fr.tr | 23 + mods/digilines/locale/template.txt | 23 + mods/digilines/mod.conf | 7 + mods/digilines/presetrules.lua | 15 + mods/digilines/rtc.lua | 88 + mods/digilines/screenshot.png | Bin 0 -> 25041 bytes mods/digilines/settingtypes.txt | 13 + mods/digilines/textures/_0.png | Bin 0 -> 239 bytes mods/digilines/textures/_1.png | Bin 0 -> 238 bytes mods/digilines/textures/_2.png | Bin 0 -> 235 bytes mods/digilines/textures/_3.png | Bin 0 -> 241 bytes mods/digilines/textures/_4.png | Bin 0 -> 240 bytes mods/digilines/textures/_5.png | Bin 0 -> 237 bytes mods/digilines/textures/_6.png | Bin 0 -> 246 bytes mods/digilines/textures/_7.png | Bin 0 -> 243 bytes mods/digilines/textures/_8.png | Bin 0 -> 235 bytes mods/digilines/textures/_9.png | Bin 0 -> 245 bytes mods/digilines/textures/_a.png | Bin 0 -> 238 bytes mods/digilines/textures/_a_.png | Bin 0 -> 251 bytes mods/digilines/textures/_am.png | Bin 0 -> 156 bytes mods/digilines/textures/_ap.png | Bin 0 -> 228 bytes mods/digilines/textures/_as.png | Bin 0 -> 238 bytes mods/digilines/textures/_at.png | Bin 0 -> 254 bytes mods/digilines/textures/_b.png | Bin 0 -> 249 bytes mods/digilines/textures/_b_.png | Bin 0 -> 240 bytes mods/digilines/textures/_bl.png | Bin 0 -> 237 bytes mods/digilines/textures/_br.png | Bin 0 -> 237 bytes mods/digilines/textures/_c.png | Bin 0 -> 236 bytes mods/digilines/textures/_c_.png | Bin 0 -> 239 bytes mods/digilines/textures/_ca.png | Bin 0 -> 231 bytes mods/digilines/textures/_cl.png | Bin 0 -> 233 bytes mods/digilines/textures/_cm.png | Bin 0 -> 226 bytes mods/digilines/textures/_co.png | Bin 0 -> 135 bytes mods/digilines/textures/_cr.png | Bin 0 -> 234 bytes mods/digilines/textures/_d.png | Bin 0 -> 243 bytes mods/digilines/textures/_d_.png | Bin 0 -> 239 bytes mods/digilines/textures/_dl.png | Bin 0 -> 239 bytes mods/digilines/textures/_dt.png | Bin 0 -> 224 bytes mods/digilines/textures/_dv.png | Bin 0 -> 235 bytes mods/digilines/textures/_e.png | Bin 0 -> 240 bytes mods/digilines/textures/_e_.png | Bin 0 -> 242 bytes mods/digilines/textures/_eq.png | Bin 0 -> 228 bytes mods/digilines/textures/_ex.png | Bin 0 -> 230 bytes mods/digilines/textures/_f.png | Bin 0 -> 244 bytes mods/digilines/textures/_f_.png | Bin 0 -> 246 bytes mods/digilines/textures/_g.png | Bin 0 -> 251 bytes mods/digilines/textures/_g_.png | Bin 0 -> 243 bytes mods/digilines/textures/_gt.png | Bin 0 -> 228 bytes mods/digilines/textures/_h.png | Bin 0 -> 248 bytes mods/digilines/textures/_h_.png | Bin 0 -> 252 bytes mods/digilines/textures/_ha.png | Bin 0 -> 233 bytes mods/digilines/textures/_hs.png | Bin 0 -> 144 bytes mods/digilines/textures/_i.png | Bin 0 -> 237 bytes mods/digilines/textures/_i_.png | Bin 0 -> 239 bytes mods/digilines/textures/_j.png | Bin 0 -> 240 bytes mods/digilines/textures/_j_.png | Bin 0 -> 243 bytes mods/digilines/textures/_k.png | Bin 0 -> 247 bytes mods/digilines/textures/_k_.png | Bin 0 -> 243 bytes mods/digilines/textures/_l.png | Bin 0 -> 238 bytes mods/digilines/textures/_l_.png | Bin 0 -> 242 bytes mods/digilines/textures/_lt.png | Bin 0 -> 227 bytes mods/digilines/textures/_m.png | Bin 0 -> 240 bytes mods/digilines/textures/_m_.png | Bin 0 -> 244 bytes mods/digilines/textures/_mn.png | Bin 0 -> 228 bytes mods/digilines/textures/_n.png | Bin 0 -> 248 bytes mods/digilines/textures/_n_.png | Bin 0 -> 252 bytes mods/digilines/textures/_o.png | Bin 0 -> 238 bytes mods/digilines/textures/_o_.png | Bin 0 -> 239 bytes mods/digilines/textures/_p.png | Bin 0 -> 250 bytes mods/digilines/textures/_p_.png | Bin 0 -> 246 bytes mods/digilines/textures/_pr.png | Bin 0 -> 255 bytes mods/digilines/textures/_ps.png | Bin 0 -> 235 bytes mods/digilines/textures/_q.png | Bin 0 -> 251 bytes mods/digilines/textures/_q_.png | Bin 0 -> 242 bytes mods/digilines/textures/_qo.png | Bin 0 -> 232 bytes mods/digilines/textures/_qu.png | Bin 0 -> 233 bytes mods/digilines/textures/_r.png | Bin 0 -> 241 bytes mods/digilines/textures/_r_.png | Bin 0 -> 248 bytes mods/digilines/textures/_re.png | Bin 0 -> 243 bytes mods/digilines/textures/_s.png | Bin 0 -> 239 bytes mods/digilines/textures/_s_.png | Bin 0 -> 243 bytes mods/digilines/textures/_sl.png | Bin 0 -> 240 bytes mods/digilines/textures/_sm.png | Bin 0 -> 227 bytes mods/digilines/textures/_sp.png | Bin 0 -> 95 bytes mods/digilines/textures/_sr.png | Bin 0 -> 236 bytes mods/digilines/textures/_t.png | Bin 0 -> 241 bytes mods/digilines/textures/_t_.png | Bin 0 -> 249 bytes mods/digilines/textures/_tl.png | Bin 0 -> 227 bytes mods/digilines/textures/_u.png | Bin 0 -> 240 bytes mods/digilines/textures/_u_.png | Bin 0 -> 252 bytes mods/digilines/textures/_un.png | Bin 0 -> 226 bytes mods/digilines/textures/_v.png | Bin 0 -> 249 bytes mods/digilines/textures/_v_.png | Bin 0 -> 246 bytes mods/digilines/textures/_vb.png | Bin 0 -> 229 bytes mods/digilines/textures/_w.png | Bin 0 -> 238 bytes mods/digilines/textures/_w_.png | Bin 0 -> 247 bytes mods/digilines/textures/_x.png | Bin 0 -> 241 bytes mods/digilines/textures/_x_.png | Bin 0 -> 246 bytes mods/digilines/textures/_y.png | Bin 0 -> 246 bytes mods/digilines/textures/_y_.png | Bin 0 -> 243 bytes mods/digilines/textures/_z.png | Bin 0 -> 233 bytes mods/digilines/textures/_z_.png | Bin 0 -> 235 bytes mods/digilines/textures/digiline_std.png | Bin 0 -> 250 bytes mods/digilines/textures/digiline_std_bump.png | Bin 0 -> 257 bytes mods/digilines/textures/digiline_std_inv.png | Bin 0 -> 136 bytes .../textures/digiline_std_vertical.png | Bin 0 -> 228 bytes .../textures/digilines_lightsensor.png | Bin 0 -> 194 bytes mods/digilines/textures/digilines_rtc.png | Bin 0 -> 215 bytes .../textures/digilines_rtc_bottom.png | Bin 0 -> 98 bytes mods/digilines/textures/lcd_anyside.png | Bin 0 -> 132 bytes mods/digilines/textures/lcd_lcd.png | Bin 0 -> 143 bytes mods/digilines/util.lua | 156 + mods/digilines/wire_std.lua | 124 + mods/digilines/wires_common.lua | 84 + mods/display_modpack/boards/depends.txt | 2 - mods/display_modpack/boards/mod.conf | 7 +- mods/display_modpack/display_api/mod.conf | 5 +- mods/display_modpack/font_api/depends.txt | 1 - mods/display_modpack/font_api/mod.conf | 7 +- mods/display_modpack/font_metro/depends.txt | 1 - mods/display_modpack/font_metro/mod.conf | 7 +- .../display_modpack/ontime_clocks/depends.txt | 5 - mods/display_modpack/ontime_clocks/mod.conf | 9 +- mods/display_modpack/signs/depends.txt | 4 - mods/display_modpack/signs/mod.conf | 9 +- mods/display_modpack/signs_api/depends.txt | 4 - mods/display_modpack/signs_api/mod.conf | 9 +- mods/display_modpack/signs_road/depends.txt | 4 - mods/display_modpack/signs_road/mod.conf | 9 +- mods/display_modpack/steles/depends.txt | 5 - mods/display_modpack/steles/mod.conf | 9 +- mods/doors/{README.txt => README.md} | 114 +- mods/doors/depends.txt | 2 - mods/doors/init.lua | 737 +- mods/doors/license.txt | 8 + mods/doors/locale/doors.de.tr | 21 + mods/doors/locale/doors.eo.tr | 21 + mods/doors/locale/doors.es.tr | 21 + mods/doors/locale/doors.fr.tr | 21 + mods/doors/locale/doors.id.tr | 21 + mods/doors/locale/doors.it.tr | 21 + mods/doors/locale/doors.ja.tr | 21 + mods/doors/locale/doors.jbo.tr | 21 + mods/doors/locale/doors.ms.tr | 21 + mods/doors/locale/doors.pl.tr | 21 + mods/doors/locale/doors.pt_BR.tr | 21 + mods/doors/locale/doors.ru.tr | 21 + mods/doors/locale/doors.sk.tr | 21 + mods/doors/locale/doors.sv.tr | 21 + mods/doors/locale/doors.uk.tr | 21 + mods/doors/locale/doors.zh_CN.tr | 21 + mods/doors/locale/doors.zh_TW.tr | 21 + mods/doors/locale/template.txt | 21 + mods/doors/mod.conf | 3 +- mods/doors/screenshot.jpg | Bin 31389 -> 145485 bytes mods/doors/textures/doors_door_glass.png | Bin 3064 -> 458 bytes .../textures/doors_door_obsidian_glass.png | Bin 2988 -> 424 bytes mods/doors/textures/doors_key.png | Bin 198 -> 0 bytes mods/doors/textures/doors_lock_tool.png | Bin 0 -> 157 bytes mods/doors/textures/doors_trapdoor_oak.png | Bin 0 -> 253 bytes .../textures/doors_trapdoor_oak_side.png | Bin 0 -> 101 bytes mods/drinks/depends.txt | 2 +- mods/drinks/init.lua | 6 + mods/drinks/mod.conf | 2 +- mods/farming/README.md | 223 +- .../ethereal_banana_leaf_32px.png} | Bin .../alt_textures/ethereal_strawberry.png | Bin 0 -> 382 bytes .../alt_textures/ethereal_strawberry_1.png | Bin 0 -> 116 bytes .../alt_textures/ethereal_strawberry_2.png | Bin 0 -> 137 bytes .../alt_textures/ethereal_strawberry_3.png | Bin 0 -> 157 bytes .../alt_textures/ethereal_strawberry_4.png | Bin 0 -> 209 bytes .../alt_textures/ethereal_strawberry_5.png | Bin 0 -> 234 bytes .../alt_textures/ethereal_strawberry_6.png | Bin 0 -> 240 bytes .../alt_textures/ethereal_strawberry_7.png | Bin 0 -> 258 bytes .../alt_textures/ethereal_strawberry_8.png | Bin 0 -> 258 bytes .../alt_textures/farming_burger_32px.png | Bin 0 -> 422 bytes .../alt_textures/farming_mayo_32px.png | Bin 0 -> 382 bytes .../alt_textures/farming_paella_32px.png | Bin 0 -> 487 bytes .../alt_textures/farming_popcorn_32px.png | Bin 0 -> 345 bytes .../farming_potato_omelet_32px.png | Bin 0 -> 687 bytes .../farming_potato_salad_32px.png | Bin 0 -> 325 bytes .../alt_textures/farming_spaghetti_24px.png | Bin 0 -> 242 bytes .../farming_spanish_potatoes_32px.png | Bin 0 -> 557 bytes .../alt_textures/farming_sunflower_32px.png | Bin 0 -> 703 bytes .../farming_sunflower_bread_32px.png | Bin 0 -> 440 bytes .../farming_vanilla_flan_32px.png | Bin 0 -> 1216 bytes mods/farming/api.txt | 39 +- mods/farming/compatibility.lua | 78 +- mods/farming/crops/artichoke.lua | 54 +- mods/farming/crops/asparagus.lua | 108 + mods/farming/crops/barley.lua | 81 +- mods/farming/crops/beans.lua | 130 +- mods/farming/crops/beetroot.lua | 75 +- mods/farming/crops/blackberry.lua | 55 +- mods/farming/crops/blueberry.lua | 81 +- mods/farming/crops/cabbage.lua | 51 +- mods/farming/crops/carrot.lua | 95 +- mods/farming/crops/chili.lua | 75 +- mods/farming/crops/cocoa.lua | 146 +- mods/farming/crops/coffee.lua | 84 +- mods/farming/crops/corn.lua | 138 +- mods/farming/crops/cotton.lua | 163 +- mods/farming/crops/cucumber.lua | 51 +- mods/farming/crops/eggplant.lua | 102 + mods/farming/crops/garlic.lua | 111 +- mods/farming/crops/ginger.lua | 105 + mods/farming/crops/grapes.lua | 128 +- mods/farming/crops/hemp.lua | 225 +- mods/farming/crops/lettuce.lua | 55 +- mods/farming/crops/melon.lua | 76 +- mods/farming/crops/mint.lua | 93 +- mods/farming/crops/onion.lua | 66 +- mods/farming/crops/parsley.lua | 47 +- mods/farming/crops/peas.lua | 72 +- mods/farming/crops/pepper.lua | 96 +- mods/farming/crops/pineapple.lua | 114 +- mods/farming/crops/potato.lua | 78 +- mods/farming/crops/pumpkin.lua | 181 +- mods/farming/crops/raspberry.lua | 67 +- mods/farming/crops/rhubarb.lua | 85 +- mods/farming/crops/rice.lua | 113 +- mods/farming/crops/rye_oat.lua | 50 + mods/farming/crops/ryeoatrice.lua | 114 - mods/farming/crops/soy.lua | 149 +- mods/farming/crops/spinach.lua | 102 + mods/farming/crops/strawberry.lua | 131 + mods/farming/crops/sunflower.lua | 154 +- mods/farming/crops/tomato.lua | 68 +- mods/farming/crops/vanilla.lua | 90 +- mods/farming/crops/wheat.lua | 173 +- mods/farming/depends.txt | 5 - mods/farming/description.txt | 1 - mods/farming/farming.conf_example | 57 +- mods/farming/food.lua | 689 -- mods/farming/grass.lua | 82 +- mods/farming/hoes.lua | 369 +- mods/farming/init.lua | 532 +- mods/farming/intllib.lua | 45 - mods/farming/item_food.lua | 1035 +++ mods/farming/item_list.lua | 126 + mods/farming/item_non_food.lua | 270 + mods/farming/item_recipes.lua | 1421 ++++ mods/farming/item_stairs.lua | 35 + mods/farming/license.txt | 87 +- mods/farming/locale/de.txt | 195 - mods/farming/locale/farming.de.tr | 299 +- mods/farming/locale/farming.en.tr | 320 +- mods/farming/locale/farming.eo.tr | 176 + mods/farming/locale/farming.es.tr | 177 + mods/farming/locale/farming.fr.tr | 223 +- mods/farming/locale/farming.hu.tr | 176 + mods/farming/locale/farming.it.tr | 222 +- mods/farming/locale/farming.pt.tr | 258 +- mods/farming/locale/farming.ru.tr | 222 +- mods/farming/locale/farming.zh_CN.tr | 222 +- mods/farming/locale/farming.zh_TW.tr | 222 +- mods/farming/locale/fr.txt | 195 - mods/farming/locale/it.txt | 194 - mods/farming/locale/pt.txt | 195 - mods/farming/locale/ru.txt | 212 - mods/farming/locale/template.txt | 194 - mods/farming/locale/zh_CN.txt | 119 - mods/farming/locale/zh_TW.txt | 119 - mods/farming/lucky_block.lua | 180 +- mods/farming/mapgen.lua | 240 - mods/farming/mod.conf | 6 +- mods/farming/screenshot.jpg | Bin 0 -> 300022 bytes mods/farming/screenshot.png | Bin 42499 -> 0 bytes mods/farming/settingtypes.txt | 2 + mods/farming/soil.lua | 214 +- mods/farming/statistics.lua | 106 +- mods/farming/textures/crops_garlic.png | Bin 725 -> 526 bytes mods/farming/textures/crops_garlic_braid.png | Bin 1346 -> 354 bytes .../textures/crops_garlic_braid_side.png | Bin 1309 -> 351 bytes .../textures/crops_garlic_braid_top.png | Bin 0 -> 305 bytes mods/farming/textures/crops_garlic_clove.png | Bin 605 -> 460 bytes mods/farming/textures/crops_onion.png | Bin 841 -> 756 bytes .../farming/textures/ethereal_banana_leaf.png | Bin 0 -> 335 bytes mods/farming/textures/ethereal_strawberry.png | Bin 0 -> 197 bytes .../textures/ethereal_strawberry_1.png | Bin 0 -> 115 bytes .../textures/ethereal_strawberry_2.png | Bin 0 -> 129 bytes .../textures/ethereal_strawberry_3.png | Bin 0 -> 136 bytes .../textures/ethereal_strawberry_4.png | Bin 0 -> 145 bytes .../textures/ethereal_strawberry_5.png | Bin 0 -> 163 bytes .../textures/ethereal_strawberry_6.png | Bin 0 -> 187 bytes .../textures/ethereal_strawberry_7.png | Bin 0 -> 209 bytes .../textures/ethereal_strawberry_8.png | Bin 0 -> 215 bytes mods/farming/textures/farming_apple_pie.png | Bin 200 -> 262 bytes mods/farming/textures/farming_asparagus.png | Bin 0 -> 153 bytes mods/farming/textures/farming_asparagus_1.png | Bin 0 -> 115 bytes mods/farming/textures/farming_asparagus_2.png | Bin 0 -> 140 bytes mods/farming/textures/farming_asparagus_3.png | Bin 0 -> 165 bytes mods/farming/textures/farming_asparagus_4.png | Bin 0 -> 177 bytes mods/farming/textures/farming_asparagus_5.png | Bin 0 -> 200 bytes mods/farming/textures/farming_barley.png | Bin 230 -> 263 bytes mods/farming/textures/farming_barley_1.png | Bin 140 -> 114 bytes mods/farming/textures/farming_barley_2.png | Bin 151 -> 146 bytes mods/farming/textures/farming_barley_3.png | Bin 209 -> 176 bytes mods/farming/textures/farming_barley_4.png | Bin 229 -> 196 bytes mods/farming/textures/farming_barley_5.png | Bin 246 -> 225 bytes mods/farming/textures/farming_barley_6.png | Bin 271 -> 236 bytes mods/farming/textures/farming_barley_7.png | Bin 277 -> 256 bytes mods/farming/textures/farming_barley_8.png | Bin 0 -> 329 bytes .../textures/farming_blueberry_pie.png | Bin 195 -> 280 bytes mods/farming/textures/farming_bowl.png | Bin 145 -> 158 bytes mods/farming/textures/farming_burger.png | Bin 480 -> 371 bytes .../farming/textures/farming_chili_powder.png | Bin 0 -> 190 bytes mods/farming/textures/farming_coffee_1.png | Bin 135 -> 126 bytes mods/farming/textures/farming_coffee_2.png | Bin 145 -> 164 bytes mods/farming/textures/farming_coffee_3.png | Bin 171 -> 195 bytes mods/farming/textures/farming_coffee_4.png | Bin 192 -> 232 bytes mods/farming/textures/farming_coffee_5.png | Bin 192 -> 250 bytes .../farming/textures/farming_coffee_beans.png | Bin 204 -> 162 bytes mods/farming/textures/farming_cookie.png | Bin 566 -> 717 bytes mods/farming/textures/farming_eggplant.png | Bin 0 -> 194 bytes mods/farming/textures/farming_eggplant_1.png | Bin 0 -> 113 bytes mods/farming/textures/farming_eggplant_2.png | Bin 0 -> 137 bytes mods/farming/textures/farming_eggplant_3.png | Bin 0 -> 170 bytes mods/farming/textures/farming_eggplant_4.png | Bin 0 -> 195 bytes mods/farming/textures/farming_ginger.png | Bin 0 -> 193 bytes mods/farming/textures/farming_ginger_1.png | Bin 0 -> 120 bytes mods/farming/textures/farming_ginger_2.png | Bin 0 -> 156 bytes mods/farming/textures/farming_ginger_3.png | Bin 0 -> 177 bytes mods/farming/textures/farming_ginger_4.png | Bin 0 -> 217 bytes .../textures/farming_gingerbread_man.png | Bin 0 -> 264 bytes mods/farming/textures/farming_grapes.png | Bin 175 -> 613 bytes .../textures/farming_jerusalem_artichokes.png | Bin 0 -> 218 bytes .../textures/farming_mac_and_cheese.png | Bin 0 -> 353 bytes mods/farming/textures/farming_mayo.png | Bin 0 -> 210 bytes mods/farming/textures/farming_melon_1.png | Bin 138 -> 139 bytes mods/farming/textures/farming_melon_2.png | Bin 161 -> 161 bytes mods/farming/textures/farming_melon_3.png | Bin 177 -> 170 bytes mods/farming/textures/farming_melon_4.png | Bin 181 -> 182 bytes mods/farming/textures/farming_melon_5.png | Bin 196 -> 187 bytes mods/farming/textures/farming_melon_6.png | Bin 219 -> 218 bytes mods/farming/textures/farming_melon_7.png | Bin 247 -> 244 bytes .../farming/textures/farming_melon_bottom.png | Bin 172 -> 309 bytes mods/farming/textures/farming_melon_side.png | Bin 179 -> 303 bytes mods/farming/textures/farming_melon_slice.png | Bin 227 -> 198 bytes mods/farming/textures/farming_melon_top.png | Bin 193 -> 309 bytes mods/farming/textures/farming_onigiri.png | Bin 204 -> 171 bytes mods/farming/textures/farming_paella.png | Bin 487 -> 258 bytes mods/farming/textures/farming_pea_1.png | Bin 203 -> 207 bytes mods/farming/textures/farming_pea_2.png | Bin 215 -> 221 bytes mods/farming/textures/farming_pea_3.png | Bin 431 -> 441 bytes mods/farming/textures/farming_pea_4.png | Bin 528 -> 534 bytes mods/farming/textures/farming_pea_5.png | Bin 705 -> 711 bytes mods/farming/textures/farming_pineapple.png | Bin 140 -> 164 bytes mods/farming/textures/farming_pineapple_1.png | Bin 109 -> 124 bytes mods/farming/textures/farming_pineapple_2.png | Bin 120 -> 141 bytes mods/farming/textures/farming_pineapple_3.png | Bin 126 -> 163 bytes mods/farming/textures/farming_pineapple_4.png | Bin 136 -> 188 bytes mods/farming/textures/farming_pineapple_5.png | Bin 164 -> 199 bytes mods/farming/textures/farming_pineapple_6.png | Bin 201 -> 226 bytes mods/farming/textures/farming_pineapple_7.png | Bin 209 -> 243 bytes mods/farming/textures/farming_pineapple_8.png | Bin 194 -> 231 bytes .../textures/farming_pineapple_top.png | Bin 143 -> 166 bytes mods/farming/textures/farming_popcorn.png | Bin 292 -> 261 bytes mods/farming/textures/farming_porridge.png | Bin 193 -> 204 bytes .../textures/farming_potato_omelet.png | Bin 687 -> 239 bytes .../farming/textures/farming_potato_salad.png | Bin 325 -> 168 bytes .../textures/farming_pumpkin_bottom.png | Bin 258 -> 1237 bytes .../textures/farming_pumpkin_face_off.png | Bin 259 -> 587 bytes .../textures/farming_pumpkin_face_on.png | Bin 269 -> 663 bytes .../farming/textures/farming_pumpkin_side.png | Bin 231 -> 1053 bytes mods/farming/textures/farming_pumpkin_top.png | Bin 272 -> 605 bytes mods/farming/textures/farming_rhubarb_1.png | Bin 119 -> 116 bytes mods/farming/textures/farming_rhubarb_2.png | Bin 152 -> 119 bytes mods/farming/textures/farming_rhubarb_3.png | Bin 167 -> 152 bytes mods/farming/textures/farming_rhubarb_4.png | Bin 0 -> 167 bytes mods/farming/textures/farming_rhubarb_pie.png | Bin 198 -> 263 bytes mods/farming/textures/farming_rice.png | Bin 325 -> 190 bytes mods/farming/textures/farming_rice_seed.png | Bin 0 -> 165 bytes mods/farming/textures/farming_spaghetti.png | Bin 242 -> 195 bytes .../textures/farming_spanish_potatoes.png | Bin 557 -> 236 bytes mods/farming/textures/farming_spinach.png | Bin 0 -> 166 bytes mods/farming/textures/farming_spinach_1.png | Bin 0 -> 119 bytes mods/farming/textures/farming_spinach_2.png | Bin 0 -> 139 bytes mods/farming/textures/farming_spinach_3.png | Bin 0 -> 146 bytes mods/farming/textures/farming_spinach_4.png | Bin 0 -> 163 bytes mods/farming/textures/farming_sugar_cube.png | Bin 0 -> 315 bytes mods/farming/textures/farming_sunflower.png | Bin 703 -> 274 bytes .../textures/farming_sunflower_bread.png | Bin 440 -> 186 bytes mods/farming/textures/farming_vanilla.png | Bin 474 -> 515 bytes .../farming/textures/farming_vanilla_flan.png | Bin 1216 -> 264 bytes .../farming/textures/farming_vegan_butter.png | Bin 0 -> 181 bytes mods/farming/utensils.lua | 160 - mods/flowerpot/init.lua | 109 +- mods/flowerpot/locale/flowerpot.eo.tr | 7 + mods/flowerpot/locale/flowerpot.es.tr | 7 + mods/gloopblocks/init.lua | 3 +- mods/gloopblocks/intllib.lua | 45 - mods/gloopblocks/lava-handling.lua | 10 +- mods/gloopblocks/locale/de.po | 235 - mods/gloopblocks/locale/fr.po | 227 - mods/gloopblocks/locale/gloopblocks.de.tr | 87 + mods/gloopblocks/locale/gloopblocks.fr.tr | 87 + mods/gloopblocks/locale/gloopblocks.id.tr | 73 + mods/gloopblocks/locale/gloopblocks.ru.tr | 87 + mods/gloopblocks/locale/ru.po | 176 - mods/gloopblocks/locale/template.pot | 226 - mods/gloopblocks/locale/template.txt | 73 + mods/gloopblocks/main.lua | 166 +- mods/gloopblocks/mod.conf | 2 +- mods/home_workshop_modpack/.luacheckrc | 2 +- .../computers/computers.lua | 28 +- .../computers/gaming.lua | 1 + mods/home_workshop_modpack/computers/init.lua | 8 +- .../computers/locale/computers.de.tr | 33 +- .../computers/locale/computers.es.tr | 33 +- .../computers/locale/computers.fr.tr | 33 +- .../computers/locale/computers.it.tr | 33 +- .../computers/locale/computers.ms.tr | 33 +- .../computers/locale/computers.pt.tr | 33 +- .../computers/locale/computers.pt_BR.tr | 33 +- .../computers/locale/computers.ru.tr | 33 +- .../computers/locale/computers.zh_CN.tr | 33 +- .../computers/locale/template.txt | 33 +- mods/home_workshop_modpack/computers/mod.conf | 1 + .../computers/recipes.lua | 45 +- .../home_vending_machines/api.lua | 6 +- .../home_vending_machines/crafts.lua | 26 + .../home_vending_machines/init.lua | 1 + .../home_vending_machines/mod.conf | 4 +- .../home_workshop_machines/init.lua | 31 +- .../locale/home_workshop_machines.de.tr | 3 - .../locale/template.txt | 3 - .../home_workshop_machines/mod.conf | 5 +- .../home_workshop_misc/crafts.lua | 25 +- .../home_workshop_misc/init.lua | 14 +- .../locale/home_workshop_misc_misc.de.tr | 11 +- .../locale/home_workshop_misc_misc.es.tr | 10 +- .../locale/home_workshop_misc_misc.fr.tr | 10 +- .../locale/home_workshop_misc_misc.ms.tr | 10 +- .../locale/home_workshop_misc_misc.pt.tr | 10 +- .../locale/home_workshop_misc_misc.pt_BR.tr | 10 +- .../locale/home_workshop_misc_misc.ru.tr | 10 +- .../locale/home_workshop_misc_misc.zh_CN.tr | 11 +- .../home_workshop_misc/locale/template.txt | 11 +- .../home_workshop_misc/mod.conf | 1 + mods/home_workshop_modpack/modpack.conf | 2 + mods/homedecor_modpack/.luacheckrc | 45 + mods/homedecor_modpack/README | 8 - mods/homedecor_modpack/README.md | 28 + mods/homedecor_modpack/bower.json | 19 - .../building_blocks/.luacheckrc | 21 - .../building_blocks/alias.lua | 16 +- .../locale/building_blocks.de.tr | 50 +- .../locale/building_blocks.es.tr | 50 +- .../locale/building_blocks.fr.tr | 50 +- .../locale/building_blocks.ms.tr | 50 +- .../locale/building_blocks.pt.tr | 50 +- .../locale/building_blocks.pt_BR.tr | 50 +- .../locale/building_blocks.ru.tr | 50 +- .../locale/building_blocks.zh_CN.tr | 50 +- .../building_blocks/locale/template.txt | 50 +- .../building_blocks/mod.conf | 4 +- .../building_blocks/node_stairs.lua | 157 +- .../building_blocks/recipes.lua | 66 +- mods/homedecor_modpack/fake_fire/.luacheckrc | 19 - mods/homedecor_modpack/fake_fire/init.lua | 123 +- .../fake_fire/locale/fake_fire.de.tr | 8 +- .../fake_fire/locale/fake_fire.es.tr | 8 +- .../fake_fire/locale/fake_fire.fr.tr | 8 +- .../fake_fire/locale/fake_fire.ms.tr | 8 +- .../fake_fire/locale/fake_fire.pt.tr | 8 +- .../fake_fire/locale/fake_fire.pt_BR.tr | 8 +- .../fake_fire/locale/fake_fire.ru.tr | 8 +- .../fake_fire/locale/fake_fire.zh_CN.tr | 8 +- .../fake_fire/locale/template.txt | 8 +- mods/homedecor_modpack/fake_fire/mod.conf | 2 +- .../homedecor_3d_extras/.luacheckrc | 18 - .../homedecor_3d_extras/init.lua | 38 +- .../homedecor_3d_extras/mod.conf | 3 +- .../homedecor_bathroom/.luacheckrc | 22 - .../homedecor_bathroom/init.lua | 380 +- .../locale/homedecor_bathroom.de.tr | 24 +- .../locale/homedecor_bathroom.es.tr | 24 +- .../locale/homedecor_bathroom.fr.tr | 24 +- .../locale/homedecor_bathroom.it.tr | 24 +- .../locale/homedecor_bathroom.ms.tr | 24 +- .../locale/homedecor_bathroom.pt.tr | 24 +- .../locale/homedecor_bathroom.pt_BR.tr | 24 +- .../locale/homedecor_bathroom.ru.tr | 24 +- .../locale/homedecor_bathroom.zh_CN.tr | 24 +- .../homedecor_bathroom/locale/template.txt | 24 +- .../homedecor_bathroom/mod.conf | 4 +- .../homedecor_bedroom/.luacheckrc | 22 - .../homedecor_bedroom/init.lua | 111 +- .../locale/homedecor_bedroom.de.tr | 12 +- .../locale/homedecor_bedroom.es.tr | 12 +- .../locale/homedecor_bedroom.fr.tr | 12 +- .../locale/homedecor_bedroom.it.tr | 12 +- .../locale/homedecor_bedroom.ms.tr | 12 +- .../locale/homedecor_bedroom.pt.tr | 12 +- .../locale/homedecor_bedroom.pt_BR.tr | 12 +- .../locale/homedecor_bedroom.ru.tr | 12 +- .../locale/homedecor_bedroom.zh_CN.tr | 12 +- .../homedecor_bedroom/locale/template.txt | 12 +- .../homedecor_bedroom/mod.conf | 4 +- .../homedecor_books/.luacheckrc | 21 - .../homedecor_books/init.lua | 15 +- .../locale/homedecor_books.de.tr | 15 +- .../locale/homedecor_books.es.tr | 15 +- .../locale/homedecor_books.fr.tr | 15 +- .../locale/homedecor_books.it.tr | 15 +- .../locale/homedecor_books.ms.tr | 15 +- .../locale/homedecor_books.pt.tr | 15 +- .../locale/homedecor_books.pt_BR.tr | 15 +- .../locale/homedecor_books.ru.tr | 15 +- .../locale/homedecor_books.zh_CN.tr | 15 +- .../homedecor_books/locale/template.txt | 15 +- .../homedecor_books/mod.conf | 4 +- .../homedecor_climate_control/.luacheckrc | 21 - .../homedecor_climate_control/init.lua | 173 +- .../locale/homedecor_climate_control.de.tr | 10 +- .../locale/homedecor_climate_control.es.tr | 10 +- .../locale/homedecor_climate_control.fr.tr | 10 +- .../locale/homedecor_climate_control.ms.tr | 10 +- .../locale/homedecor_climate_control.pt.tr | 10 +- .../locale/homedecor_climate_control.pt_BR.tr | 10 +- .../locale/homedecor_climate_control.ru.tr | 10 +- .../locale/homedecor_climate_control.zh_CN.tr | 10 +- .../locale/template.txt | 10 +- .../homedecor_climate_control/mod.conf | 4 +- .../homedecor_clocks/.luacheckrc | 21 - .../homedecor_clocks/init.lua | 133 +- .../locale/homedecor_clocks.de.tr | 10 +- .../locale/homedecor_clocks.es.tr | 10 +- .../locale/homedecor_clocks.fr.tr | 10 +- .../locale/homedecor_clocks.ms.tr | 10 +- .../locale/homedecor_clocks.pt.tr | 10 +- .../locale/homedecor_clocks.pt_BR.tr | 10 +- .../locale/homedecor_clocks.ru.tr | 10 +- .../locale/homedecor_clocks.zh_CN.tr | 10 +- .../homedecor_clocks/locale/template.txt | 10 +- .../homedecor_clocks/mod.conf | 4 +- .../homedecor_cobweb/.luacheckrc | 18 - .../homedecor_cobweb/init.lua | 41 +- .../locale/homedecor_cobweb.de.tr | 4 - .../locale/homedecor_cobweb.es.tr | 4 - .../locale/homedecor_cobweb.fr.tr | 4 - .../locale/homedecor_cobweb.ms.tr | 4 - .../locale/homedecor_cobweb.pt.tr | 4 - .../locale/homedecor_cobweb.pt_BR.tr | 4 - .../locale/homedecor_cobweb.ru.tr | 4 - .../locale/homedecor_cobweb.zh_CN.tr | 4 - .../homedecor_cobweb/locale/template.txt | 4 - .../homedecor_cobweb/mod.conf | 3 +- .../homedecor_common/.luacheckrc | 21 - .../homedecor_common/expansion.lua | 10 +- .../homedecor_common/furnaces.lua | 342 +- .../homedecor_common/init.lua | 8 +- .../homedecor_common/inventory.lua | 56 +- .../locale/homedecor_common.de.tr | 25 +- .../locale/homedecor_common.es.tr | 25 +- .../locale/homedecor_common.fr.tr | 25 +- .../locale/homedecor_common.it.tr | 33 +- .../locale/homedecor_common.ms.tr | 25 +- .../locale/homedecor_common.pt.tr | 25 +- .../locale/homedecor_common.pt_BR.tr | 25 +- .../locale/homedecor_common.ru.tr | 25 +- .../locale/homedecor_common.zh_CN.tr | 25 +- .../homedecor_common/locale/template.txt | 25 +- .../homedecor_common/mod.conf | 4 +- .../homedecor_common/nodeboxes.lua | 2 +- .../homedecor_common/registration.lua | 49 +- .../homedecor_common/sit.lua | 34 - .../textures/homedecor_blanktile.png | Bin 82 -> 0 bytes .../homedecor_common/xcompat.lua | 8 + .../homedecor_doors_and_gates/.luacheckrc | 23 - .../homedecor_doors_and_gates/init.lua | 251 +- .../locale/homedecor_doors_and_gates.de.tr | 34 +- .../locale/homedecor_doors_and_gates.es.tr | 34 +- .../locale/homedecor_doors_and_gates.fr.tr | 34 +- .../locale/homedecor_doors_and_gates.it.tr | 34 +- .../locale/homedecor_doors_and_gates.ms.tr | 34 +- .../locale/homedecor_doors_and_gates.pt.tr | 34 +- .../locale/homedecor_doors_and_gates.pt_BR.tr | 34 +- .../locale/homedecor_doors_and_gates.ru.tr | 34 +- .../locale/homedecor_doors_and_gates.zh_CN.tr | 34 +- .../locale/template.txt | 34 +- .../homedecor_doors_and_gates/mod.conf | 4 +- .../models/homedecor_door_closet_a.obj | 0 .../models/homedecor_door_closet_b.obj | 0 .../models/homedecor_door_fancy_a.obj | 0 .../models/homedecor_door_fancy_b.obj | 0 .../models/homedecor_door_french_a.obj | 0 .../models/homedecor_door_french_b.obj | 0 .../models/homedecor_door_wood_glass_3_a.obj | 0 .../models/homedecor_door_wood_glass_3_b.obj | 0 .../models/homedecor_door_wrought_iron_a.obj | 0 .../models/homedecor_door_wrought_iron_b.obj | 0 .../homedecor_electrical/.luacheckrc | 20 - .../homedecor_electrical/init.lua | 38 +- .../locale/homedecor_electrical.de.tr | 8 +- .../locale/homedecor_electrical.es.tr | 8 +- .../locale/homedecor_electrical.fr.tr | 8 +- .../locale/homedecor_electrical.ms.tr | 8 +- .../locale/homedecor_electrical.pt.tr | 8 +- .../locale/homedecor_electrical.pt_BR.tr | 8 +- .../locale/homedecor_electrical.ru.tr | 8 +- .../locale/homedecor_electrical.zh_CN.tr | 8 +- .../homedecor_electrical/locale/template.txt | 8 +- .../homedecor_electrical/mod.conf | 2 +- .../homedecor_electronics/.luacheckrc | 20 - .../homedecor_electronics/init.lua | 262 +- .../locale/homedecor_electronics.de.tr | 14 +- .../locale/homedecor_electronics.es.tr | 14 +- .../locale/homedecor_electronics.fr.tr | 14 +- .../locale/homedecor_electronics.it.tr | 14 +- .../locale/homedecor_electronics.ms.tr | 14 +- .../locale/homedecor_electronics.pt.tr | 14 +- .../locale/homedecor_electronics.pt_BR.tr | 14 +- .../locale/homedecor_electronics.ru.tr | 14 +- .../locale/homedecor_electronics.zh_CN.tr | 14 +- .../homedecor_electronics/locale/template.txt | 14 +- .../homedecor_electronics/mod.conf | 2 +- .../homedecor_exterior/.luacheckrc | 22 - .../homedecor_exterior/init.lua | 332 +- .../locale/homedecor_exterior.de.tr | 26 +- .../locale/homedecor_exterior.es.tr | 26 +- .../locale/homedecor_exterior.fr.tr | 26 +- .../locale/homedecor_exterior.it.tr | 26 +- .../locale/homedecor_exterior.ms.tr | 26 +- .../locale/homedecor_exterior.pt.tr | 26 +- .../locale/homedecor_exterior.pt_BR.tr | 26 +- .../locale/homedecor_exterior.ru.tr | 26 +- .../locale/homedecor_exterior.zh_CN.tr | 26 +- .../homedecor_exterior/locale/template.txt | 26 +- .../homedecor_exterior/mod.conf | 2 +- .../homedecor_fences/.luacheckrc | 21 - .../homedecor_fences/init.lua | 457 +- .../locale/homedecor_fences.de.tr | 16 +- .../locale/homedecor_fences.es.tr | 16 +- .../locale/homedecor_fences.fr.tr | 18 +- .../locale/homedecor_fences.it.tr | 18 +- .../locale/homedecor_fences.ms.tr | 16 +- .../locale/homedecor_fences.pt.tr | 16 +- .../locale/homedecor_fences.pt_BR.tr | 16 +- .../locale/homedecor_fences.ru.tr | 16 +- .../locale/homedecor_fences.zh_CN.tr | 16 +- .../homedecor_fences/locale/template.txt | 16 +- .../homedecor_fences/mod.conf | 4 +- .../homedecor_foyer/.luacheckrc | 21 - .../homedecor_foyer/init.lua | 135 +- .../locale/homedecor_foyer.de.tr | 8 +- .../locale/homedecor_foyer.es.tr | 8 +- .../locale/homedecor_foyer.fr.tr | 8 +- .../locale/homedecor_foyer.ms.tr | 8 +- .../locale/homedecor_foyer.pt.tr | 8 +- .../locale/homedecor_foyer.pt_BR.tr | 8 +- .../locale/homedecor_foyer.ru.tr | 8 +- .../locale/homedecor_foyer.zh_CN.tr | 8 +- .../homedecor_foyer/locale/template.txt | 8 +- .../homedecor_foyer/mod.conf | 4 +- .../homedecor_furniture/.luacheckrc | 21 - .../homedecor_furniture/init.lua | 27 +- .../locale/homedecor_furniture.de.tr | 7 - .../locale/homedecor_furniture.es.tr | 7 - .../locale/homedecor_furniture.fr.tr | 7 - .../locale/homedecor_furniture.it.tr | 7 - .../locale/homedecor_furniture.ms.tr | 7 - .../locale/homedecor_furniture.pt.tr | 7 - .../locale/homedecor_furniture.pt_BR.tr | 7 - .../locale/homedecor_furniture.ru.tr | 7 - .../locale/homedecor_furniture.zh_CN.tr | 7 - .../homedecor_furniture/locale/template.txt | 7 - .../homedecor_furniture/mod.conf | 4 +- .../homedecor_furniture_medieval/.luacheckrc | 20 - .../homedecor_furniture_medieval/init.lua | 61 +- .../locale/homedecor_furniture_medieval.de.tr | 4 - .../locale/homedecor_furniture_medieval.es.tr | 4 - .../locale/homedecor_furniture_medieval.fr.tr | 4 - .../locale/homedecor_furniture_medieval.it.tr | 4 - .../locale/homedecor_furniture_medieval.ms.tr | 4 - .../locale/homedecor_furniture_medieval.pt.tr | 4 - .../homedecor_furniture_medieval.pt_BR.tr | 4 - .../locale/homedecor_furniture_medieval.ru.tr | 4 - .../homedecor_furniture_medieval.zh_CN.tr | 4 - .../locale/template.txt | 4 - .../homedecor_furniture_medieval/mod.conf | 2 +- .../homedecor_gastronomy/.luacheckrc | 22 - .../homedecor_gastronomy/init.lua | 161 +- .../locale/homedecor_gastronomy.de.tr | 11 +- .../locale/homedecor_gastronomy.es.tr | 11 +- .../locale/homedecor_gastronomy.fr.tr | 11 +- .../locale/homedecor_gastronomy.it.tr | 15 +- .../locale/homedecor_gastronomy.ms.tr | 11 +- .../locale/homedecor_gastronomy.pt.tr | 11 +- .../locale/homedecor_gastronomy.pt_BR.tr | 11 +- .../locale/homedecor_gastronomy.ru.tr | 11 +- .../locale/homedecor_gastronomy.zh_CN.tr | 11 +- .../homedecor_gastronomy/locale/template.txt | 15 +- .../homedecor_gastronomy/mod.conf | 2 +- .../{inbox => homedecor_inbox}/init.lua | 36 +- .../locale/inbox.de.tr | 8 +- .../locale/inbox.es.tr | 8 +- .../locale/inbox.fr.tr | 8 +- .../locale/inbox.ms.tr | 8 +- .../locale/inbox.pt.tr | 8 +- .../locale/inbox.pt_BR.tr | 8 +- .../locale/inbox.ru.tr | 8 +- .../locale/inbox.zh_CN.tr | 8 +- .../homedecor_inbox/locale/template.txt | 3 + .../homedecor_inbox/mod.conf | 3 + .../models/homedecor_inbox_mailbox.obj} | 0 .../textures/homedecor_inbox_grey_metal.png} | Bin .../textures/homedecor_inbox_red_metal.png} | Bin .../textures/homedecor_inbox_white_metal.png} | Bin .../textures/homedecor_mailbox_inv.png} | Bin .../homedecor_kitchen/.luacheckrc | 21 - .../homedecor_kitchen/init.lua | 236 +- .../locale/homedecor_kitchen.de.tr | 32 +- .../locale/homedecor_kitchen.es.tr | 32 +- .../locale/homedecor_kitchen.fr.tr | 32 +- .../locale/homedecor_kitchen.it.tr | 32 +- .../locale/homedecor_kitchen.ms.tr | 32 +- .../locale/homedecor_kitchen.pt.tr | 32 +- .../locale/homedecor_kitchen.pt_BR.tr | 32 +- .../locale/homedecor_kitchen.ru.tr | 32 +- .../locale/homedecor_kitchen.zh_CN.tr | 32 +- .../homedecor_kitchen/locale/template.txt | 32 +- .../homedecor_kitchen/mod.conf | 4 +- .../homedecor_laundry/.luacheckrc | 19 - .../homedecor_laundry/init.lua | 106 +- .../locale/homedecor_laundry.de.tr | 8 +- .../locale/homedecor_laundry.fr.tr | 8 +- .../homedecor_laundry/locale/template.txt | 8 +- .../homedecor_laundry/mod.conf | 2 +- .../homedecor_lighting/.luacheckrc | 23 - .../homedecor_lighting/init.lua | 438 +- .../locale/homedecor_lighting.de.tr | 48 +- .../locale/homedecor_lighting.es.tr | 46 +- .../locale/homedecor_lighting.fr.tr | 46 +- .../locale/homedecor_lighting.it.tr | 46 +- .../locale/homedecor_lighting.ms.tr | 46 +- .../locale/homedecor_lighting.pt.tr | 46 +- .../locale/homedecor_lighting.pt_BR.tr | 46 +- .../locale/homedecor_lighting.ru.tr | 46 +- .../locale/homedecor_lighting.zh_CN.tr | 46 +- .../homedecor_lighting/locale/template.txt | 48 +- .../homedecor_lighting/mod.conf | 4 +- .../homedecor_modpack/homedecor_misc/init.lua | 304 +- .../locale/homedecor_misc.de.tr | 71 +- .../locale/homedecor_misc.es.tr | 71 +- .../locale/homedecor_misc.fr.tr | 71 +- .../locale/homedecor_misc.it.tr | 71 +- .../locale/homedecor_misc.ms.tr | 71 +- .../locale/homedecor_misc.pt.tr | 71 +- .../locale/homedecor_misc.pt_BR.tr | 71 +- .../locale/homedecor_misc.ru.tr | 71 +- .../locale/homedecor_misc.zh_CN.tr | 71 +- .../homedecor_misc/locale/template.txt | 71 +- .../homedecor_modpack/homedecor_misc/mod.conf | 4 +- .../homedecor_office/.luacheckrc | 20 - .../homedecor_office/init.lua | 135 +- .../locale/homedecor_office.de.tr | 10 +- .../locale/homedecor_office.es.tr | 10 +- .../locale/homedecor_office.fr.tr | 10 +- .../locale/homedecor_office.ms.tr | 10 +- .../locale/homedecor_office.pt.tr | 10 +- .../locale/homedecor_office.pt_BR.tr | 10 +- .../locale/homedecor_office.ru.tr | 10 +- .../locale/homedecor_office.zh_CN.tr | 10 +- .../homedecor_office/locale/template.txt | 10 +- .../homedecor_office/mod.conf | 2 +- .../.luacheckrc | 20 - .../homedecor_pictures_and_paintings/init.lua | 48 +- .../homedecor_pictures_and_paintings.de.tr | 8 +- .../homedecor_pictures_and_paintings.es.tr | 8 +- .../homedecor_pictures_and_paintings.fr.tr | 8 +- .../homedecor_pictures_and_paintings.ms.tr | 484 +- .../homedecor_pictures_and_paintings.pt.tr | 8 +- .../homedecor_pictures_and_paintings.pt_BR.tr | 8 +- .../homedecor_pictures_and_paintings.ru.tr | 8 +- .../homedecor_pictures_and_paintings.zh_CN.tr | 8 +- .../locale/template.txt | 8 +- .../homedecor_pictures_and_paintings/mod.conf | 2 +- .../init.lua | 101 +- .../locale/plasmascreen.de.tr | 6 +- .../locale/plasmascreen.es.tr | 6 +- .../locale/plasmascreen.fr.tr | 6 +- .../locale/plasmascreen.ms.tr | 6 +- .../locale/plasmascreen.pt.tr | 6 +- .../locale/plasmascreen.pt_BR.tr | 6 +- .../locale/plasmascreen.ru.tr | 6 +- .../locale/plasmascreen.zh_CN.tr | 6 +- .../locale/template.txt | 6 +- .../homedecor_plasmascreen/mod.conf | 3 + .../models/homedecor_plasmascreen_tv.obj} | 0 .../textures/homedecor_plasmascreen_back.png} | Bin .../textures/homedecor_plasmascreen_case.png} | Bin .../homedecor_plasmascreen_case_off.png} | Bin .../homedecor_plasmascreen_screen_off.png} | Bin .../homedecor_plasmascreen_tv_inv.png} | Bin .../homedecor_plasmascreen_video.png} | Bin .../homedecor_roofing/.luacheckrc | 20 - .../homedecor_roofing/init.lua | 85 +- .../locale/homedecor_roofing.de.tr | 20 +- .../locale/homedecor_roofing.es.tr | 20 +- .../locale/homedecor_roofing.fr.tr | 20 +- .../locale/homedecor_roofing.it.tr | 20 +- .../locale/homedecor_roofing.ms.tr | 20 +- .../locale/homedecor_roofing.pt.tr | 20 +- .../locale/homedecor_roofing.pt_BR.tr | 20 +- .../locale/homedecor_roofing.ru.tr | 20 +- .../locale/homedecor_roofing.zh_CN.tr | 20 +- .../homedecor_roofing/locale/template.txt | 20 +- .../homedecor_roofing/mod.conf | 2 +- .../homedecor_seating/.luacheckrc | 23 - .../homedecor_seating/README.txt | 67 - .../homedecor_seating/armchairs.lua | 41 +- .../homedecor_seating/init.lua | 154 +- .../locale/homedecor_seating.de.tr | 27 +- .../locale/homedecor_seating.es.tr | 27 +- .../locale/homedecor_seating.fr.tr | 27 +- .../locale/homedecor_seating.it.tr | 29 +- .../locale/homedecor_seating.ms.tr | 27 +- .../locale/homedecor_seating.pt.tr | 27 +- .../locale/homedecor_seating.pt_BR.tr | 27 +- .../locale/homedecor_seating.ru.tr | 27 +- .../locale/homedecor_seating.zh_CN.tr | 27 +- .../homedecor_seating/locale/template.txt | 27 +- .../homedecor_seating/longsofas.lua | 26 +- .../homedecor_seating/misc.lua | 112 +- .../homedecor_seating/mod.conf | 4 +- .../homedecor_seating/sofas.lua | 26 +- .../homedecor_tables/.luacheckrc | 20 - .../homedecor_tables/coffeetable.lua | 11 +- .../homedecor_tables/endtable.lua | 11 +- .../locale/homedecor_tables.de.tr | 34 +- .../locale/homedecor_tables.es.tr | 34 +- .../locale/homedecor_tables.fr.tr | 34 +- .../locale/homedecor_tables.it.tr | 34 +- .../locale/homedecor_tables.ms.tr | 34 +- .../locale/homedecor_tables.pt.tr | 34 +- .../locale/homedecor_tables.pt_BR.tr | 34 +- .../locale/homedecor_tables.ru.tr | 34 +- .../locale/homedecor_tables.zh_CN.tr | 34 +- .../homedecor_tables/locale/template.txt | 34 +- .../homedecor_tables/misc.lua | 69 +- .../homedecor_tables/mod.conf | 4 +- .../homedecor_trash_cans/.luacheckrc | 20 - .../homedecor_trash_cans/init.lua | 49 +- .../locale/homedecor_trash_cans.de.tr | 6 +- .../locale/homedecor_trash_cans.es.tr | 6 +- .../locale/homedecor_trash_cans.fr.tr | 6 +- .../locale/homedecor_trash_cans.ms.tr | 6 +- .../locale/homedecor_trash_cans.pt.tr | 6 +- .../locale/homedecor_trash_cans.pt_BR.tr | 6 +- .../locale/homedecor_trash_cans.ru.tr | 6 +- .../locale/homedecor_trash_cans.zh_CN.tr | 6 +- .../homedecor_trash_cans/locale/template.txt | 6 +- .../homedecor_trash_cans/mod.conf | 3 +- .../homedecor_wardrobe/init.lua | 21 +- .../locale/homedecor_wardrobe.de.tr | 6 +- .../locale/homedecor_wardrobe.es.tr | 6 +- .../locale/homedecor_wardrobe.fr.tr | 6 +- .../locale/homedecor_wardrobe.it.tr | 6 +- .../locale/homedecor_wardrobe.ms.tr | 6 +- .../locale/homedecor_wardrobe.pt.tr | 6 +- .../locale/homedecor_wardrobe.pt_BR.tr | 6 +- .../locale/homedecor_wardrobe.ru.tr | 6 +- .../locale/homedecor_wardrobe.zh_CN.tr | 6 +- .../homedecor_wardrobe/locale/template.txt | 6 +- .../homedecor_wardrobe/mod.conf | 4 +- .../.luacheckrc | 21 - .../homedecor_windows_and_treatments/init.lua | 99 +- .../homedecor_windows_and_treatments.de.tr | 20 +- .../homedecor_windows_and_treatments.es.tr | 20 +- .../homedecor_windows_and_treatments.fr.tr | 20 +- .../homedecor_windows_and_treatments.it.tr | 20 +- .../homedecor_windows_and_treatments.ms.tr | 20 +- .../homedecor_windows_and_treatments.pt.tr | 20 +- .../homedecor_windows_and_treatments.pt_BR.tr | 20 +- .../homedecor_windows_and_treatments.ru.tr | 20 +- .../homedecor_windows_and_treatments.zh_CN.tr | 20 +- .../locale/template.txt | 20 +- .../homedecor_windows_and_treatments/mod.conf | 4 +- mods/homedecor_modpack/inbox/.luacheckrc | 20 - .../inbox/locale/template.txt | 7 - mods/homedecor_modpack/inbox/mod.conf | 3 - mods/homedecor_modpack/itemframes/.luacheckrc | 21 - mods/homedecor_modpack/itemframes/init.lua | 38 +- .../itemframes/locale/itemframes.de.tr | 4 - .../itemframes/locale/itemframes.es.tr | 4 - .../itemframes/locale/itemframes.fr.tr | 4 - .../itemframes/locale/itemframes.it.tr | 12 +- .../itemframes/locale/itemframes.ms.tr | 4 - .../itemframes/locale/itemframes.pt.tr | 8 +- .../itemframes/locale/itemframes.pt_BR.tr | 8 +- .../itemframes/locale/itemframes.ru.tr | 4 - .../itemframes/locale/itemframes.zh_CN.tr | 4 - .../itemframes/locale/template.txt | 4 - mods/homedecor_modpack/itemframes/mod.conf | 4 +- mods/homedecor_modpack/lavalamp/.luacheckrc | 20 - mods/homedecor_modpack/lavalamp/init.lua | 24 +- .../lavalamp/locale/lavalamp.de.tr | 4 - .../lavalamp/locale/lavalamp.es.tr | 4 - .../lavalamp/locale/lavalamp.fr.tr | 4 - .../lavalamp/locale/lavalamp.it.tr | 4 - .../lavalamp/locale/lavalamp.ms.tr | 4 - .../lavalamp/locale/lavalamp.pt.tr | 4 - .../lavalamp/locale/lavalamp.pt_BR.tr | 4 - .../lavalamp/locale/lavalamp.ru.tr | 4 - .../lavalamp/locale/lavalamp.zh_CN.tr | 4 - .../lavalamp/locale/template.txt | 4 - mods/homedecor_modpack/lavalamp/mod.conf | 3 +- mods/homedecor_modpack/listnodes.sh | 13 - mods/homedecor_modpack/modpack.txt | 0 .../plasmascreen/.luacheckrc | 19 - mods/homedecor_modpack/plasmascreen/README.md | 14 - mods/homedecor_modpack/plasmascreen/mod.conf | 3 - mods/ilights/depends.txt | 5 - mods/ilights/description.txt | 1 - mods/ilights/init.lua | 17 +- mods/ilights/mod.conf | 4 + mods/letters/.luacheckrc | 17 + mods/letters/api.lua | 76 + mods/letters/depends.txt | 3 - mods/letters/description.txt | 2 +- mods/letters/init.lua | 648 +- mods/letters/itemlist.lua | 9 +- mods/letters/letter_cutter.lua | 488 ++ mods/letters/mod.conf | 1 + mods/letters/registrations.lua | 66 +- mods/letters/textures/letters_0d_overlay.png | Bin 0 -> 126 bytes mods/letters/textures/letters_1d_overlay.png | Bin 0 -> 114 bytes mods/letters/textures/letters_2d_overlay.png | Bin 0 -> 135 bytes mods/letters/textures/letters_3d_overlay.png | Bin 0 -> 127 bytes mods/letters/textures/letters_4d_overlay.png | Bin 0 -> 132 bytes mods/letters/textures/letters_5d_overlay.png | Bin 0 -> 124 bytes mods/letters/textures/letters_6d_overlay.png | Bin 0 -> 139 bytes mods/letters/textures/letters_7d_overlay.png | Bin 0 -> 125 bytes mods/letters/textures/letters_8d_overlay.png | Bin 0 -> 122 bytes mods/letters/textures/letters_9d_overlay.png | Bin 0 -> 135 bytes .../letters_letter_cutter_digit_top.png | Bin 0 -> 755 bytes mods/lib_mount/.luacheckrc | 6 +- mods/lib_mount/LICENSE.md | 2 +- mods/lib_mount/README.md | 7 +- mods/lib_mount/depends.txt | 1 - mods/lib_mount/init.lua | 275 +- mods/lib_mount/mod.conf | 6 +- mods/lib_mount/settingtypes.txt | 1 + mods/mesecons/.luacheckrc | 61 + mods/mesecons/.test/minetest.conf | 3 + mods/mesecons/.test/run.sh | 31 + mods/mesecons/.test_fixtures/mesecons.lua | 156 + .../mesecons/.test_fixtures/mesecons_fpga.lua | 59 + .../.test_fixtures/mesecons_gamecompat.lua | 5 + .../.test_fixtures/mesecons_luacontroller.lua | 12 + .../mesecons/.test_fixtures/mesecons_mvps.lua | 45 + mods/mesecons/.test_fixtures/screwdriver.lua | 6 + mods/mesecons/COPYING.txt | 30 + mods/mesecons/LICENSE.txt | 538 ++ mods/mesecons/README.md | 90 + mods/mesecons/bower.json | 12 + mods/mesecons/documentation.json | 65 + mods/mesecons/mesecons/actionqueue.lua | 143 + mods/mesecons/mesecons/fifo_queue.lua | 62 + mods/mesecons/mesecons/init.lua | 133 + mods/mesecons/mesecons/internal.lua | 624 ++ mods/mesecons/mesecons/legacy.lua | 14 + mods/mesecons/mesecons/locale/mesecons.de.tr | 3 + mods/mesecons/mesecons/locale/mesecons.eo.tr | 4 + mods/mesecons/mesecons/locale/mesecons.fr.tr | 4 + mods/mesecons/mesecons/locale/template.txt | 4 + mods/mesecons/mesecons/mod.conf | 4 + mods/mesecons/mesecons/oldwires.lua | 40 + mods/mesecons/mesecons/presets.lua | 88 + mods/mesecons/mesecons/services.lua | 139 + mods/mesecons/mesecons/settings.lua | 15 + mods/mesecons/mesecons/spec/action_spec.lua | 62 + mods/mesecons/mesecons/spec/mineunit.conf | 1 + mods/mesecons/mesecons/spec/service_spec.lua | 192 + mods/mesecons/mesecons/spec/state_spec.lua | 147 + .../mesecons/textures/jeija_close_window.png | Bin 0 -> 191 bytes .../textures/jeija_luacontroller_LED_A.png | Bin 0 -> 844 bytes .../textures/jeija_luacontroller_LED_B.png | Bin 0 -> 838 bytes .../textures/jeija_luacontroller_LED_C.png | Bin 0 -> 851 bytes .../textures/jeija_luacontroller_LED_D.png | Bin 0 -> 846 bytes .../textures/jeija_microcontroller_bottom.png | Bin 0 -> 222 bytes .../textures/jeija_microcontroller_sides.png | Bin 0 -> 504 bytes .../mesecons/textures/mesecons_wire_inv.png | Bin 0 -> 144 bytes .../mesecons/textures/mesecons_wire_off.png | Bin 0 -> 377 bytes .../mesecons/textures/mesecons_wire_on.png | Bin 0 -> 362 bytes mods/mesecons/mesecons/util.lua | 523 ++ mods/mesecons/mesecons_alias/init.lua | 38 + mods/mesecons/mesecons_alias/mod.conf | 2 + .../doc/blinkyplant/description.html | 2 + .../doc/blinkyplant/preview.png | Bin 0 -> 55565 bytes .../doc/blinkyplant/recipe.png | Bin 0 -> 1776 bytes mods/mesecons/mesecons_blinkyplant/init.lua | 60 + .../locale/mesecons_blinkyplant.de.tr | 2 + .../locale/mesecons_blinkyplant.eo.tr | 4 + .../locale/mesecons_blinkyplant.fr.tr | 4 + .../mesecons_blinkyplant/locale/template.txt | 4 + mods/mesecons/mesecons_blinkyplant/mod.conf | 2 + .../textures/jeija_blinky_plant_off.png | Bin 0 -> 367 bytes .../textures/jeija_blinky_plant_on.png | Bin 0 -> 394 bytes .../doc/button/description.html | 1 + .../mesecons_button/doc/button/preview.png | Bin 0 -> 69125 bytes .../mesecons_button/doc/button/recipe.png | Bin 0 -> 4364 bytes mods/mesecons/mesecons_button/init.lua | 111 + .../locale/mesecons_button.de.tr | 2 + .../locale/mesecons_button.eo.tr | 4 + .../locale/mesecons_button.fr.tr | 4 + .../mesecons_button/locale/template.txt | 4 + mods/mesecons/mesecons_button/mod.conf | 2 + .../sounds/mesecons_button_pop.ogg | Bin 0 -> 6184 bytes .../sounds/mesecons_button_push.ogg | Bin 0 -> 6982 bytes .../textures/jeija_wall_button_off.png | Bin 0 -> 371 bytes .../textures/jeija_wall_button_on.png | Bin 0 -> 409 bytes .../textures/jeija_wall_button_sides.png | Bin 0 -> 220 bytes .../doc/commandblock/description.html | 2 + .../doc/commandblock/preview.png | Bin 0 -> 33347 bytes mods/mesecons/mesecons_commandblock/init.lua | 216 + .../locale/mesecons_commandblock.de.tr | 5 + .../locale/mesecons_commandblock.eo.tr | 7 + .../locale/mesecons_commandblock.fr.tr | 7 + .../mesecons_commandblock/locale/template.txt | 7 + mods/mesecons/mesecons_commandblock/mod.conf | 2 + .../textures/jeija_commandblock_off.png | Bin 0 -> 183 bytes .../textures/jeija_commandblock_on.png | Bin 0 -> 183 bytes .../doc/delayer/description.html | 1 + .../mesecons_delayer/doc/delayer/preview.png | Bin 0 -> 51349 bytes .../mesecons_delayer/doc/delayer/recipe.png | Bin 0 -> 4328 bytes mods/mesecons/mesecons_delayer/init.lua | 159 + .../locale/mesecons_delayer.de.tr | 3 + .../locale/mesecons_delayer.eo.tr | 5 + .../locale/mesecons_delayer.fr.tr | 5 + .../mesecons_delayer/locale/template.txt | 5 + mods/mesecons/mesecons_delayer/mod.conf | 2 + .../textures/jeija_delayer.png | Bin 0 -> 149 bytes .../textures/jeija_gate_off.png | Bin 0 -> 84 bytes .../textures/jeija_gate_on.png | Bin 0 -> 84 bytes .../textures/jeija_gate_output_off.png | Bin 0 -> 98 bytes .../textures/jeija_gate_output_on.png | Bin 0 -> 99 bytes .../textures/jeija_gate_side.png | Bin 0 -> 136 bytes .../textures/jeija_gate_side_output_off.png | Bin 0 -> 109 bytes .../textures/jeija_gate_side_output_on.png | Bin 0 -> 110 bytes .../textures/mesecons_delayer_1.png | Bin 0 -> 338 bytes .../textures/mesecons_delayer_2.png | Bin 0 -> 337 bytes .../textures/mesecons_delayer_3.png | Bin 0 -> 339 bytes .../textures/mesecons_delayer_4.png | Bin 0 -> 334 bytes .../doc/nodedetector/description.html | 11 + .../doc/nodedetector/preview.png | Bin 0 -> 44286 bytes .../doc/nodedetector/recipe.png | Bin 0 -> 7444 bytes .../doc/objectdetector/description.html | 5 + .../doc/objectdetector/preview.png | Bin 0 -> 80327 bytes .../doc/objectdetector/recipe.png | Bin 0 -> 7278 bytes mods/mesecons/mesecons_detector/init.lua | 332 + .../locale/mesecons_detector.de.tr | 3 + .../locale/mesecons_detector.eo.tr | 5 + .../locale/mesecons_detector.fr.tr | 5 + .../mesecons_detector/locale/template.txt | 5 + mods/mesecons/mesecons_detector/mod.conf | 2 + .../textures/jeija_node_detector_off.png | Bin 0 -> 640 bytes .../textures/jeija_node_detector_on.png | Bin 0 -> 687 bytes .../textures/jeija_object_detector_off.png | Bin 0 -> 655 bytes .../textures/jeija_object_detector_on.png | Bin 0 -> 693 bytes .../textures/mesecons_detector_side.png | Bin 0 -> 350 bytes mods/mesecons/mesecons_doors/init.lua | 145 + mods/mesecons/mesecons_doors/mod.conf | 3 + mods/mesecons/mesecons_extrawires/corner.lua | 77 + .../mesecons_extrawires/crossover.lua | 143 + .../doc/corner/description.html | 1 + .../doc/corner/preview.png | Bin 0 -> 37206 bytes .../mesecons_extrawires/doc/corner/recipe.png | Bin 0 -> 1984 bytes .../doc/crossing/description.html | 1 + .../doc/crossing/preview.png | Bin 0 -> 59072 bytes .../doc/crossing/recipe.png | Bin 0 -> 1741 bytes .../doc/mese/description.html | 1 + .../mesecons_extrawires/doc/mese/preview.png | Bin 0 -> 28110 bytes .../mesecons_extrawires/doc/mese/recipe.png | Bin 0 -> 2541 bytes .../doc/tjunction/description.html | 1 + .../doc/tjunction/preview.png | Bin 0 -> 48016 bytes .../doc/tjunction/recipe.png | Bin 0 -> 1994 bytes .../doc/vertical/description.html | 1 + .../doc/vertical/preview.png | Bin 0 -> 10834 bytes .../doc/vertical/recipe.png | Bin 0 -> 1959 bytes .../mesecons_extrawires/doublecorner.lua | 78 + mods/mesecons/mesecons_extrawires/init.lua | 6 + .../locale/mesecons_extrawires.de.tr | 8 + .../locale/mesecons_extrawires.eo.tr | 20 + .../locale/mesecons_extrawires.fr.tr | 20 + .../mesecons_extrawires/locale/template.txt | 20 + .../mesecons/mesecons_extrawires/mesewire.lua | 58 + mods/mesecons/mesecons_extrawires/mod.conf | 2 + .../models/mesecons_extrawires_corner.obj | 125 + .../models/mesecons_extrawires_crossover.b3d | Bin 0 -> 3233 bytes .../mesecons_extrawires_doublecorner.obj | 180 + .../src/mesecons_extrawires_crossover.blend | Bin 0 -> 498592 bytes .../mesecons_extrawires/tjunction.lua | 87 + .../mesecons/mesecons_extrawires/vertical.lua | 193 + .../mesecons_fpga/doc/fpga/description.html | 6 + .../mesecons_fpga/doc/fpga/preview.png | Bin 0 -> 20129 bytes .../mesecons_fpga/doc/fpga/recipe.png | Bin 0 -> 2998 bytes .../doc/programmer/description.html | 3 + .../mesecons_fpga/doc/programmer/preview.png | Bin 0 -> 519 bytes .../mesecons_fpga/doc/programmer/recipe.png | Bin 0 -> 1746 bytes mods/mesecons/mesecons_fpga/init.lua | 464 ++ .../mesecons_fpga/locale/mesecons_fpga.de.tr | 3 + .../mesecons_fpga/locale/mesecons_fpga.eo.tr | 7 + .../mesecons_fpga/locale/mesecons_fpga.fr.tr | 7 + .../mesecons_fpga/locale/template.txt | 7 + mods/mesecons/mesecons_fpga/logic.lua | 222 + mods/mesecons/mesecons_fpga/mod.conf | 3 + .../sounds/mesecons_fpga_copy.ogg | Bin 0 -> 7249 bytes .../sounds/mesecons_fpga_fail.ogg | Bin 0 -> 8633 bytes .../sounds/mesecons_fpga_write.ogg | Bin 0 -> 5706 bytes .../mesecons_fpga/spec/helper_spec.lua | 106 + .../mesecons_fpga/spec/logic_spec.lua | 235 + .../mesecons/mesecons_fpga/spec/mineunit.conf | 1 + .../textures/jeija_fpga_programmer.png | Bin 0 -> 256 bytes .../textures/jeija_fpga_sides.png | Bin 0 -> 480 bytes .../mesecons_fpga/textures/jeija_fpga_top.png | Bin 0 -> 760 bytes mods/mesecons/mesecons_fpga/tool.lua | 73 + .../mesecons_gamecompat/compat_mcl.lua | 43 + .../mesecons_gamecompat/compat_mtg.lua | 75 + mods/mesecons/mesecons_gamecompat/init.lua | 20 + mods/mesecons/mesecons_gamecompat/mod.conf | 3 + .../mesecons_gates/doc/and/description.html | 2 + .../mesecons_gates/doc/and/preview.png | Bin 0 -> 52750 bytes .../mesecons_gates/doc/and/recipe.png | Bin 0 -> 1721 bytes .../mesecons_gates/doc/diode/description.html | 2 + .../mesecons_gates/doc/diode/preview.png | Bin 0 -> 55517 bytes .../mesecons_gates/doc/diode/recipe.png | Bin 0 -> 1311 bytes .../mesecons_gates/doc/nand/description.html | 2 + .../mesecons_gates/doc/nand/preview.png | Bin 0 -> 47932 bytes .../mesecons_gates/doc/nand/recipe.png | Bin 0 -> 1756 bytes .../mesecons_gates/doc/nor/description.html | 2 + .../mesecons_gates/doc/nor/preview.png | Bin 0 -> 21545 bytes .../mesecons_gates/doc/nor/recipe.png | Bin 0 -> 1151 bytes .../mesecons_gates/doc/not/description.html | 2 + .../mesecons_gates/doc/not/preview.png | Bin 0 -> 53940 bytes .../mesecons_gates/doc/not/recipe.png | Bin 0 -> 1338 bytes .../mesecons_gates/doc/or/description.html | 2 + .../mesecons_gates/doc/or/preview.png | Bin 0 -> 21144 bytes .../mesecons/mesecons_gates/doc/or/recipe.png | Bin 0 -> 1142 bytes .../mesecons_gates/doc/xor/description.html | 2 + .../mesecons_gates/doc/xor/preview.png | Bin 0 -> 53990 bytes .../mesecons_gates/doc/xor/recipe.png | Bin 0 -> 1675 bytes mods/mesecons/mesecons_gates/init.lua | 183 + mods/mesecons/mesecons_gates/mod.conf | 2 + .../textures/jeija_gate_and.png | Bin 0 -> 123 bytes .../textures/jeija_gate_diode.png | Bin 0 -> 128 bytes .../textures/jeija_gate_nand.png | Bin 0 -> 127 bytes .../textures/jeija_gate_nor.png | Bin 0 -> 127 bytes .../textures/jeija_gate_not.png | Bin 0 -> 128 bytes .../mesecons_gates/textures/jeija_gate_or.png | Bin 0 -> 127 bytes .../textures/jeija_gate_xor.png | Bin 0 -> 128 bytes .../doc/waterturbine/description.html | 2 + .../doc/waterturbine/preview.png | Bin 0 -> 33009 bytes .../doc/waterturbine/recipe.png | Bin 0 -> 7137 bytes mods/mesecons/mesecons_hydroturbine/init.lua | 106 + .../locale/mesecons_hydroturbine.de.tr | 2 + .../locale/mesecons_hydroturbine.eo.tr | 4 + .../locale/mesecons_hydroturbine.fr.tr | 4 + .../mesecons_hydroturbine/locale/template.txt | 4 + mods/mesecons/mesecons_hydroturbine/mod.conf | 2 + .../models/jeija_hydro_turbine_off.obj | 429 ++ .../models/jeija_hydro_turbine_on.obj | 2059 +++++ .../textures/jeija_hydro_turbine_inv.png | Bin 0 -> 4847 bytes .../jeija_hydro_turbine_sides_off.png | Bin 0 -> 776 bytes .../textures/jeija_hydro_turbine_sides_on.png | Bin 0 -> 754 bytes .../jeija_hydro_turbine_top_bottom.png | Bin 0 -> 564 bytes .../jeija_hydro_turbine_turbine_misc_off.png | Bin 0 -> 729 bytes .../jeija_hydro_turbine_turbine_misc_on.png | Bin 0 -> 1721 bytes ...a_hydro_turbine_turbine_top_bottom_off.png | Bin 0 -> 496 bytes ...ja_hydro_turbine_turbine_top_bottom_on.png | Bin 0 -> 1635 bytes .../doc/insulated/description.html | 1 + .../doc/insulated/preview.png | Bin 0 -> 40887 bytes .../doc/insulated/recipe.png | Bin 0 -> 2528 bytes mods/mesecons/mesecons_insulated/init.lua | 88 + .../locale/mesecons_insulated.de.tr | 2 + .../locale/mesecons_insulated.eo.tr | 4 + .../locale/mesecons_insulated.fr.tr | 4 + .../mesecons_insulated/locale/template.txt | 4 + mods/mesecons/mesecons_insulated/mod.conf | 2 + .../jeija_insulated_wire_ends_off.png | Bin 0 -> 109 bytes .../textures/jeija_insulated_wire_ends_on.png | Bin 0 -> 109 bytes .../jeija_insulated_wire_sides_off.png | Bin 0 -> 100 bytes .../jeija_insulated_wire_sides_on.png | Bin 0 -> 100 bytes .../jeija_insulated_wire_tjunction_tb_off.png | Bin 0 -> 139 bytes .../jeija_insulated_wire_tjunction_tb_on.png | Bin 0 -> 139 bytes .../mesecons_lamp/doc/lamp/description.html | 1 + .../mesecons_lamp/doc/lamp/preview.png | Bin 0 -> 29078 bytes .../mesecons_lamp/doc/lamp/recipe.png | Bin 0 -> 2405 bytes mods/mesecons/mesecons_lamp/init.lua | 73 + .../mesecons_lamp/locale/mesecons_lamp.de.tr | 2 + .../mesecons_lamp/locale/mesecons_lamp.eo.tr | 4 + .../mesecons_lamp/locale/mesecons_lamp.fr.tr | 4 + .../mesecons_lamp/locale/template.txt | 4 + mods/mesecons/mesecons_lamp/mod.conf | 2 + .../mesecons_lamp/textures/jeija_meselamp.png | Bin 0 -> 149 bytes .../textures/jeija_meselamp_off.png | Bin 0 -> 131 bytes .../textures/jeija_meselamp_on.png | Bin 0 -> 162 bytes .../doc/lightstone_blue/description.html | 2 + .../doc/lightstone_blue/preview.png | Bin 0 -> 32516 bytes .../doc/lightstone_blue/recipe.png | Bin 0 -> 2561 bytes .../doc/lightstone_darkgrey/description.html | 2 + .../doc/lightstone_darkgrey/preview.png | Bin 0 -> 36947 bytes .../doc/lightstone_darkgrey/recipe.png | Bin 0 -> 2606 bytes .../doc/lightstone_green/description.html | 2 + .../doc/lightstone_green/preview.png | Bin 0 -> 47266 bytes .../doc/lightstone_green/recipe.png | Bin 0 -> 2732 bytes .../doc/lightstone_lightgrey/description.html | 2 + .../doc/lightstone_lightgrey/preview.png | Bin 0 -> 39387 bytes .../doc/lightstone_lightgrey/recipe.png | Bin 0 -> 2726 bytes .../doc/lightstone_red/description.html | 2 + .../doc/lightstone_red/preview.png | Bin 0 -> 29794 bytes .../doc/lightstone_red/recipe.png | Bin 0 -> 2535 bytes .../doc/lightstone_yellow/description.html | 2 + .../doc/lightstone_yellow/preview.png | Bin 0 -> 27737 bytes .../doc/lightstone_yellow/recipe.png | Bin 0 -> 2651 bytes mods/mesecons/mesecons_lightstone/init.lua | 75 + .../locale/mesecons_lightstone.de.tr | 13 + .../locale/mesecons_lightstone.eo.tr | 15 + .../locale/mesecons_lightstone.fr.tr | 15 + .../mesecons_lightstone/locale/template.txt | 15 + mods/mesecons/mesecons_lightstone/mod.conf | 2 + .../textures/jeija_lightstone_blue_off.png | Bin 0 -> 217 bytes .../textures/jeija_lightstone_blue_on.png | Bin 0 -> 399 bytes .../textures/jeija_lightstone_cyan_off.png | Bin 0 -> 249 bytes .../textures/jeija_lightstone_cyan_on.png | Bin 0 -> 461 bytes .../jeija_lightstone_darkgray_off.png | Bin 0 -> 234 bytes .../textures/jeija_lightstone_darkgray_on.png | Bin 0 -> 454 bytes .../textures/jeija_lightstone_gray_off.png | Bin 0 -> 239 bytes .../textures/jeija_lightstone_gray_on.png | Bin 0 -> 449 bytes .../textures/jeija_lightstone_green_off.png | Bin 0 -> 233 bytes .../textures/jeija_lightstone_green_on.png | Bin 0 -> 492 bytes .../textures/jeija_lightstone_magenta_off.png | Bin 0 -> 186 bytes .../textures/jeija_lightstone_magenta_on.png | Bin 0 -> 433 bytes .../textures/jeija_lightstone_orange_off.png | Bin 0 -> 210 bytes .../textures/jeija_lightstone_orange_on.png | Bin 0 -> 431 bytes .../textures/jeija_lightstone_pink_off.png | Bin 0 -> 156 bytes .../textures/jeija_lightstone_pink_on.png | Bin 0 -> 348 bytes .../textures/jeija_lightstone_red_off.png | Bin 0 -> 195 bytes .../textures/jeija_lightstone_red_on.png | Bin 0 -> 437 bytes .../textures/jeija_lightstone_violet_off.png | Bin 0 -> 186 bytes .../textures/jeija_lightstone_violet_on.png | Bin 0 -> 433 bytes .../textures/jeija_lightstone_white_off.png | Bin 0 -> 235 bytes .../textures/jeija_lightstone_white_on.png | Bin 0 -> 167 bytes .../textures/jeija_lightstone_yellow_off.png | Bin 0 -> 217 bytes .../textures/jeija_lightstone_yellow_on.png | Bin 0 -> 428 bytes .../doc/luacontroller/description.html | 7 + .../doc/luacontroller/preview.png | Bin 0 -> 62643 bytes .../doc/luacontroller/recipe.png | Bin 0 -> 5065 bytes mods/mesecons/mesecons_luacontroller/init.lua | 966 +++ .../locale/mesecons_luacontroller.de.tr | 2 + .../locale/mesecons_luacontroller.eo.tr | 4 + .../locale/mesecons_luacontroller.fr.tr | 4 + .../locale/template.txt | 4 + mods/mesecons/mesecons_luacontroller/mod.conf | 2 + .../spec/lightweight_interrupt_spec.lua | 38 + .../mesecons_luacontroller/spec/luac_spec.lua | 176 + .../mesecons_luacontroller/spec/mineunit.conf | 1 + .../textures/jeija_luac_background.png | Bin 0 -> 655 bytes .../textures/jeija_luac_runbutton.png | Bin 0 -> 2150 bytes .../jeija_luacontroller_burnt_top.png | Bin 0 -> 5031 bytes .../textures/jeija_luacontroller_top.png | Bin 0 -> 9497 bytes .../doc/fiber/description.html | 1 + .../mesecons_materials/doc/fiber/preview.png | Bin 0 -> 88107 bytes .../mesecons_materials/doc/fiber/recipe.png | Bin 0 -> 4005 bytes .../doc/glue/description.html | 1 + .../mesecons_materials/doc/glue/preview.png | Bin 0 -> 48349 bytes .../mesecons_materials/doc/glue/recipe.png | Bin 0 -> 3626 bytes .../doc/silicon/description.html | 1 + .../doc/silicon/preview.png | Bin 0 -> 52329 bytes .../mesecons_materials/doc/silicon/recipe.png | Bin 0 -> 6189 bytes mods/mesecons/mesecons_materials/init.lua | 43 + .../locale/mesecons_materials.de.tr | 4 + .../locale/mesecons_materials.eo.tr | 6 + .../locale/mesecons_materials.fr.tr | 6 + .../mesecons_materials/locale/template.txt | 6 + mods/mesecons/mesecons_materials/mod.conf | 2 + .../textures/mesecons_fiber.png | Bin 0 -> 427 bytes .../textures/mesecons_glue.png | Bin 0 -> 421 bytes .../textures/mesecons_silicon.png | Bin 0 -> 582 bytes .../doc/microcontroller/description.html | 64 + .../doc/microcontroller/description.md | 59 + .../doc/microcontroller/preview.png | Bin 0 -> 19204 bytes .../doc/microcontroller/recipe.png | Bin 0 -> 2954 bytes .../mesecons_microcontroller/init.lua | 729 ++ .../locale/mesecons_microcontroller.de.tr | 2 + .../locale/mesecons_microcontroller.eo.tr | 4 + .../locale/mesecons_microcontroller.fr.tr | 4 + .../locale/template.txt | 4 + .../mesecons_microcontroller/mod.conf | 2 + .../textures/jeija_microcontroller_top.png | Bin 0 -> 766 bytes .../doc/movestone/description.html | 2 + .../doc/movestone/preview.png | Bin 0 -> 70338 bytes .../doc/movestone/recipe.png | Bin 0 -> 7974 bytes .../doc/movestone_sticky/description.html | 3 + .../doc/movestone_sticky/preview.png | Bin 0 -> 78080 bytes .../doc/movestone_sticky/recipe.png | Bin 0 -> 7190 bytes mods/mesecons/mesecons_movestones/init.lua | 238 + .../locale/mesecons_movestone.fr.tr | 7 + .../locale/mesecons_movestones.de.tr | 5 + .../locale/mesecons_movestones.eo.tr | 7 + .../mesecons_movestones/locale/template.txt | 7 + mods/mesecons/mesecons_movestones/mod.conf | 2 + .../mesecons_movestones/sounds/movestone.ogg | Bin 0 -> 12350 bytes .../textures/jeija_movestone_arrows.png | Bin 0 -> 291 bytes .../textures/jeija_movestone_side.png | Bin 0 -> 220 bytes .../textures/jeija_sticky_movestone.png | Bin 0 -> 688 bytes mods/mesecons/mesecons_mvps/init.lua | 340 + mods/mesecons/mesecons_mvps/mod.conf | 2 + .../mesecons/mesecons_mvps/spec/mineunit.conf | 1 + .../mesecons/mesecons_mvps/spec/node_spec.lua | 297 + .../mesecons_mvps/spec/object_spec.lua | 3 + mods/mesecons/mesecons_noteblock/README.txt | 15 + .../doc/noteblock/description.html | 13 + .../doc/noteblock/preview.png | Bin 0 -> 115328 bytes .../doc/noteblock/recipe.png | Bin 0 -> 11285 bytes mods/mesecons/mesecons_noteblock/init.lua | 120 + .../locale/mesecons_noteblock.de.tr | 2 + .../locale/mesecons_noteblock.eo.tr | 4 + .../locale/mesecons_noteblock.fr.tr | 4 + .../mesecons_noteblock/locale/template.txt | 4 + mods/mesecons/mesecons_noteblock/mod.conf | 2 + .../sounds/mesecons_noteblock_a.ogg | Bin 0 -> 10808 bytes .../sounds/mesecons_noteblock_a2.ogg | Bin 0 -> 11735 bytes .../sounds/mesecons_noteblock_asharp.ogg | Bin 0 -> 10732 bytes .../sounds/mesecons_noteblock_asharp2.ogg | Bin 0 -> 11000 bytes .../sounds/mesecons_noteblock_b.ogg | Bin 0 -> 10282 bytes .../sounds/mesecons_noteblock_b2.ogg | Bin 0 -> 10045 bytes .../sounds/mesecons_noteblock_c.ogg | Bin 0 -> 11670 bytes .../sounds/mesecons_noteblock_c2.ogg | Bin 0 -> 16981 bytes .../sounds/mesecons_noteblock_crash.ogg | Bin 0 -> 50320 bytes .../sounds/mesecons_noteblock_csharp.ogg | Bin 0 -> 11651 bytes .../sounds/mesecons_noteblock_csharp2.ogg | Bin 0 -> 17008 bytes .../sounds/mesecons_noteblock_d.ogg | Bin 0 -> 11175 bytes .../sounds/mesecons_noteblock_d2.ogg | Bin 0 -> 16678 bytes .../sounds/mesecons_noteblock_dsharp.ogg | Bin 0 -> 10882 bytes .../sounds/mesecons_noteblock_dsharp2.ogg | Bin 0 -> 16145 bytes .../sounds/mesecons_noteblock_e.ogg | Bin 0 -> 10829 bytes .../sounds/mesecons_noteblock_e2.ogg | Bin 0 -> 15458 bytes .../sounds/mesecons_noteblock_f.ogg | Bin 0 -> 10990 bytes .../sounds/mesecons_noteblock_f2.ogg | Bin 0 -> 14917 bytes .../sounds/mesecons_noteblock_fsharp.ogg | Bin 0 -> 10509 bytes .../sounds/mesecons_noteblock_fsharp2.ogg | Bin 0 -> 14139 bytes .../sounds/mesecons_noteblock_g.ogg | Bin 0 -> 10465 bytes .../sounds/mesecons_noteblock_g2.ogg | Bin 0 -> 13342 bytes .../sounds/mesecons_noteblock_gsharp.ogg | Bin 0 -> 10595 bytes .../sounds/mesecons_noteblock_gsharp2.ogg | Bin 0 -> 12583 bytes .../sounds/mesecons_noteblock_hihat.ogg | Bin 0 -> 5459 bytes .../sounds/mesecons_noteblock_kick.ogg | Bin 0 -> 10361 bytes .../sounds/mesecons_noteblock_litecrash.ogg | Bin 0 -> 27627 bytes .../sounds/mesecons_noteblock_snare.ogg | Bin 0 -> 9865 bytes .../textures/mesecons_noteblock.png | Bin 0 -> 836 bytes .../doc/piston/description.html | 3 + .../mesecons_pistons/doc/piston/preview.png | Bin 0 -> 106195 bytes .../mesecons_pistons/doc/piston/recipe.png | Bin 0 -> 14800 bytes .../doc/piston_sticky/description.html | 4 + .../doc/piston_sticky/preview.png | Bin 0 -> 98226 bytes .../doc/piston_sticky/recipe.png | Bin 0 -> 10572 bytes mods/mesecons/mesecons_pistons/init.lua | 484 ++ mods/mesecons/mesecons_pistons/legacy.lua | 48 + .../locale/mesecons_pistons.de.tr | 7 + .../locale/mesecons_pistons.eo.tr | 9 + .../locale/mesecons_pistons.fr.tr | 9 + .../mesecons_pistons/locale/template.txt | 9 + mods/mesecons/mesecons_pistons/mod.conf | 2 + .../mesecons_pistons/sounds/piston_extend.ogg | Bin 0 -> 7060 bytes .../sounds/piston_retract.ogg | Bin 0 -> 7092 bytes .../textures/mesecons_piston_back.png | Bin 0 -> 723 bytes .../textures/mesecons_piston_on_front.png | Bin 0 -> 719 bytes .../textures/mesecons_piston_pusher_back.png | Bin 0 -> 741 bytes .../textures/mesecons_piston_pusher_front.png | Bin 0 -> 719 bytes .../mesecons_piston_pusher_front_sticky.png | Bin 0 -> 698 bytes .../textures/mesecons_piston_pusher_top.png | Bin 0 -> 724 bytes .../textures/mesecons_piston_top.png | Bin 0 -> 738 bytes .../doc/powerplant/description.html | 2 + .../doc/powerplant/preview.png | Bin 0 -> 56589 bytes .../doc/powerplant/recipe.png | Bin 0 -> 1709 bytes mods/mesecons/mesecons_powerplant/init.lua | 35 + .../locale/mesecons_powerplant.de.tr | 2 + .../locale/mesecons_powerplant.eo.tr | 4 + .../locale/mesecons_powerplant.fr.tr | 4 + .../mesecons_powerplant/locale/template.txt | 4 + mods/mesecons/mesecons_powerplant/mod.conf | 2 + .../textures/jeija_power_plant.png | Bin 0 -> 365 bytes .../doc/pressureplate_stone/description.html | 1 + .../doc/pressureplate_stone/preview.png | Bin 0 -> 51888 bytes .../doc/pressureplate_stone/recipe.png | Bin 0 -> 4453 bytes .../doc/pressureplate_wood/description.html | 1 + .../doc/pressureplate_wood/preview.png | Bin 0 -> 63411 bytes .../doc/pressureplate_wood/recipe.png | Bin 0 -> 5361 bytes .../mesecons/mesecons_pressureplates/init.lua | 155 + .../locale/mesecons_pressureplates.de.tr | 3 + .../locale/mesecons_pressureplates.eo.tr | 5 + .../locale/mesecons_pressureplates.fr.tr | 5 + .../locale/template.txt | 5 + .../mesecons/mesecons_pressureplates/mod.conf | 2 + .../jeija_pressure_plate_stone_inv.png | Bin 0 -> 564 bytes .../jeija_pressure_plate_stone_off.png | Bin 0 -> 515 bytes .../jeija_pressure_plate_stone_off_edges.png | Bin 0 -> 252 bytes .../jeija_pressure_plate_stone_on.png | Bin 0 -> 539 bytes .../jeija_pressure_plate_stone_on_edges.png | Bin 0 -> 296 bytes .../jeija_pressure_plate_stone_wield.png | Bin 0 -> 564 bytes .../jeija_pressure_plate_wood_inv.png | Bin 0 -> 676 bytes .../jeija_pressure_plate_wood_off.png | Bin 0 -> 623 bytes .../jeija_pressure_plate_wood_off_edges.png | Bin 0 -> 255 bytes .../textures/jeija_pressure_plate_wood_on.png | Bin 0 -> 635 bytes .../jeija_pressure_plate_wood_on_edges.png | Bin 0 -> 296 bytes .../jeija_pressure_plate_wood_wield.png | Bin 0 -> 676 bytes .../doc/ghoststone/description.html | 2 + .../doc/ghoststone/preview.png | Bin 0 -> 32248 bytes .../mesecons_random/doc/ghoststone/recipe.png | Bin 0 -> 14896 bytes .../doc/removestone/description.html | 2 + .../doc/removestone/preview.png | Bin 0 -> 79232 bytes .../doc/removestone/recipe.png | Bin 0 -> 14373 bytes mods/mesecons/mesecons_random/init.lua | 80 + .../locale/mesecons_random.de.tr | 3 + .../locale/mesecons_random.eo.tr | 5 + .../locale/mesecons_random.fr.tr | 5 + .../mesecons_random/locale/template.txt | 5 + mods/mesecons/mesecons_random/mod.conf | 2 + .../textures/jeija_ghoststone.png | Bin 0 -> 690 bytes .../textures/jeija_ghoststone_inv.png | Bin 0 -> 709 bytes .../textures/jeija_removestone.png | Bin 0 -> 690 bytes .../textures/jeija_removestone_inv.png | Bin 0 -> 709 bytes mods/mesecons/mesecons_receiver/init.lua | 264 + mods/mesecons/mesecons_receiver/mod.conf | 2 + .../textures/receiver_bottom_off.png | Bin 0 -> 362 bytes .../textures/receiver_bottom_on.png | Bin 0 -> 169 bytes .../textures/receiver_fb_off.png | Bin 0 -> 362 bytes .../textures/receiver_fb_on.png | Bin 0 -> 169 bytes .../textures/receiver_lr_off.png | Bin 0 -> 362 bytes .../textures/receiver_lr_on.png | Bin 0 -> 169 bytes .../textures/receiver_top_off.png | Bin 0 -> 362 bytes .../textures/receiver_top_on.png | Bin 0 -> 169 bytes .../doc/solarpanel/description.html | 2 + .../doc/solarpanel/preview.png | Bin 0 -> 55278 bytes .../doc/solarpanel/recipe.png | Bin 0 -> 3203 bytes mods/mesecons/mesecons_solarpanel/init.lua | 65 + .../locale/mesecons_solarpanel.de.tr | 2 + .../locale/mesecons_solarpanel.eo.tr | 4 + .../locale/mesecons_solarpanel.fr.tr | 4 + .../mesecons_solarpanel/locale/template.txt | 4 + mods/mesecons/mesecons_solarpanel/mod.conf | 2 + .../textures/mesecons_solarpanel.png | Bin 0 -> 607 bytes mods/mesecons/mesecons_stickyblocks/init.lua | 21 + .../locale/mesecons_stickyblocks.de.tr | 2 + .../locale/mesecons_stickyblocks.eo.tr | 4 + .../locale/mesecons_stickyblocks.fr.tr | 4 + .../mesecons_stickyblocks/locale/template.txt | 4 + mods/mesecons/mesecons_stickyblocks/mod.conf | 2 + .../textures/mesecons_stickyblocks_sticky.png | Bin 0 -> 661 bytes .../doc/switch/description.html | 1 + .../mesecons_switch/doc/switch/preview.png | Bin 0 -> 73831 bytes .../mesecons_switch/doc/switch/recipe.png | Bin 0 -> 8144 bytes mods/mesecons/mesecons_switch/init.lua | 38 + .../locale/mesecons_switch.de.tr | 2 + .../locale/mesecons_switch.eo.tr | 4 + .../locale/mesecons_switch.fr.tr | 4 + .../mesecons_switch/locale/template.txt | 4 + mods/mesecons/mesecons_switch/mod.conf | 2 + .../sounds/mesecons_switch.ogg | Bin 0 -> 6982 bytes .../textures/mesecons_switch_off.png | Bin 0 -> 505 bytes .../textures/mesecons_switch_on.png | Bin 0 -> 618 bytes .../textures/mesecons_switch_side.png | Bin 0 -> 253 bytes .../mesecons_torch/doc/torch/description.html | 2 + .../mesecons_torch/doc/torch/preview.png | Bin 0 -> 9161 bytes .../mesecons_torch/doc/torch/recipe.png | Bin 0 -> 1457 bytes mods/mesecons/mesecons_torch/init.lua | 130 + .../locale/mesecons_torch.de.tr | 2 + .../locale/mesecons_torch.eo.tr | 4 + .../locale/mesecons_torch.fr.tr | 4 + .../mesecons_torch/locale/template.txt | 4 + mods/mesecons/mesecons_torch/mod.conf | 2 + .../textures/jeija_torches_off.png | Bin 0 -> 149 bytes .../textures/jeija_torches_on.png | Bin 0 -> 148 bytes .../doc/walllever/description.html | 1 + .../doc/walllever/preview.png | Bin 0 -> 69747 bytes .../doc/walllever/recipe.png | Bin 0 -> 4000 bytes mods/mesecons/mesecons_walllever/init.lua | 66 + .../locale/mesecons_walllever.de.tr | 2 + .../locale/mesecons_walllever.eo.tr | 4 + .../locale/mesecons_walllever.fr.tr | 4 + .../mesecons_walllever/locale/template.txt | 4 + mods/mesecons/mesecons_walllever/mod.conf | 2 + .../models/jeija_wall_lever_off.obj | 216 + .../models/jeija_wall_lever_on.obj | 216 + .../sounds/mesecons_lever.ogg | Bin 0 -> 6982 bytes .../textures/jeija_wall_lever_back_edges.png | Bin 0 -> 238 bytes .../textures/jeija_wall_lever_front.png | Bin 0 -> 200 bytes .../textures/jeija_wall_lever_front_bump.png | Bin 0 -> 147 bytes .../textures/jeija_wall_lever_inv.png | Bin 0 -> 396 bytes .../jeija_wall_lever_lever_light_off.png | Bin 0 -> 256 bytes .../jeija_wall_lever_lever_light_on.png | Bin 0 -> 271 bytes .../doc/mesecon/description.html | 1 + .../mesecons_wires/doc/mesecon/preview.png | Bin 0 -> 27697 bytes .../mesecons_wires/doc/mesecon/recipe.png | Bin 0 -> 2569 bytes mods/mesecons/mesecons_wires/init.lua | 263 + .../locale/mesecons_wires.de.tr | 2 + .../locale/mesecons_wires.eo.tr | 4 + .../locale/mesecons_wires.fr.tr | 4 + .../mesecons_wires/locale/template.txt | 4 + mods/mesecons/mesecons_wires/mod.conf | 2 + mods/mesecons/modpack.conf | 3 + mods/mesecons/screenshot.png | Bin 0 -> 166568 bytes mods/mesecons/settingtypes.txt | 62 + mods/minetest_mtg_plus/README.md | 5 +- mods/minetest_mtg_plus/brickblocks.lua | 2 +- mods/minetest_mtg_plus/locale/mtg_plus.fr.tr | 245 + mods/minetest_mtg_plus/specials.lua | 9 +- mods/mob_horse/depends.txt | 3 - mods/mob_horse/init.lua | 124 +- mods/mob_horse/intllib.lua | 3 - mods/mob_horse/locale/it_IT.po | 59 - mods/mob_horse/locale/ms.po | 59 - mods/mob_horse/locale/template.pot | 58 - mods/mob_horse/locale/zh_CN.pot | 58 - mods/mob_horse/locale/zh_CN.txt | 12 - mods/mob_horse/locale/zh_TW.txt | 12 - mods/mob_horse/mod.conf | 5 +- .../alt_textures/mobs_cheeseblock_32px.png | Bin 0 -> 609 bytes mods/mobs_animal/bee.lua | 117 +- mods/mobs_animal/bunny.lua | 126 +- mods/mobs_animal/chicken.lua | 209 +- mods/mobs_animal/cow.lua | 215 +- mods/mobs_animal/depends.txt | 4 - mods/mobs_animal/description.txt | 1 - mods/mobs_animal/init.lua | 50 +- mods/mobs_animal/intllib.lua | 3 - mods/mobs_animal/kitten.lua | 153 +- mods/mobs_animal/license.txt | 79 +- mods/mobs_animal/locale/README.md | 10 - mods/mobs_animal/locale/de.po | 203 - mods/mobs_animal/locale/fr.po | 202 - mods/mobs_animal/locale/it.po | 201 - mods/mobs_animal/locale/mobs_animal.eo.tr | 50 + mods/mobs_animal/locale/mobs_animal.es.tr | 46 + mods/mobs_animal/locale/mobs_animal.pt.tr | 2 +- mods/mobs_animal/locale/mobs_animal.pt_BR.tr | 2 +- mods/mobs_animal/locale/mobs_animal.ru.tr | 39 +- mods/mobs_animal/locale/ms.po | 199 - mods/mobs_animal/locale/po2tr.lua | 116 - mods/mobs_animal/locale/pt.po | 199 - mods/mobs_animal/locale/pt.txt | 46 - mods/mobs_animal/locale/pt_BR.po | 199 - mods/mobs_animal/locale/pt_BR.txt | 46 - mods/mobs_animal/locale/ru.po | 216 - mods/mobs_animal/locale/template.pot | 198 - mods/mobs_animal/locale/tr.po | 202 - mods/mobs_animal/locale/zh_CN.pot | 206 - mods/mobs_animal/locale/zh_CN.txt | 53 - mods/mobs_animal/locale/zh_TW.txt | 53 - mods/mobs_animal/lucky_block.lua | 54 +- mods/mobs_animal/mod.conf | 5 +- mods/mobs_animal/models/mobs_bunny.b3d | Bin 106937 -> 96060 bytes mods/mobs_animal/models/mobs_sheep.b3d | Bin 71405 -> 99293 bytes mods/mobs_animal/models/mobs_sheep_shaved.b3d | Bin 55932 -> 0 bytes mods/mobs_animal/panda.lua | 48 +- mods/mobs_animal/penguin.lua | 45 +- mods/mobs_animal/rat.lua | 47 +- mods/mobs_animal/readme.md | 4 +- mods/mobs_animal/screenshot.png | Bin 34071 -> 234351 bytes mods/mobs_animal/settingtypes.txt | 11 + mods/mobs_animal/sheep.lua | 460 +- mods/mobs_animal/textures/mobs_butter.png | Bin 181 -> 181 bytes .../mobs_animal/textures/mobs_cheeseblock.png | Bin 609 -> 272 bytes .../textures/mobs_kitten_black.png | Bin 0 -> 166 bytes mods/mobs_animal/textures/mobs_rat.png | Bin 1347 -> 675 bytes mods/mobs_animal/textures/mobs_rat2.png | Bin 1500 -> 788 bytes mods/mobs_animal/textures/mobs_rat3.png | Bin 0 -> 827 bytes mods/mobs_animal/textures/mobs_sheep_base.png | Bin 635 -> 7821 bytes .../mobs_animal/textures/mobs_sheep_horns.png | Bin 0 -> 1533 bytes .../textures/mobs_sheep_shaved.png | Bin 983 -> 1050 bytes mods/mobs_animal/textures/mobs_sheep_wool.png | Bin 1028 -> 6825 bytes .../textures/mobs_wooden_bucket_milk.png | Bin 0 -> 195 bytes mods/mobs_animal/warthog.lua | 98 +- mods/mobs_monster/depends.txt | 5 - mods/mobs_monster/description.txt | 1 - mods/mobs_monster/dirt_monster.lua | 58 +- mods/mobs_monster/dungeon_master.lua | 66 +- mods/mobs_monster/fire_spirit.lua | 41 +- mods/mobs_monster/init.lua | 52 +- mods/mobs_monster/intllib.lua | 3 - mods/mobs_monster/land_guard.lua | 48 +- mods/mobs_monster/lava_flan.lua | 201 +- mods/mobs_monster/license.txt | 79 +- mods/mobs_monster/locale/de.txt | 37 - mods/mobs_monster/locale/fr.txt | 34 - mods/mobs_monster/locale/it.txt | 38 - mods/mobs_monster/locale/mobs_monster.es.tr | 14 + .../mobs_monster/locale/mobs_monster.pt_BR.tr | 14 + mods/mobs_monster/locale/mobs_monster.ru.tr | 14 + mods/mobs_monster/locale/ms.txt | 35 - mods/mobs_monster/locale/template.txt | 36 - mods/mobs_monster/locale/tr.txt | 39 - mods/mobs_monster/locale/zh_CN.txt | 36 - mods/mobs_monster/locale/zh_TW.txt | 36 - mods/mobs_monster/lucky_block.lua | 68 +- mods/mobs_monster/mese_monster.lua | 335 +- mods/mobs_monster/mod.conf | 5 +- .../mobs_monster/models/mobs_mese_monster.b3d | Bin 0 -> 318705 bytes mods/mobs_monster/models/mobs_oerkki.b3d | Bin 42149 -> 28944 bytes .../mobs_monster/models/mobs_sand_monster.b3d | Bin 115989 -> 132604 bytes .../models/mobs_stone_monster.b3d | Bin 29900 -> 35991 bytes mods/mobs_monster/models/zmobs_lava_flan.b3d | Bin 0 -> 25452 bytes mods/mobs_monster/models/zmobs_lava_flan.x | 3506 --------- mods/mobs_monster/models/zmobs_mese_monster.x | 2999 -------- mods/mobs_monster/oerkki.lua | 48 +- mods/mobs_monster/readme.md | 49 +- mods/mobs_monster/sand_monster.lua | 61 +- mods/mobs_monster/screenshot.jpg | Bin 0 -> 178813 bytes mods/mobs_monster/settingtypes.txt | 10 + mods/mobs_monster/spawn_example.lua | 14 + mods/mobs_monster/spider.lua | 135 +- mods/mobs_monster/stone_monster.lua | 62 +- mods/mobs_monster/textures/mobs_cobweb.png | Bin 144 -> 159 bytes .../textures/mobs_dirt_monster.png | Bin 1468 -> 1195 bytes .../textures/mobs_dirt_monster2.png | Bin 594 -> 634 bytes .../textures/mobs_dirt_monster3.png | Bin 610 -> 632 bytes mods/mobs_monster/textures/mobs_fireball.png | Bin 220 -> 241 bytes .../mobs_monster/textures/mobs_mese_arrow.png | Bin 0 -> 563 bytes .../textures/mobs_mese_monster_blue.png | Bin 0 -> 7463 bytes .../textures/mobs_mese_monster_green.png | Bin 0 -> 6392 bytes .../textures/mobs_mese_monster_purple.png | Bin 0 -> 7472 bytes .../textures/mobs_mese_monster_red.png | Bin 0 -> 6276 bytes .../textures/mobs_obsidian_flan.png | Bin 275 -> 891 bytes .../textures/mobs_sand_monster.png | Bin 1655 -> 10161 bytes .../textures/mobs_stone_monster.png | Bin 1224 -> 534 bytes .../textures/mobs_stone_monster2.png | Bin 757 -> 527 bytes .../textures/mobs_stone_monster3.png | Bin 3682 -> 1530 bytes .../textures/mobs_stone_monster4.png | Bin 0 -> 1002 bytes .../textures/mobs_tree_monster.png | Bin 6783 -> 7882 bytes .../textures/mobs_tree_monster2.png | Bin 4762 -> 8459 bytes .../textures/mobs_tree_monster3.png | Bin 3179 -> 6202 bytes .../textures/mobs_tree_monster4.png | Bin 3186 -> 7770 bytes .../textures/mobs_tree_monster5.png | Bin 3728 -> 6539 bytes .../textures/mobs_tree_monster_template.png | Bin 0 -> 9455 bytes .../mobs_monster/textures/zmobs_lava_flan.png | Bin 1438 -> 1202 bytes .../textures/zmobs_lava_flan2.png | Bin 1215 -> 1143 bytes .../textures/zmobs_lava_flan3.png | Bin 1814 -> 1669 bytes .../textures/zmobs_mese_monster.png | Bin 305 -> 0 bytes .../textures/zmobs_mese_monster_old.png | Bin 567 -> 0 bytes mods/mobs_monster/tree_monster.lua | 69 +- mods/mobs_npc/depends.txt | 4 - mods/mobs_npc/functions.lua | 436 ++ mods/mobs_npc/igor.lua | 163 +- mods/mobs_npc/init.lua | 23 +- mods/mobs_npc/intllib.lua | 3 - mods/mobs_npc/license.txt | 51 + mods/mobs_npc/locale/de.txt | 23 - mods/mobs_npc/locale/it_IT.txt | 21 - mods/mobs_npc/locale/mobs_npc.es.tr | 11 + mods/mobs_npc/locale/mobs_npc.ru.tr | 11 + mods/mobs_npc/locale/ms.txt | 21 - mods/mobs_npc/locale/template.txt | 24 - mods/mobs_npc/locale/zh_CN.txt | 24 - mods/mobs_npc/locale/zh_TW.txt | 24 - mods/mobs_npc/lucky_block.lua | 15 +- mods/mobs_npc/mod.conf | 7 +- mods/mobs_npc/npc.lua | 178 +- mods/mobs_npc/readme.md | 77 +- mods/mobs_npc/textures/mobs_igor.png | Bin 222 -> 205 bytes mods/mobs_npc/textures/mobs_igor2.png | Bin 924 -> 869 bytes mods/mobs_npc/textures/mobs_igor3.png | Bin 1109 -> 1372 bytes mods/mobs_npc/textures/mobs_igor4.png | Bin 544 -> 519 bytes mods/mobs_npc/textures/mobs_igor5.png | Bin 848 -> 870 bytes mods/mobs_npc/textures/mobs_igor6.png | Bin 816 -> 1117 bytes mods/mobs_npc/textures/mobs_igor7.png | Bin 799 -> 1184 bytes mods/mobs_npc/textures/mobs_igor8.png | Bin 792 -> 943 bytes mods/mobs_npc/textures/mobs_npc.png | Bin 901 -> 1092 bytes mods/mobs_npc/textures/mobs_npc2.png | Bin 1018 -> 803 bytes mods/mobs_npc/textures/mobs_npc3.png | Bin 870 -> 1017 bytes mods/mobs_npc/textures/mobs_npc4.png | Bin 686 -> 623 bytes mods/mobs_npc/textures/mobs_npc5.png | Bin 0 -> 1422 bytes mods/mobs_npc/textures/mobs_npc6.png | Bin 0 -> 754 bytes mods/mobs_npc/textures/mobs_npc_baby.png | Bin 684 -> 1028 bytes mods/mobs_npc/textures/mobs_npc_shop_icon.png | Bin 0 -> 153 bytes mods/mobs_npc/textures/mobs_trader.png | Bin 783 -> 1285 bytes mods/mobs_npc/textures/mobs_trader2.png | Bin 783 -> 944 bytes mods/mobs_npc/textures/mobs_trader3.png | Bin 779 -> 899 bytes mods/mobs_npc/textures/mobs_trader4.png | Bin 0 -> 712 bytes mods/mobs_npc/trader.lua | 447 +- mods/mobs_redo/.luacheckrc | 25 + mods/mobs_redo/api.lua | 3692 +++++---- mods/mobs_redo/api.txt | 332 +- mods/mobs_redo/crafts.lua | 390 +- mods/mobs_redo/depends.txt | 10 - mods/mobs_redo/description.txt | 1 - mods/mobs_redo/init.lua | 32 +- mods/mobs_redo/intllib.lua | 3 - mods/mobs_redo/license.txt | 18 + mods/mobs_redo/locale/de_DE.po | 131 - mods/mobs_redo/locale/es.po | 128 - mods/mobs_redo/locale/fr.po | 136 - mods/mobs_redo/locale/it.po | 131 - mods/mobs_redo/locale/mobs.de.tr | 64 +- mods/mobs_redo/locale/mobs.en.tr | 72 +- mods/mobs_redo/locale/mobs.es.tr | 64 +- mods/mobs_redo/locale/mobs.fr.tr | 54 +- mods/mobs_redo/locale/mobs.it.tr | 62 +- mods/mobs_redo/locale/mobs.ms.tr | 62 +- mods/mobs_redo/locale/mobs.pt.tr | 66 +- mods/mobs_redo/locale/mobs.pt_BR.tr | 38 + mods/mobs_redo/locale/mobs.ru.tr | 64 +- mods/mobs_redo/locale/mobs.tr.tr | 66 +- mods/mobs_redo/locale/mobs.zh_CN.tr | 62 +- mods/mobs_redo/locale/mobs.zh_TW.tr | 62 +- mods/mobs_redo/locale/ms.po | 131 - mods/mobs_redo/locale/pt.po | 133 - mods/mobs_redo/locale/ru.po | 129 - mods/mobs_redo/locale/template.pot | 136 - mods/mobs_redo/locale/template.txt | 38 + mods/mobs_redo/locale/tr.po | 133 - mods/mobs_redo/locale/zh_CN.po | 130 - mods/mobs_redo/locale/zh_TW.po | 130 - mods/mobs_redo/lucky_block.lua | 111 +- mods/mobs_redo/mod.conf | 4 +- mods/mobs_redo/mount.lua | 314 +- mods/mobs_redo/readme.MD | 515 +- mods/mobs_redo/settingtypes.txt | 49 +- mods/mobs_redo/sounds/default_punch.ogg | Bin 5946 -> 0 bytes mods/mobs_redo/sounds/license.txt | 7 - mods/mobs_redo/sounds/mobs_punch.ogg | Bin 0 -> 9393 bytes mods/mobs_redo/sounds/mobs_swing.ogg | Bin 6895 -> 6194 bytes mods/mobs_redo/spawner.lua | 105 +- mods/mobs_redo/textures/mobs_fallback.png | Bin 0 -> 821 bytes .../mobs_redo/textures/mobs_hearing_vines.png | Bin 0 -> 114 bytes .../textures/mobs_hearing_vines_active.png | Bin 0 -> 126 bytes mods/mobs_redo/textures/mobs_meat_bottom.png | Bin 253 -> 734 bytes .../textures/mobs_meat_raw_bottom.png | Bin 0 -> 796 bytes .../mobs_redo/textures/mobs_meat_raw_side.png | Bin 0 -> 722 bytes mods/mobs_redo/textures/mobs_meat_raw_top.png | Bin 0 -> 800 bytes mods/mobs_redo/textures/mobs_meat_side.png | Bin 271 -> 693 bytes mods/mobs_redo/textures/mobs_meat_top.png | Bin 287 -> 748 bytes mods/mobs_redo/textures/mobs_nametag.png | Bin 247 -> 186 bytes .../textures/mobs_pint_sized_rune.png | Bin 0 -> 160 bytes mods/mobs_sky/mobs_bat/depends.txt | 2 - mods/mobs_sky/mobs_bat/init.lua | 69 +- mods/mobs_sky/mobs_bat/license.txt | 9 +- mods/mobs_sky/mobs_bat/mod.conf | 4 +- mods/mobs_sky/mobs_bat/spawn_example.lua | 14 + mods/mobs_sky/mobs_bat/textures/Thumbs.db | Bin 15872 -> 0 bytes mods/mobs_sky/mobs_birds/SETTINGS.txt | 6 - mods/mobs_sky/mobs_birds/depends.txt | 2 - mods/mobs_sky/mobs_birds/init.lua | 148 +- mods/mobs_sky/mobs_birds/mod.conf | 4 +- mods/mobs_sky/mobs_birds/settingtypes.txt | 3 + mods/mobs_sky/mobs_birds/spawn_example.lua | 54 + mods/mobs_sky/mobs_butterfly/depends.txt | 2 - mods/mobs_sky/mobs_butterfly/init.lua | 79 +- mods/mobs_sky/mobs_butterfly/mod.conf | 4 +- mods/mobs_sky/screenshot.png | Bin 0 -> 27970 bytes mods/mobs_water/mobs_crocs/License.txt | 2 +- mods/mobs_water/mobs_crocs/depends.txt | 2 - mods/mobs_water/mobs_crocs/init.lua | 324 +- mods/mobs_water/mobs_crocs/mod.conf | 4 +- mods/mobs_water/mobs_crocs/spawn_example.lua | 52 + mods/mobs_water/mobs_fish/depends.txt | 2 - mods/mobs_water/mobs_fish/init.lua | 141 +- mods/mobs_water/mobs_fish/mod.conf | 4 +- mods/mobs_water/mobs_fish/spawn_example.lua | 24 + mods/mobs_water/mobs_jellyfish/depends.txt | 3 - mods/mobs_water/mobs_jellyfish/init.lua | 52 +- mods/mobs_water/mobs_jellyfish/mod.conf | 4 +- .../mobs_jellyfish/spawn_example.lua | 12 + mods/mobs_water/mobs_sharks/SETTINGS.txt | 8 - mods/mobs_water/mobs_sharks/depends.txt | 2 - mods/mobs_water/mobs_sharks/init.lua | 167 +- mods/mobs_water/mobs_sharks/mod.conf | 4 +- mods/mobs_water/mobs_sharks/settingtypes.txt | 3 + mods/mobs_water/mobs_sharks/spawn_example.lua | 44 + mods/mobs_water/mobs_turtles/License.txt | 3 +- mods/mobs_water/mobs_turtles/depends.txt | 2 - mods/mobs_water/mobs_turtles/init.lua | 137 +- mods/mobs_water/mobs_turtles/mod.conf | 4 +- .../mobs_water/mobs_turtles/spawn_example.lua | 30 + mods/mobs_water/screenshot.png | Bin 0 -> 104542 bytes mods/more_chests/models/shared.lua | 2 +- mods/more_chests/models/wifi.lua | 17 + mods/more_chests/utils/base.lua | 1 + mods/moreblocks/circular_saw.lua | 1 + mods/moreblocks/locale/moreblocks.pt_BR.tr | 94 + mods/moreblocks/nodes.lua | 50 +- mods/moreblocks/stairsplus/common.lua | 3 +- mods/morelights/morelights_extras/init.lua | 9 +- mods/moreores/.luacheckrc | 1 + mods/moreores/.travis.yml | 16 - mods/moreores/CHANGELOG.md | 3 + mods/moreores/_config.txt | 64 +- mods/moreores/init.lua | 187 +- mods/moreores/locale/moreores.de.tr | 2 - mods/moreores/locale/moreores.en.tr | 21 - mods/moreores/locale/moreores.es.tr | 14 +- mods/moreores/locale/moreores.fr.tr | 2 - mods/moreores/locale/moreores.hu.tr | 2 - mods/moreores/locale/moreores.it.tr | 2 - mods/moreores/locale/moreores.nl.tr | 2 - mods/moreores/locale/moreores.pl.tr | 6 +- mods/moreores/locale/moreores.pt_br.tr | 2 - mods/moreores/locale/moreores.ru.tr | 19 + mods/moreores/locale/moreores.tr.tr | 2 - mods/moreores/locale/template.txt | 18 + mods/moreores/mod.conf | 4 +- mods/moretrees/.luacheckrc | 38 +- mods/moretrees/README.md | 3 +- mods/moretrees/biome_defs.lua | 257 +- mods/moretrees/cocos_palm.lua | 12 +- mods/moretrees/crafts.lua | 16 +- mods/moretrees/date_palm.lua | 22 +- mods/moretrees/default_settings.txt | 135 - mods/moretrees/init.lua | 291 +- mods/moretrees/locale/moretrees.de.tr | 11 +- mods/moretrees/locale/moretrees.es.tr | 347 +- mods/moretrees/locale/moretrees.fr.tr | 9 + mods/moretrees/locale/moretrees.ru.tr | 219 + mods/moretrees/locale/template.txt | 9 + mods/moretrees/mod.conf | 4 +- mods/moretrees/node_defs.lua | 361 +- mods/moretrees/saplings.lua | 37 +- mods/moretrees/screenshot.lua | 3 +- mods/moretrees/settings.lua | 57 + mods/moretrees/tree_models.lua | 13 +- mods/mydeck/depends.txt | 1 - mods/mydeck/description.txt | 1 - mods/mydeck/mod.conf | 2 + mods/mydoors/.luacheckrc | 25 +- mods/mydoors/description.txt | 1 - mods/mydoors/modpack.conf | 2 + mods/mydoors/modpack.txt | 0 mods/mydoors/my_castle_doors/depends.txt | 3 - mods/mydoors/my_castle_doors/description.txt | 1 - mods/mydoors/my_castle_doors/locked.lua | 22 +- mods/mydoors/my_castle_doors/mod.conf | 2 + .../textures/mydoors_door1.png | Bin 3332 -> 2580 bytes .../textures/mydoors_door10.png | Bin 3142 -> 2232 bytes .../textures/mydoors_door11.png | Bin 2300 -> 1771 bytes .../textures/mydoors_door12.png | Bin 3074 -> 2132 bytes .../textures/mydoors_door13.png | Bin 2784 -> 1724 bytes .../textures/mydoors_door13_inv.png | Bin 1682 -> 1114 bytes .../textures/mydoors_door2.png | Bin 4907 -> 3791 bytes .../textures/mydoors_door3.png | Bin 1482 -> 1424 bytes .../textures/mydoors_door4.png | Bin 1250 -> 1129 bytes .../textures/mydoors_door5.png | Bin 1401 -> 1339 bytes .../textures/mydoors_door6.png | Bin 4051 -> 3288 bytes .../textures/mydoors_door7.png | Bin 2742 -> 2037 bytes .../textures/mydoors_door8.png | Bin 5400 -> 3205 bytes .../textures/mydoors_door9.png | Bin 3749 -> 2685 bytes mods/mydoors/my_castle_doors/unlocked.lua | 12 +- mods/mydoors/my_cottage_doors/depends.txt | 3 - mods/mydoors/my_cottage_doors/description.txt | 1 - mods/mydoors/my_cottage_doors/locked.lua | 2 +- mods/mydoors/my_cottage_doors/mod.conf | 2 + .../textures/mycdoors_door1.png | Bin 8001 -> 6181 bytes .../textures/mycdoors_door1_inv.png | Bin 3701 -> 2919 bytes .../textures/mycdoors_door2.png | Bin 5943 -> 4491 bytes .../textures/mycdoors_door2_inv.png | Bin 2866 -> 2282 bytes mods/mydoors/my_cottage_doors/unlocked.lua | 2 +- mods/mydoors/my_default_doors/depends.txt | 3 - mods/mydoors/my_default_doors/description.txt | 1 - mods/mydoors/my_default_doors/init.lua | 2 +- mods/mydoors/my_default_doors/mod.conf | 2 + .../textures/mydoors_bronze.png | Bin 1264 -> 855 bytes .../textures/mydoors_bronze_inv.png | Bin 818 -> 586 bytes .../textures/mydoors_copper.png | Bin 1245 -> 881 bytes .../textures/mydoors_copper_inv.png | Bin 782 -> 591 bytes .../textures/mydoors_diamond.png | Bin 1095 -> 712 bytes .../textures/mydoors_diamond_inv.png | Bin 765 -> 530 bytes .../textures/mydoors_gold.png | Bin 753 -> 514 bytes .../textures/mydoors_gold_inv.png | Bin 748 -> 523 bytes .../textures/mydoors_mese.png | Bin 841 -> 536 bytes .../textures/mydoors_mese_inv.png | Bin 593 -> 348 bytes mods/mydoors/my_door_wood/depends.txt | 3 - mods/mydoors/my_door_wood/description.txt | 1 - mods/mydoors/my_door_wood/init.lua | 11 +- mods/mydoors/my_door_wood/mod.conf | 3 + .../textures/mydoors_black_wood.png | Bin 223 -> 148 bytes .../my_door_wood/textures/mydoors_swood.png | Bin 324 -> 253 bytes mods/mydoors/my_fancy_doors/depends.txt | 3 - mods/mydoors/my_fancy_doors/description.txt | 1 - mods/mydoors/my_fancy_doors/locked.lua | 8 +- mods/mydoors/my_fancy_doors/mod.conf | 2 + .../textures/myfdoors_door1.png | Bin 3218 -> 1885 bytes .../textures/myfdoors_door2.png | Bin 2707 -> 1592 bytes .../textures/myfdoors_door3.png | Bin 4617 -> 3580 bytes .../textures/myfdoors_door4.png | Bin 988 -> 927 bytes .../textures/myfdoors_door4_inv.png | Bin 905 -> 846 bytes .../textures/myfdoors_door5.png | Bin 3962 -> 2585 bytes .../textures/myfdoors_door5_inv.png | Bin 2275 -> 1547 bytes .../textures/myfdoors_door6.png | Bin 2435 -> 1918 bytes .../textures/myfdoors_door6_inv.png | Bin 2171 -> 1638 bytes .../textures/myfdoors_door7.png | Bin 1772 -> 1444 bytes .../textures/myfdoors_door7_inv.png | Bin 1506 -> 1229 bytes .../textures/myfdoors_door8.png | Bin 2058 -> 1664 bytes .../textures/myfdoors_door8_inv.png | Bin 1818 -> 1415 bytes mods/mydoors/my_fancy_doors/unlocked.lua | 44 +- mods/mydoors/my_future_doors/depends.txt | 1 - mods/mydoors/my_future_doors/description.txt | 1 - mods/mydoors/my_future_doors/framed.lua | 8 +- mods/mydoors/my_future_doors/mod.conf | 3 + mods/mydoors/my_future_doors/sliding.lua | 8 +- .../textures/myndoors_door1_black.png | Bin 138 -> 96 bytes .../textures/myndoors_door1_blackb.png | Bin 190 -> 150 bytes .../textures/myndoors_door1_bottomf.png | Bin 157 -> 117 bytes .../textures/myndoors_door1_red.png | Bin 138 -> 98 bytes .../textures/myndoors_door1_redb.png | Bin 227 -> 147 bytes .../textures/myndoors_door1_white.png | Bin 130 -> 90 bytes .../textures/myndoors_door1_whiteb.png | Bin 190 -> 150 bytes .../textures/myndoors_door2a_bottom.png | Bin 2295 -> 2248 bytes .../textures/myndoors_door2a_bottomo.png | Bin 984 -> 941 bytes .../textures/myndoors_door2a_edge.png | Bin 110 -> 70 bytes .../textures/myndoors_door2a_inv.png | Bin 4920 -> 4880 bytes .../textures/myndoors_door3a_bottom.png | Bin 2168 -> 2128 bytes .../textures/myndoors_door3a_bottomo.png | Bin 897 -> 853 bytes .../textures/myndoors_door3a_edge.png | Bin 110 -> 70 bytes .../textures/myndoors_door3a_inv.png | Bin 4367 -> 4326 bytes .../textures/myndoors_door4a_bottom.png | Bin 1002 -> 906 bytes .../textures/myndoors_door4a_bottomo.png | Bin 478 -> 425 bytes .../textures/myndoors_door4a_edge.png | Bin 110 -> 70 bytes .../textures/myndoors_door4a_inv.png | Bin 1960 -> 1792 bytes .../textures/myndoors_door6a_bottom.png | Bin 521 -> 349 bytes .../textures/myndoors_door6a_bottomo.png | Bin 315 -> 199 bytes .../textures/myndoors_door6a_edge.png | Bin 128 -> 70 bytes .../textures/myndoors_door6a_inv.png | Bin 990 -> 613 bytes .../textures/myndoors_door7a_bottom.png | Bin 651 -> 423 bytes .../textures/myndoors_door7a_bottomo.png | Bin 360 -> 245 bytes .../textures/myndoors_door7a_edge.png | Bin 128 -> 70 bytes .../textures/myndoors_door7a_inv.png | Bin 1143 -> 711 bytes .../textures/myndoors_door8a_bottom.png | Bin 5162 -> 2460 bytes .../textures/myndoors_door8a_bottomo.png | Bin 3553 -> 849 bytes .../textures/myndoors_door8a_edge.png | Bin 2795 -> 96 bytes .../textures/myndoors_door8a_inv.png | Bin 7728 -> 5029 bytes .../textures/myndoors_door9a_bottom.png | Bin 4891 -> 2192 bytes .../textures/myndoors_door9a_bottomo.png | Bin 3549 -> 839 bytes .../textures/myndoors_door9a_edge.png | Bin 2810 -> 111 bytes .../textures/myndoors_door9a_inv.png | Bin 7131 -> 4432 bytes mods/mydoors/my_garage_door/description.txt | 1 - mods/mydoors/my_garage_door/init.lua | 112 +- mods/mydoors/my_garage_door/mod.conf | 2 + mods/mydoors/my_hidden_doors/depends.txt | 3 - mods/mydoors/my_hidden_doors/description.txt | 1 - mods/mydoors/my_hidden_doors/init.lua | 6 +- mods/mydoors/my_hidden_doors/mod.conf | 2 + .../textures/mydoors_bookshelf.png | Bin 910 -> 654 bytes .../textures/mydoors_bookshelf_inv.png | Bin 874 -> 613 bytes .../textures/mydoors_brick.png | Bin 1089 -> 767 bytes .../textures/mydoors_chest.png | Bin 826 -> 646 bytes .../textures/mydoors_chest_inv.png | Bin 747 -> 538 bytes .../textures/mydoors_cobble.png | Bin 1162 -> 596 bytes .../textures/mydoors_desert_cobble.png | Bin 912 -> 468 bytes .../textures/mydoors_furnace.png | Bin 1071 -> 585 bytes .../textures/mydoors_furnace_inv.png | Bin 826 -> 449 bytes .../my_hidden_doors/textures/mydoors_grey.png | Bin 2087 -> 1872 bytes .../textures/mydoors_grey_inv.png | Bin 2000 -> 1793 bytes .../textures/mydoors_stone.png | Bin 774 -> 544 bytes .../textures/mydoors_stone_brick.png | Bin 794 -> 568 bytes .../my_hidden_doors/textures/mydoors_wood.png | Bin 744 -> 495 bytes mods/mydoors/my_misc_doors/bars.lua | 41 +- mods/mydoors/my_misc_doors/depends.txt | 4 - mods/mydoors/my_misc_doors/description.txt | 1 - mods/mydoors/my_misc_doors/locked.lua | 6 +- mods/mydoors/my_misc_doors/mod.conf | 3 + .../my_misc_doors/textures/mydoors_bars.png | Bin 487 -> 390 bytes .../my_misc_doors/textures/mymdoors_door1.png | Bin 359 -> 252 bytes .../my_misc_doors/textures/mymdoors_door2.png | Bin 5987 -> 5552 bytes .../textures/mymdoors_door2_inv.png | Bin 3067 -> 3058 bytes .../my_misc_doors/textures/mymdoors_door3.png | Bin 1099 -> 815 bytes .../my_misc_doors/textures/mymdoors_door4.png | Bin 1398 -> 856 bytes .../my_misc_doors/textures/mymdoors_door5.png | Bin 1898 -> 1244 bytes mods/mydoors/my_misc_doors/unlocked.lua | 4 +- mods/mydoors/my_old_doors/depends.txt | 3 - mods/mydoors/my_old_doors/description.txt | 1 - mods/mydoors/my_old_doors/mod.conf | 2 + .../my_old_doors/textures/mydoors_old1.png | Bin 4224 -> 2737 bytes .../textures/mydoors_old1_inv.png | Bin 2323 -> 1562 bytes .../my_old_doors/textures/mydoors_old2.png | Bin 4089 -> 2733 bytes .../textures/mydoors_old2_inv.png | Bin 2202 -> 1527 bytes .../my_old_doors/textures/mydoors_old3.png | Bin 4241 -> 2961 bytes .../textures/mydoors_old3_inv.png | Bin 2248 -> 1638 bytes .../my_old_doors/textures/mydoors_old4.png | Bin 1579 -> 1370 bytes .../textures/mydoors_old4_inv.png | Bin 1191 -> 1011 bytes mods/mydoors/my_old_doors/unlocked.lua | 10 +- mods/mydoors/my_saloon_doors/depends.txt | 3 - mods/mydoors/my_saloon_doors/description.txt | 1 - mods/mydoors/my_saloon_doors/init.lua | 34 +- mods/mydoors/my_saloon_doors/mod.conf | 3 + .../textures/mydoors_saloon_bottom.png | Bin 1224 -> 1066 bytes mods/mydoors/my_sliding_doors/description.txt | 1 - mods/mydoors/my_sliding_doors/jdoors1.lua | 107 +- mods/mydoors/my_sliding_doors/jdoors2.lua | 22 +- mods/mydoors/my_sliding_doors/mod.conf | 3 + .../textures/myjdoors_door1a_bottom.png | Bin 589 -> 487 bytes .../textures/myjdoors_door1a_edge.png | Bin 1151 -> 874 bytes .../textures/myjdoors_door1a_inv.png | Bin 681 -> 623 bytes .../textures/myjdoors_door1a_top.png | Bin 586 -> 482 bytes .../textures/myjdoors_door2a_bottom.png | Bin 756 -> 617 bytes .../textures/myjdoors_door2a_edge.png | Bin 1151 -> 874 bytes .../textures/myjdoors_door2a_inv.png | Bin 1426 -> 1028 bytes .../textures/myjdoors_door2a_top.png | Bin 730 -> 597 bytes .../textures/myjdoors_door3a_bottom.png | Bin 758 -> 574 bytes .../textures/myjdoors_door3a_edge.png | Bin 1151 -> 874 bytes .../textures/myjdoors_door3a_inv.png | Bin 1406 -> 746 bytes .../textures/myjdoors_door3a_top.png | Bin 776 -> 560 bytes .../textures/myjdoors_panel1_corner_inv.png | Bin 798 -> 519 bytes .../textures/myjdoors_panel1_inv.png | Bin 1067 -> 626 bytes .../textures/myjdoors_panel2_corner_inv.png | Bin 1378 -> 1109 bytes .../textures/myjdoors_panel2_inv.png | Bin 1375 -> 927 bytes .../textures/myjdoors_panel3_corner_inv.png | Bin 1376 -> 876 bytes .../textures/myjdoors_panel3_inv.png | Bin 1373 -> 725 bytes mods/mymillwork/nodes.lua | 2 +- mods/mypaths/crafts.lua | 3 +- mods/mypaths/dirt_road.lua | 24 +- mods/mypaths/dirt_road_slopes.lua | 6 + mods/mypaths/grass.lua | 17 +- mods/mypaths/stone_paths.lua | 35 +- mods/mywalls/.cdb.json | 5 + mods/mywalls/.luacheckrc | 12 + mods/mywalls/depends.txt | 2 - mods/mywalls/description.txt | 14 - mods/mywalls/init.lua | 58 +- mods/mywalls/locale/mywalls.ru.tr | 20 + mods/mywalls/locale/mywalls.sv.tr | 20 + mods/mywalls/locale/mywalls.uk.tr | 20 + mods/mywalls/locale/template.txt | 20 + mods/mywalls/mod.conf | 4 +- mods/mywalls/readme.md | 46 +- mods/mywalls/screenshot.png | Bin 102610 -> 812526 bytes mods/new_campfire/init.lua | 50 +- mods/new_campfire/locale/new_campfire.id.tr | 16 + mods/new_campfire/mod.conf | 4 +- mods/pie/README.md | 13 + mods/pie/depends.txt | 6 - mods/pie/description.txt | 1 - mods/pie/init.lua | 360 +- mods/pie/license.txt | 15 +- mods/pie/mod.conf | 4 +- mods/pie/screenshot.jpg | Bin 0 -> 74213 bytes mods/pie/screenshot.png | Bin 10841 -> 0 bytes mods/pie/settingtypes.txt | 2 + mods/pie/textures/bana_bottom.png | Bin 123 -> 100 bytes mods/pie/textures/bana_inv.png | Bin 213 -> 205 bytes mods/pie/textures/bana_side.png | Bin 163 -> 169 bytes mods/pie/textures/bana_side_inside.png | Bin 0 -> 242 bytes mods/pie/textures/brpd_inv.png | Bin 394 -> 305 bytes mods/pie/textures/brpd_side.png | Bin 244 -> 207 bytes mods/pie/textures/brpd_side_inside.png | Bin 0 -> 303 bytes mods/pie/textures/choc_inv.png | Bin 237 -> 228 bytes mods/pie/textures/choc_side.png | Bin 207 -> 214 bytes mods/pie/textures/choc_side_inside.png | Bin 0 -> 315 bytes mods/pie/textures/coff_bottom.png | Bin 123 -> 100 bytes mods/pie/textures/coff_inv.png | Bin 225 -> 222 bytes mods/pie/textures/coff_side.png | Bin 210 -> 210 bytes mods/pie/textures/coff_side_inside.png | Bin 0 -> 302 bytes mods/pie/textures/meat_inv.png | Bin 267 -> 257 bytes mods/pie/textures/meat_side.png | Bin 208 -> 213 bytes mods/pie/textures/meat_side_inside.png | Bin 0 -> 349 bytes mods/pie/textures/orange_bottom.png | Bin 215 -> 100 bytes mods/pie/textures/orange_inv.png | Bin 342 -> 278 bytes mods/pie/textures/orange_side.png | Bin 238 -> 209 bytes mods/pie/textures/orange_side_inside.png | Bin 0 -> 236 bytes mods/pie/textures/pie_inv.png | Bin 1414 -> 305 bytes mods/pie/textures/pie_side.png | Bin 208 -> 216 bytes mods/pie/textures/pie_side_inside.png | Bin 0 -> 355 bytes mods/pie/textures/rvel_bottom.png | Bin 123 -> 100 bytes mods/pie/textures/rvel_inv.png | Bin 235 -> 228 bytes mods/pie/textures/rvel_side.png | Bin 167 -> 173 bytes mods/pie/textures/rvel_side_inside.png | Bin 0 -> 261 bytes mods/pie/textures/scsk_bottom.png | Bin 240 -> 100 bytes mods/pie/textures/scsk_inside.png | Bin 201 -> 164 bytes mods/pie/textures/scsk_inv.png | Bin 239 -> 230 bytes mods/pie/textures/scsk_side.png | Bin 201 -> 164 bytes mods/pie/textures/scsk_side_inside.png | Bin 0 -> 164 bytes mods/pie/textures/scsk_top.png | Bin 223 -> 142 bytes mods/plantlife_modpack/.luacheckrc | 23 +- mods/plantlife_modpack/3dmushrooms/init.lua | 16 +- mods/plantlife_modpack/3dmushrooms/mod.conf | 2 +- .../textures/3dmushrooms_brown.png | Bin 5094 -> 3932 bytes .../3dmushrooms/textures/3dmushrooms_red.png | Bin 2731 -> 2128 bytes .../textures/3dmushrooms_red_inv.png | Bin 5279 -> 5102 bytes mods/plantlife_modpack/bushes/init.lua | 229 +- .../bushes/locale/bushes.de.tr | 4 + .../bushes/locale/bushes.eo.tr | 4 + .../bushes/locale/bushes.fr.tr | 7 - .../bushes/locale/template.txt | 6 - mods/plantlife_modpack/bushes/mod.conf | 5 +- .../plantlife_modpack/bushes/settingtypes.txt | 20 +- .../textures/old & unused/BlockBranch1.png | Bin 73879 -> 0 bytes .../textures/old & unused/BlockBranch1L.png | Bin 34131 -> 0 bytes .../textures/old & unused/BlockBranch1R.png | Bin 40264 -> 0 bytes .../textures/old & unused/BushBranches1.png | Bin 52878 -> 0 bytes .../textures/old & unused/BushBranches1sm.png | Bin 609 -> 0 bytes .../old & unused/BushBranches1sm2.png | Bin 620 -> 0 bytes .../old & unused/BushBranches1sm3.png | Bin 396 -> 0 bytes .../old & unused/BushBranches1sm4.png | Bin 540 -> 0 bytes .../old & unused/BushBranchesCenter.png | Bin 285 -> 0 bytes .../old & unused/BushBranchesSide1.png | Bin 657 -> 0 bytes .../old & unused/BushBranchesSide2.png | Bin 693 -> 0 bytes .../bushes/textures/old & unused/blank.png | Bin 83 -> 0 bytes .../old & unused/moretrees_pine_leaves3.png | Bin 525 -> 0 bytes .../bushes_classic/cooking.lua | 5 +- .../plantlife_modpack/bushes_classic/init.lua | 56 +- .../locale/bushes_classic.de.tr | 55 +- .../locale/bushes_classic.eo.tr | 39 + .../locale/bushes_classic.es.tr | 45 +- .../locale/bushes_classic.fr.tr | 45 +- .../locale/bushes_classic.tr.tr | 45 +- .../bushes_classic/locale/template.txt | 45 +- .../plantlife_modpack/bushes_classic/mod.conf | 1 - .../bushes_classic/nodes.lua | 19 +- .../bushes_classic/textures/bushes_basket.png | Bin 2956 -> 1749 bytes .../textures/bushes_basket_pie_blackberry.png | Bin 3631 -> 2445 bytes .../textures/bushes_basket_pie_blueberry.png | Bin 3627 -> 2459 bytes .../textures/bushes_basket_pie_gooseberry.png | Bin 3645 -> 2488 bytes .../bushes_basket_pie_mixed_berry.png | Bin 3587 -> 2723 bytes .../textures/bushes_basket_pie_raspberry.png | Bin 3610 -> 2467 bytes .../textures/bushes_basket_pie_strawberry.png | Bin 3607 -> 2454 bytes .../textures/bushes_bush_blackberry.png | Bin 9089 -> 6762 bytes .../textures/bushes_bush_blueberry.png | Bin 9203 -> 6826 bytes .../textures/bushes_bush_fruitless.png | Bin 7891 -> 6687 bytes .../textures/bushes_bush_gooseberry.png | Bin 9275 -> 6924 bytes .../textures/bushes_bush_raspberry.png | Bin 9226 -> 6882 bytes .../textures/bushes_bush_strawberry.png | Bin 9137 -> 6811 bytes mods/plantlife_modpack/cavestuff/init.lua | 15 - .../cavestuff/locale/cavestuff.de.tr | 4 + .../cavestuff/locale/cavestuff.eo.tr | 4 + .../cavestuff/locale/cavestuff.fr.tr | 7 - .../cavestuff/locale/template.txt | 7 - mods/plantlife_modpack/cavestuff/mapgen.lua | 90 +- mods/plantlife_modpack/cavestuff/mod.conf | 2 +- mods/plantlife_modpack/cavestuff/nodes.lua | 36 +- mods/plantlife_modpack/dryplants/crafting.lua | 4 +- mods/plantlife_modpack/dryplants/init.lua | 40 +- mods/plantlife_modpack/dryplants/juncus.lua | 119 +- .../dryplants/locale/dryplants.de.tr | 21 + .../dryplants/locale/dryplants.eo.tr | 21 + .../dryplants/locale/dryplants.fr.tr | 11 +- .../dryplants/locale/template.txt | 11 +- .../dryplants/meadowvariation.lua | 33 +- mods/plantlife_modpack/dryplants/mod.conf | 4 +- .../plantlife_modpack/dryplants/moregrass.lua | 42 +- mods/plantlife_modpack/dryplants/reed.lua | 217 +- mods/plantlife_modpack/dryplants/reedmace.lua | 204 +- mods/plantlife_modpack/dryplants/settings.txt | 52 - .../textures/not_in_use/big_pic_8.png | Bin 1983 -> 0 bytes .../textures/not_in_use/big_pic_9.png | Bin 2178 -> 0 bytes .../not_in_use/dryplants_cattailsG_m2.png | Bin 1491 -> 0 bytes .../not_in_use/dryplants_juncus_02_left.png | Bin 352 -> 0 bytes .../not_in_use/dryplants_juncus_02_right.png | Bin 393 -> 0 bytes .../not_in_use/dryplants_juncus_02_whole2.png | Bin 621 -> 0 bytes .../not_in_use/dryplants_juncus_03_left.png | Bin 414 -> 0 bytes .../not_in_use/dryplants_juncus_03_right.png | Bin 387 -> 0 bytes .../not_in_use/dryplants_juncus_03_whole2.png | Bin 665 -> 0 bytes .../not_in_use/dryplants_reedmace_01.png | Bin 362 -> 0 bytes .../not_in_use/dryplants_reedmace_02.png | Bin 708 -> 0 bytes .../not_in_use/dryplants_reedmace_03.png | Bin 1148 -> 0 bytes .../not_in_use/dryplants_reedmace_04.png | Bin 1329 -> 0 bytes .../dryplants_reedmace_bottom_left.png | Bin 122 -> 0 bytes .../dryplants_reedmace_bottom_right.png | Bin 189 -> 0 bytes .../not_in_use/dryplants_reedmace_left.png | Bin 185 -> 0 bytes .../not_in_use/dryplants_reedmace_right.png | Bin 196 -> 0 bytes .../dryplants_reedmace_top_left.png | Bin 102 -> 0 bytes .../dryplants_reedmace_top_right.png | Bin 147 -> 0 bytes .../textures/not_in_use/reedmace2.png | Bin 2359 -> 0 bytes .../textures/not_in_use/reedmace3.png | Bin 2869 -> 0 bytes .../textures/not_in_use/reedmace4.png | Bin 2960 -> 0 bytes .../textures/not_in_use/reedtest.png | Bin 333 -> 0 bytes .../textures/not_in_use/texturing.png | Bin 3055 -> 0 bytes .../old/dryplants_grass_short_old3.png | Bin 823 -> 0 bytes .../old/dryplants_grass_short_old4.png | Bin 337 -> 0 bytes .../old/dryplants_juncus_02_left_old.png | Bin 371 -> 0 bytes .../old/dryplants_juncus_02_right_old.png | Bin 389 -> 0 bytes .../old/dryplants_juncus_03_left_old.png | Bin 414 -> 0 bytes .../old/dryplants_juncus_03_right_old.png | Bin 400 -> 0 bytes .../dryplants_reedmace_bottom_left_old2.png | Bin 143 -> 0 bytes .../old/dryplants_reedmace_bottom_old4.png | Bin 734 -> 0 bytes .../dryplants_reedmace_bottom_right_old2.png | Bin 186 -> 0 bytes .../old/dryplants_reedmace_left_old2.png | Bin 191 -> 0 bytes .../textures/old/dryplants_reedmace_old8.png | Bin 698 -> 0 bytes .../old/dryplants_reedmace_right_old2.png | Bin 200 -> 0 bytes .../old/dryplants_reedmace_spikes_old3.png | Bin 556 -> 0 bytes .../old/dryplants_reedmace_top_left_old2.png | Bin 99 -> 0 bytes .../old/dryplants_reedmace_top_old3.png | Bin 404 -> 0 bytes .../old/dryplants_reedmace_top_right_old2.png | Bin 120 -> 0 bytes .../old/dryplants_reedmace_water_old2.png | Bin 569 -> 0 bytes mods/plantlife_modpack/ferns/crafting.lua | 6 +- .../plantlife_modpack/ferns/gianttreefern.lua | 35 +- mods/plantlife_modpack/ferns/horsetail.lua | 42 +- mods/plantlife_modpack/ferns/init.lua | 50 - .../ferns/locale/ferns.de.tr | 16 + .../ferns/locale/ferns.eo.tr | 16 + .../ferns/locale/ferns.fr.tr | 12 +- .../ferns/locale/template.txt | 13 +- .../ferns/textures/ferns_fern_tree_giant.png | Bin 3250 -> 3236 bytes .../ferns/textures/ferns_fern_trunk.png | Bin 765 -> 671 bytes .../not_in_use/archaeplantae_horsetails.png | Bin 308 -> 0 bytes .../textures/not_in_use/big picture 3.png | Bin 1972 -> 0 bytes .../not_in_use/ferns_fern_big_left.png | Bin 640 -> 0 bytes .../not_in_use/ferns_fern_big_right.png | Bin 623 -> 0 bytes .../not_in_use/ferns_fern_mid_left.png | Bin 393 -> 0 bytes .../not_in_use/ferns_fern_mid_right.png | Bin 414 -> 0 bytes .../not_in_use/ferns_fern_tree_bl.png | Bin 554 -> 0 bytes .../not_in_use/ferns_fern_tree_br.png | Bin 544 -> 0 bytes .../not_in_use/ferns_fern_trunk_big_crown.png | Bin 681 -> 0 bytes .../textures/old/archaeplantae_fern_old4.png | Bin 368 -> 0 bytes .../ferns/textures/old/comb.png | Bin 112 -> 0 bytes .../ferns/textures/old/ferns_5_old.png | Bin 461 -> 0 bytes .../ferns/textures/old/ferns_6_old.png | Bin 700 -> 0 bytes .../ferns/textures/old/ferns_7_old.png | Bin 677 -> 0 bytes .../ferns/textures/old/ferns_fern_big_old.png | Bin 1147 -> 0 bytes .../ferns/textures/old/ferns_fern_mid_old.png | Bin 664 -> 0 bytes .../textures/old/ferns_fern_tree_old.png | Bin 1294 -> 0 bytes .../old/ferns_fern_trunk_big_old2.png | Bin 669 -> 0 bytes .../old/ferns_fern_trunk_big_top_old.png | Bin 814 -> 0 bytes .../old/ferns_fern_trunk_big_top_old2.png | Bin 714 -> 0 bytes .../textures/old/ferns_fern_trunk_top_old.png | Bin 230 -> 0 bytes .../textures/old/ferns_horsetail_01_old2.png | Bin 177 -> 0 bytes .../textures/old/ferns_horsetail_02_old2.png | Bin 204 -> 0 bytes .../textures/old/ferns_horsetail_03_old2.png | Bin 251 -> 0 bytes .../textures/old/ferns_horsetail_04_old2.png | Bin 279 -> 0 bytes .../ferns_tree_fern_leave_big_cross_old.png | Bin 712 -> 0 bytes .../old/ferns_tree_fern_leave_big_end_old.png | Bin 457 -> 0 bytes .../old/ferns_tree_fern_leave_big_old.png | Bin 522 -> 0 bytes mods/plantlife_modpack/ferns/treefern.lua | 27 +- mods/plantlife_modpack/junglegrass/init.lua | 3 - mods/plantlife_modpack/junglegrass/mod.conf | 1 - mods/plantlife_modpack/modpack.conf | 2 +- mods/plantlife_modpack/modpack.txt | 0 mods/plantlife_modpack/molehills/init.lua | 62 +- .../molehills/locale/molehills.de.tr | 2 + .../molehills/locale/molehills.eo.tr | 2 + .../molehills/locale/molehills.fr.tr | 7 - .../molehills/locale/template.txt | 7 - mods/plantlife_modpack/molehills/mod.conf | 2 +- .../molehills/settingtypes.txt | 10 +- .../molehills/textures/molehills_dirt.png | Bin 806 -> 718 bytes .../textures/old & unused/molehill_side.png | Bin 110 -> 0 bytes .../textures/old & unused/molehill_top.png | Bin 162 -> 0 bytes .../nature_classic/blossom.lua | 1 + .../nature_classic/global_function.lua | 4 +- .../plantlife_modpack/nature_classic/init.lua | 10 +- .../locale/nature_classic.de.tr | 2 + .../locale/nature_classic.fr.tr | 8 - .../nature_classic/locale/nature_classic.txt | 10 + .../nature_classic/locale/template.txt | 8 - mods/plantlife_modpack/pl_seaweed/init.lua | 128 +- .../pl_seaweed/locale/pl_seaweed.de.tr | 11 +- .../pl_seaweed/locale/pl_seaweed.fr.tr | 8 - .../pl_seaweed/locale/pl_seaweed.tr.tr | 8 - .../pl_seaweed/locale/pl_seawood.eo.tr | 2 + .../pl_seaweed/locale/pl_seawood.es.tr | 8 - .../pl_seaweed/locale/template.txt | 9 - mods/plantlife_modpack/pl_seaweed/mod.conf | 1 - .../pl_seaweed/settingtypes.txt | 7 +- mods/plantlife_modpack/pl_sunflowers/init.lua | 32 +- .../pl_sunflowers/locale/pl_sunflowers.de.tr | 9 - .../pl_sunflowers/locale/pl_sunflowers.eo.tr | 2 + .../pl_sunflowers/locale/pl_sunflowers.es.tr | 8 - .../pl_sunflowers/locale/pl_sunflowers.fr.tr | 8 - .../pl_sunflowers/locale/pl_sunflowers.tr.tr | 8 - .../pl_sunflowers/locale/template.txt | 9 - mods/plantlife_modpack/pl_sunflowers/mod.conf | 1 - .../pl_sunflowers/settingtypes.txt | 7 +- .../textures/flowers_sunflower.png | Bin 811 -> 425 bytes .../textures/flowers_sunflower_inv.png | Bin 378 -> 237 bytes .../plantlife_modpack/pl_waterlilies/init.lua | 123 +- .../locale/pl_waterlilies.de.tr | 9 - .../locale/pl_waterlilies.eo.tr | 2 + .../locale/pl_waterlilies.es.tr | 8 - .../locale/pl_waterlilies.fr.tr | 8 - .../locale/pl_waterlilies.tr.tr | 8 - .../pl_waterlilies/locale/template.txt | 11 +- .../plantlife_modpack/pl_waterlilies/mod.conf | 1 - .../pl_waterlilies/settingtypes.txt | 7 +- mods/plantlife_modpack/poisonivy/init.lua | 108 +- .../poisonivy/locale/poisonivy.de.tr | 12 +- .../poisonivy/locale/poisonivy.eo.tr | 4 + .../poisonivy/locale/poisonivy.es.tr | 8 - .../poisonivy/locale/poisonivy.fr.tr | 8 - .../poisonivy/locale/poisonivy.pt.tr | 8 - .../poisonivy/locale/poisonivy.pt_BR.tr | 8 +- .../poisonivy/locale/poisonivy.tr.tr | 8 - .../poisonivy/locale/template.txt | 4 + mods/plantlife_modpack/poisonivy/mod.conf | 2 +- .../poisonivy/textures/poisonivy_seedling.png | Bin 179 -> 178 bytes mods/plantlife_modpack/trunks/crafting.lua | 4 +- mods/plantlife_modpack/trunks/generating.lua | 43 +- mods/plantlife_modpack/trunks/init.lua | 13 +- .../trunks/locale/template.txt | 7 - .../trunks/locale/trunks.de.tr | 10 + .../trunks/locale/trunks.eo.tr | 10 + .../trunks/locale/trunks.fr.tr | 7 - mods/plantlife_modpack/trunks/nodes.lua | 171 +- .../textures/old & unused/comboSticks.png | Bin 243 -> 0 bytes .../textures/old & unused/comboSticks_2.png | Bin 363 -> 0 bytes .../old & unused/trunks_root_mask_old.png | Bin 135 -> 0 bytes .../textures/old & unused/trunks_twig_1e.png | Bin 136 -> 0 bytes .../textures/old & unused/trunks_twig_1n.png | Bin 147 -> 0 bytes .../textures/old & unused/trunks_twig_2n.png | Bin 142 -> 0 bytes .../textures/old & unused/trunks_twig_3n.png | Bin 138 -> 0 bytes .../textures/old & unused/trunks_twig_4n.png | Bin 152 -> 0 bytes .../textures/old & unused/trunks_twig_5-8.png | Bin 170 -> 0 bytes .../old & unused/trunks_twig_9-12.png | Bin 200 -> 0 bytes .../trunks/textures/trunks_twigs.png | Bin 759 -> 665 bytes .../trunks/trunks_settings.txt | 70 - mods/plantlife_modpack/vines/README.md | 2 +- mods/plantlife_modpack/vines/init.lua | 176 +- .../vines/locale/template.txt | 6 - .../vines/locale/vines.de.tr | 8 + .../vines/locale/vines.eo.tr | 8 + .../vines/locale/vines.fr.tr | 7 - .../vines/mapgen.lua} | 0 mods/plantlife_modpack/vines/mod.conf | 4 +- mods/plantlife_modpack/vines/screenshot.png | Bin 189723 -> 60427 bytes mods/plantlife_modpack/vines/settingtypes.txt | 20 +- .../vines/textures/vines_item.png | Bin 167 -> 215 bytes .../vines/textures/vines_jungle_end.png | Bin 497 -> 192 bytes .../vines/textures/vines_jungle_middle.png | Bin 481 -> 195 bytes .../vines/textures/vines_root_end.png | Bin 215 -> 174 bytes .../vines/textures/vines_root_middle.png | Bin 201 -> 144 bytes .../vines/textures/vines_rope.png | Bin 106 -> 136 bytes .../vines/textures/vines_rope_end.png | Bin 118 -> 151 bytes .../vines/textures/vines_shears.png | Bin 194 -> 184 bytes .../vines/textures/vines_side_end.png | Bin 247 -> 257 bytes .../vines/textures/vines_side_middle.png | Bin 225 -> 256 bytes .../vines/textures/vines_vine_end.png | Bin 364 -> 186 bytes .../vines/textures/vines_vine_middle.png | Bin 187 -> 211 bytes .../vines/textures/vines_willow_end.png | Bin 226 -> 170 bytes .../vines/textures/vines_willow_middle.png | Bin 196 -> 198 bytes mods/plantlife_modpack/woodsoils/init.lua | 28 - .../woodsoils/locale/template.txt | 7 - .../woodsoils/locale/woodsoils.de.tr | 5 + .../woodsoils/locale/woodsoils.eo.tr | 5 + .../woodsoils/locale/woodsoils.fr.tr | 7 - .../textures/not in use/woodsoils.png | Bin 110 -> 0 bytes .../textures/woodsoils_ground_cover_side.png | Bin 353 -> 352 bytes mods/plantlife_modpack/youngtrees/init.lua | 146 +- .../youngtrees/locale/template.txt | 8 - .../youngtrees/locale/youngtrees.de.tr | 5 + .../youngtrees/locale/youngtrees.eo.tr | 5 + .../youngtrees/locale/youngtrees.fr.tr | 8 - mods/plantlife_modpack/youngtrees/mod.conf | 3 +- .../youngtrees/settingtypes.txt | 10 +- .../youngtrees/textures/unused/sapling.png | Bin 14617 -> 0 bytes .../youngtrees/textures/unused/sapling16x.png | Bin 1020 -> 0 bytes mods/plasticbox/depends.txt | 2 +- mods/playeranim/init.lua | 19 +- mods/playerplus/README.md | 3 + mods/playerplus/depends.txt | 4 - mods/playerplus/description.txt | 1 - mods/playerplus/init.lua | 388 +- mods/playerplus/lucky_block.lua | 6 + mods/playerplus/mod.conf | 4 +- mods/playerplus/settingtypes.txt | 2 +- .../textures/playerplus_sword_boing.png | Bin 0 -> 212 bytes mods/prefab_redo/.luacheckrc | 7 + mods/prefab_redo/depends.txt | 3 - mods/prefab_redo/init.lua | 12 +- mods/prefab_redo/mod.conf | 2 + mods/protector/README.md | 2 +- mods/protector/admin.lua | 66 +- mods/protector/depends.txt | 5 - mods/protector/description.txt | 1 - mods/protector/doors_chest.lua | 577 +- mods/protector/hud.lua | 37 +- mods/protector/init.lua | 343 +- mods/protector/intllib.lua | 45 - mods/protector/license.txt | 12 + mods/protector/locale/de.po | 182 - mods/protector/locale/es.po | 177 - mods/protector/locale/fr.po | 183 - mods/protector/locale/it.po | 180 - mods/protector/locale/protector.tr.tr | 2 +- mods/protector/locale/ru.po | 183 - mods/protector/locale/template.pot | 179 - mods/protector/locale/tr.po | 180 - mods/protector/lucky_block.lua | 27 +- mods/protector/mod.conf | 3 +- mods/protector/pvp.lua | 22 +- mods/protector/screenshot.jpg | Bin 0 -> 84289 bytes mods/protector/screenshot.png | Bin 12165 -> 0 bytes mods/protector/settingtypes.txt | 2 +- mods/protector/textures/protector_tool.png | Bin 0 -> 174 bytes mods/protector/tool.lua | 45 +- mods/regrow/description.txt | 1 - mods/regrow/init.lua | 111 +- mods/regrow/mod.conf | 5 +- mods/regrow/readme.MD | 117 +- mods/regrow/settingtypes.txt | 5 + .../advanced_aircraft_warning_light.lua | 1 + .../advanced_automatic_warning_device.lua | 8 + .../infrastructure/advanced_boom_barrier.lua | 4 + .../advanced_crosswalk_warning_light.lua | 2 + .../infrastructure/advanced_road_signs.lua | 1 + .../advanced_traffic_lights_pedestrians.lua | 3 + .../infrastructure/advanced_warning_light.lua | 1 + mods/roads/infrastructure/nodes.lua | 9 + mods/roads/labels/init.lua | 1 + mods/roads/streetsmod/libs/smartfs/README.md | 88 + mods/roads/streetsmod/libs/smartfs/api.md | 107 + .../streetsmod/libs/smartfs}/depends.txt | 2 +- .../roads/streetsmod/libs/smartfs/example.lua | 66 + .../streetsmod/libs/smartfs/example.smartfs | 1 + mods/roads/streetsmod/libs/smartfs/init.lua | 2 + .../roads/streetsmod/libs/smartfs/smartfs.lua | 760 ++ mods/signs_lib/.luacheckrc | 5 +- mods/signs_lib/API.md | 4 +- mods/signs_lib/README.md | 1 + mods/signs_lib/api.lua | 159 +- mods/signs_lib/compat.lua | 25 +- mods/signs_lib/encoding.lua | 1 + mods/signs_lib/init.lua | 5 +- mods/signs_lib/intllib.lua | 45 - mods/signs_lib/locale/de.po | 97 - mods/signs_lib/locale/es.po | 95 - mods/signs_lib/locale/fr.po | 91 - mods/signs_lib/locale/ms.po | 91 - mods/signs_lib/locale/ru.po | 94 - mods/signs_lib/locale/signs_lib.de.tr | 12 + mods/signs_lib/locale/signs_lib.es.tr | 12 + mods/signs_lib/locale/signs_lib.fr.tr | 12 + mods/signs_lib/locale/signs_lib.ms.tr | 12 + mods/signs_lib/locale/signs_lib.ru.tr | 12 + mods/signs_lib/locale/template.pot | 94 - mods/signs_lib/locale/template.txt | 12 + mods/signs_lib/mod.conf | 3 +- mods/signs_lib/nonascii-ua.lua | 8 + mods/signs_lib/settingstypes.txt | 1 + mods/signs_lib/standard_signs.lua | 103 +- .../textures/signs_lib_font_16px_0404.png | Bin 0 -> 129 bytes .../textures/signs_lib_font_16px_0406.png | Bin 0 -> 86 bytes .../textures/signs_lib_font_16px_0407.png | Bin 0 -> 98 bytes .../textures/signs_lib_font_16px_0454.png | Bin 0 -> 135 bytes .../textures/signs_lib_font_16px_0456.png | Bin 0 -> 94 bytes .../textures/signs_lib_font_16px_0457.png | Bin 0 -> 91 bytes .../textures/signs_lib_font_16px_0490.png | Bin 0 -> 102 bytes .../textures/signs_lib_font_16px_0491.png | Bin 0 -> 103 bytes .../textures/signs_lib_font_32px_0404.png | Bin 0 -> 192 bytes .../textures/signs_lib_font_32px_0406.png | Bin 0 -> 100 bytes .../textures/signs_lib_font_32px_0407.png | Bin 0 -> 110 bytes .../textures/signs_lib_font_32px_0454.png | Bin 0 -> 171 bytes .../textures/signs_lib_font_32px_0456.png | Bin 0 -> 99 bytes .../textures/signs_lib_font_32px_0457.png | Bin 0 -> 107 bytes .../textures/signs_lib_font_32px_0490.png | Bin 0 -> 110 bytes .../textures/signs_lib_font_32px_0491.png | Bin 0 -> 111 bytes ...ic_signs wooden yard sign two sticks.blend | Bin .../slim pole mount already positioned.blend | Bin ...andard pole mount already positioned.blend | Bin ...ndard pole mount already positioned.blend1 | Bin .../blender}/standard wooden sign.blend | Bin .../blender}/standard wooden sign.blend1 | Bin .../blender}/standard wooden yard sign.blend | Bin mods/signs_lib/util/nonascii-ua | 8 + mods/skinsdb/.luacheckrc | 14 + mods/skinsdb/API.md | 40 +- mods/skinsdb/README.md | 14 +- mods/skinsdb/api.lua | 23 +- mods/skinsdb/chatcommands.lua | 2 +- mods/skinsdb/formspecs.lua | 6 +- mods/skinsdb/init.lua | 22 + mods/skinsdb/locale/skinsdb.de.tr | 22 +- mods/skinsdb/locale/skinsdb.eo.tr | 19 + mods/skinsdb/locale/skinsdb.fr.tr | 21 +- mods/skinsdb/locale/skinsdb.ms.tr | 21 +- mods/skinsdb/locale/skinsdb.pt_BR.tr | 19 + mods/skinsdb/locale/skinsdb.ru.tr | 19 + mods/skinsdb/locale/skinsdb.uk.tr | 19 + mods/skinsdb/locale/skinsdb.zh_CN.tr | 19 +- mods/skinsdb/locale/skinsdb.zh_TW.tr | 20 +- mods/skinsdb/locale/template.txt | 23 +- .../meta/{character_1.txt => character.1.txt} | 0 .../{character_10.txt => character.10.txt} | 0 ...{character_1000.txt => character.1000.txt} | 0 ...{character_1001.txt => character.1001.txt} | 0 ...{character_1002.txt => character.1002.txt} | 0 ...{character_1003.txt => character.1003.txt} | 0 ...{character_1004.txt => character.1004.txt} | 0 ...{character_1005.txt => character.1005.txt} | 0 ...{character_1006.txt => character.1006.txt} | 0 ...{character_1007.txt => character.1007.txt} | 0 ...{character_1008.txt => character.1008.txt} | 0 ...{character_1009.txt => character.1009.txt} | 0 .../{character_101.txt => character.101.txt} | 0 ...{character_1010.txt => character.1010.txt} | 0 ...{character_1011.txt => character.1011.txt} | 0 ...{character_1012.txt => character.1012.txt} | 0 ...{character_1013.txt => character.1013.txt} | 0 ...{character_1014.txt => character.1014.txt} | 0 ...{character_1015.txt => character.1015.txt} | 0 ...{character_1016.txt => character.1016.txt} | 0 ...{character_1017.txt => character.1017.txt} | 0 ...{character_1018.txt => character.1018.txt} | 0 ...{character_1019.txt => character.1019.txt} | 0 ...{character_1020.txt => character.1020.txt} | 0 ...{character_1021.txt => character.1021.txt} | 0 ...{character_1022.txt => character.1022.txt} | 0 ...{character_1023.txt => character.1023.txt} | 0 ...{character_1024.txt => character.1024.txt} | 0 ...{character_1025.txt => character.1025.txt} | 0 ...{character_1026.txt => character.1026.txt} | 0 ...{character_1027.txt => character.1027.txt} | 0 ...{character_1028.txt => character.1028.txt} | 0 ...{character_1029.txt => character.1029.txt} | 0 ...{character_1030.txt => character.1030.txt} | 0 ...{character_1031.txt => character.1031.txt} | 0 ...{character_1032.txt => character.1032.txt} | 0 ...{character_1033.txt => character.1033.txt} | 0 ...{character_1034.txt => character.1034.txt} | 0 ...{character_1035.txt => character.1035.txt} | 0 ...{character_1036.txt => character.1036.txt} | 0 ...{character_1037.txt => character.1037.txt} | 0 ...{character_1038.txt => character.1038.txt} | 0 ...{character_1039.txt => character.1039.txt} | 0 ...{character_1040.txt => character.1040.txt} | 0 ...{character_1041.txt => character.1041.txt} | 0 ...{character_1042.txt => character.1042.txt} | 0 ...{character_1043.txt => character.1043.txt} | 2 +- ...{character_1044.txt => character.1044.txt} | 0 ...{character_1045.txt => character.1045.txt} | 0 ...{character_1046.txt => character.1046.txt} | 0 ...{character_1047.txt => character.1047.txt} | 0 ...{character_1048.txt => character.1048.txt} | 0 ...{character_1049.txt => character.1049.txt} | 0 ...{character_1050.txt => character.1050.txt} | 0 ...{character_1051.txt => character.1051.txt} | 0 ...{character_1052.txt => character.1052.txt} | 0 ...{character_1053.txt => character.1053.txt} | 0 ...{character_1054.txt => character.1054.txt} | 0 ...{character_1055.txt => character.1055.txt} | 0 ...{character_1056.txt => character.1056.txt} | 0 ...{character_1057.txt => character.1057.txt} | 0 ...{character_1058.txt => character.1058.txt} | 0 ...{character_1059.txt => character.1059.txt} | 0 ...{character_1060.txt => character.1060.txt} | 0 ...{character_1061.txt => character.1061.txt} | 0 ...{character_1062.txt => character.1062.txt} | 0 ...{character_1063.txt => character.1063.txt} | 0 ...{character_1064.txt => character.1064.txt} | 0 ...{character_1065.txt => character.1065.txt} | 0 ...{character_1066.txt => character.1066.txt} | 0 ...{character_1067.txt => character.1067.txt} | 0 ...{character_1068.txt => character.1068.txt} | 0 ...{character_1069.txt => character.1069.txt} | 0 ...{character_1070.txt => character.1070.txt} | 0 ...{character_1071.txt => character.1071.txt} | 0 ...{character_1072.txt => character.1072.txt} | 0 ...{character_1073.txt => character.1073.txt} | 0 ...{character_1075.txt => character.1075.txt} | 0 ...{character_1076.txt => character.1076.txt} | 0 ...{character_1077.txt => character.1077.txt} | 0 ...{character_1078.txt => character.1078.txt} | 0 ...{character_1079.txt => character.1079.txt} | 0 .../{character_108.txt => character.108.txt} | 0 ...{character_1080.txt => character.1080.txt} | 0 ...{character_1081.txt => character.1081.txt} | 0 ...{character_1082.txt => character.1082.txt} | 0 ...{character_1083.txt => character.1083.txt} | 0 ...{character_1084.txt => character.1084.txt} | 0 ...{character_1085.txt => character.1085.txt} | 0 ...{character_1086.txt => character.1086.txt} | 0 ...{character_1087.txt => character.1087.txt} | 0 ...{character_1088.txt => character.1088.txt} | 0 ...{character_1089.txt => character.1089.txt} | 0 .../{character_109.txt => character.109.txt} | 0 ...{character_1090.txt => character.1090.txt} | 0 ...{character_1091.txt => character.1091.txt} | 0 ...{character_1092.txt => character.1092.txt} | 0 ...{character_1093.txt => character.1093.txt} | 0 ...{character_1094.txt => character.1094.txt} | 0 ...{character_1095.txt => character.1095.txt} | 0 ...{character_1096.txt => character.1096.txt} | 0 ...{character_1097.txt => character.1097.txt} | 0 ...{character_1098.txt => character.1098.txt} | 0 ...{character_1099.txt => character.1099.txt} | 0 .../{character_110.txt => character.110.txt} | 0 ...{character_1100.txt => character.1100.txt} | 0 ...{character_1101.txt => character.1101.txt} | 0 ...{character_1102.txt => character.1102.txt} | 0 ...{character_1103.txt => character.1103.txt} | 0 ...{character_1104.txt => character.1104.txt} | 0 ...{character_1105.txt => character.1105.txt} | 0 ...{character_1106.txt => character.1106.txt} | 0 ...{character_1107.txt => character.1107.txt} | 0 ...{character_1108.txt => character.1108.txt} | 0 ...{character_1109.txt => character.1109.txt} | 0 .../{character_111.txt => character.111.txt} | 0 ...{character_1110.txt => character.1110.txt} | 0 ...{character_1111.txt => character.1111.txt} | 0 ...{character_1112.txt => character.1112.txt} | 0 ...{character_1113.txt => character.1113.txt} | 0 ...{character_1114.txt => character.1114.txt} | 0 ...{character_1115.txt => character.1115.txt} | 0 ...{character_1116.txt => character.1116.txt} | 0 ...{character_1117.txt => character.1117.txt} | 0 ...{character_1118.txt => character.1118.txt} | 0 ...{character_1119.txt => character.1119.txt} | 0 .../{character_112.txt => character.112.txt} | 0 ...{character_1120.txt => character.1120.txt} | 0 ...{character_1121.txt => character.1121.txt} | 0 ...{character_1122.txt => character.1122.txt} | 0 ...{character_1123.txt => character.1123.txt} | 0 ...{character_1124.txt => character.1124.txt} | 0 ...{character_1126.txt => character.1126.txt} | 0 ...{character_1127.txt => character.1127.txt} | 0 .../{character_113.txt => character.113.txt} | 0 ...{character_1133.txt => character.1133.txt} | 0 ...{character_1134.txt => character.1134.txt} | 0 mods/skinsdb/meta/character.1135.txt | 3 + ...{character_1136.txt => character.1136.txt} | 0 ...{character_1137.txt => character.1137.txt} | 0 ...{character_1138.txt => character.1138.txt} | 2 +- ...{character_1139.txt => character.1139.txt} | 0 .../{character_114.txt => character.114.txt} | 0 ...{character_1140.txt => character.1140.txt} | 0 ...{character_1141.txt => character.1141.txt} | 0 ...{character_1142.txt => character.1142.txt} | 0 ...{character_1143.txt => character.1143.txt} | 0 ...{character_1144.txt => character.1144.txt} | 0 ...{character_1145.txt => character.1145.txt} | 0 ...{character_1146.txt => character.1146.txt} | 0 ...{character_1147.txt => character.1147.txt} | 0 ...{character_1148.txt => character.1148.txt} | 0 ...{character_1149.txt => character.1149.txt} | 0 ...{character_1150.txt => character.1150.txt} | 0 ...{character_1151.txt => character.1151.txt} | 0 ...{character_1153.txt => character.1153.txt} | 0 ...{character_1154.txt => character.1154.txt} | 0 ...{character_1155.txt => character.1155.txt} | 0 ...{character_1156.txt => character.1156.txt} | 0 ...{character_1157.txt => character.1157.txt} | 0 ...{character_1158.txt => character.1158.txt} | 0 ...{character_1159.txt => character.1159.txt} | 0 ...{character_1160.txt => character.1160.txt} | 0 ...{character_1161.txt => character.1161.txt} | 0 ...{character_1162.txt => character.1162.txt} | 0 ...{character_1163.txt => character.1163.txt} | 0 ...{character_1164.txt => character.1164.txt} | 0 ...{character_1165.txt => character.1165.txt} | 0 ...{character_1166.txt => character.1166.txt} | 0 ...{character_1167.txt => character.1167.txt} | 0 ...{character_1168.txt => character.1168.txt} | 0 ...{character_1169.txt => character.1169.txt} | 0 .../{character_117.txt => character.117.txt} | 0 ...{character_1170.txt => character.1170.txt} | 0 ...{character_1171.txt => character.1171.txt} | 0 ...{character_1172.txt => character.1172.txt} | 0 ...{character_1173.txt => character.1173.txt} | 0 ...{character_1174.txt => character.1174.txt} | 0 ...{character_1175.txt => character.1175.txt} | 0 ...{character_1176.txt => character.1176.txt} | 0 ...{character_1177.txt => character.1177.txt} | 0 ...{character_1178.txt => character.1178.txt} | 0 ...{character_1179.txt => character.1179.txt} | 0 .../{character_118.txt => character.118.txt} | 0 ...{character_1180.txt => character.1180.txt} | 0 ...{character_1181.txt => character.1181.txt} | 0 ...{character_1182.txt => character.1182.txt} | 0 ...{character_1183.txt => character.1183.txt} | 0 ...{character_1184.txt => character.1184.txt} | 0 ...{character_1185.txt => character.1185.txt} | 0 ...{character_1186.txt => character.1186.txt} | 0 ...{character_1191.txt => character.1191.txt} | 0 ...{character_1192.txt => character.1192.txt} | 0 ...{character_1193.txt => character.1193.txt} | 0 ...{character_1194.txt => character.1194.txt} | 0 ...{character_1195.txt => character.1195.txt} | 0 ...{character_1196.txt => character.1196.txt} | 0 ...{character_1197.txt => character.1197.txt} | 0 ...{character_1198.txt => character.1198.txt} | 0 ...{character_1199.txt => character.1199.txt} | 0 .../{character_12.txt => character.12.txt} | 0 ...{character_1200.txt => character.1200.txt} | 0 ...{character_1201.txt => character.1201.txt} | 0 ...{character_1202.txt => character.1202.txt} | 0 ...{character_1203.txt => character.1203.txt} | 0 ...{character_1204.txt => character.1204.txt} | 0 ...{character_1205.txt => character.1205.txt} | 0 ...{character_1206.txt => character.1206.txt} | 0 ...{character_1207.txt => character.1207.txt} | 0 ...{character_1208.txt => character.1208.txt} | 0 ...{character_1209.txt => character.1209.txt} | 0 .../{character_121.txt => character.121.txt} | 0 ...{character_1210.txt => character.1210.txt} | 0 ...{character_1211.txt => character.1211.txt} | 0 ...{character_1212.txt => character.1212.txt} | 0 ...{character_1213.txt => character.1213.txt} | 0 ...{character_1214.txt => character.1214.txt} | 0 ...{character_1215.txt => character.1215.txt} | 0 ...{character_1216.txt => character.1216.txt} | 0 ...{character_1217.txt => character.1217.txt} | 0 ...{character_1218.txt => character.1218.txt} | 0 ...{character_1219.txt => character.1219.txt} | 0 ...{character_1220.txt => character.1220.txt} | 0 ...{character_1221.txt => character.1221.txt} | 0 ...{character_1222.txt => character.1222.txt} | 0 ...{character_1223.txt => character.1223.txt} | 0 ...{character_1224.txt => character.1224.txt} | 0 ...{character_1225.txt => character.1225.txt} | 0 ...{character_1226.txt => character.1226.txt} | 0 ...{character_1227.txt => character.1227.txt} | 0 ...{character_1228.txt => character.1228.txt} | 0 ...{character_1229.txt => character.1229.txt} | 0 ...{character_1230.txt => character.1230.txt} | 0 ...{character_1231.txt => character.1231.txt} | 0 ...{character_1232.txt => character.1232.txt} | 0 ...{character_1233.txt => character.1233.txt} | 0 ...{character_1234.txt => character.1234.txt} | 0 ...{character_1235.txt => character.1235.txt} | 0 ...{character_1236.txt => character.1236.txt} | 0 ...{character_1237.txt => character.1237.txt} | 0 ...{character_1238.txt => character.1238.txt} | 0 ...{character_1239.txt => character.1239.txt} | 0 .../{character_124.txt => character.124.txt} | 0 ...{character_1240.txt => character.1240.txt} | 0 ...{character_1241.txt => character.1241.txt} | 0 ...{character_1242.txt => character.1242.txt} | 0 ...{character_1243.txt => character.1243.txt} | 0 ...{character_1244.txt => character.1244.txt} | 0 ...{character_1245.txt => character.1245.txt} | 0 ...{character_1246.txt => character.1246.txt} | 0 ...{character_1247.txt => character.1247.txt} | 0 ...{character_1248.txt => character.1248.txt} | 0 ...{character_1249.txt => character.1249.txt} | 0 ...{character_1250.txt => character.1250.txt} | 0 ...{character_1251.txt => character.1251.txt} | 0 ...{character_1252.txt => character.1252.txt} | 0 ...{character_1253.txt => character.1253.txt} | 0 ...{character_1254.txt => character.1254.txt} | 0 ...{character_1255.txt => character.1255.txt} | 0 ...{character_1256.txt => character.1256.txt} | 0 ...{character_1257.txt => character.1257.txt} | 0 ...{character_1258.txt => character.1258.txt} | 0 ...{character_1259.txt => character.1259.txt} | 0 .../{character_126.txt => character.126.txt} | 0 ...{character_1260.txt => character.1260.txt} | 0 ...{character_1261.txt => character.1261.txt} | 0 ...{character_1262.txt => character.1262.txt} | 0 ...{character_1263.txt => character.1263.txt} | 0 ...{character_1264.txt => character.1264.txt} | 0 ...{character_1265.txt => character.1265.txt} | 0 ...{character_1266.txt => character.1266.txt} | 0 ...{character_1267.txt => character.1267.txt} | 0 ...{character_1268.txt => character.1268.txt} | 0 ...{character_1269.txt => character.1269.txt} | 0 ...{character_1270.txt => character.1270.txt} | 0 ...{character_1271.txt => character.1271.txt} | 0 ...{character_1272.txt => character.1272.txt} | 0 ...{character_1273.txt => character.1273.txt} | 0 ...{character_1274.txt => character.1274.txt} | 0 ...{character_1275.txt => character.1275.txt} | 0 ...{character_1276.txt => character.1276.txt} | 0 ...{character_1277.txt => character.1277.txt} | 0 ...{character_1278.txt => character.1278.txt} | 0 ...{character_1279.txt => character.1279.txt} | 0 .../{character_128.txt => character.128.txt} | 0 ...{character_1280.txt => character.1280.txt} | 0 ...{character_1281.txt => character.1281.txt} | 0 ...{character_1282.txt => character.1282.txt} | 0 ...{character_1283.txt => character.1283.txt} | 0 ...{character_1284.txt => character.1284.txt} | 0 ...{character_1285.txt => character.1285.txt} | 0 ...{character_1286.txt => character.1286.txt} | 0 ...{character_1287.txt => character.1287.txt} | 0 ...{character_1288.txt => character.1288.txt} | 0 ...{character_1289.txt => character.1289.txt} | 0 .../{character_129.txt => character.129.txt} | 0 ...{character_1290.txt => character.1290.txt} | 0 ...{character_1291.txt => character.1291.txt} | 0 ...{character_1292.txt => character.1292.txt} | 0 ...{character_1293.txt => character.1293.txt} | 0 ...{character_1294.txt => character.1294.txt} | 0 ...{character_1295.txt => character.1295.txt} | 0 ...{character_1296.txt => character.1296.txt} | 0 ...{character_1297.txt => character.1297.txt} | 0 ...{character_1298.txt => character.1298.txt} | 0 ...{character_1299.txt => character.1299.txt} | 0 ...{character_1300.txt => character.1300.txt} | 0 ...{character_1301.txt => character.1301.txt} | 0 ...{character_1302.txt => character.1302.txt} | 0 ...{character_1303.txt => character.1303.txt} | 0 ...{character_1304.txt => character.1304.txt} | 0 ...{character_1305.txt => character.1305.txt} | 0 ...{character_1306.txt => character.1306.txt} | 0 ...{character_1307.txt => character.1307.txt} | 0 ...{character_1308.txt => character.1308.txt} | 0 ...{character_1309.txt => character.1309.txt} | 0 ...{character_1310.txt => character.1310.txt} | 0 ...{character_1311.txt => character.1311.txt} | 0 ...{character_1312.txt => character.1312.txt} | 0 ...{character_1313.txt => character.1313.txt} | 0 ...{character_1314.txt => character.1314.txt} | 0 ...{character_1315.txt => character.1315.txt} | 0 ...{character_1316.txt => character.1316.txt} | 0 ...{character_1317.txt => character.1317.txt} | 0 ...{character_1318.txt => character.1318.txt} | 0 ...{character_1319.txt => character.1319.txt} | 0 ...{character_1320.txt => character.1320.txt} | 0 ...{character_1321.txt => character.1321.txt} | 0 ...{character_1322.txt => character.1322.txt} | 0 ...{character_1323.txt => character.1323.txt} | 0 ...{character_1324.txt => character.1324.txt} | 0 ...{character_1325.txt => character.1325.txt} | 0 ...{character_1326.txt => character.1326.txt} | 0 ...{character_1327.txt => character.1327.txt} | 0 ...{character_1328.txt => character.1328.txt} | 0 ...{character_1329.txt => character.1329.txt} | 0 ...{character_1330.txt => character.1330.txt} | 0 ...{character_1331.txt => character.1331.txt} | 0 ...{character_1332.txt => character.1332.txt} | 0 ...{character_1333.txt => character.1333.txt} | 0 ...{character_1334.txt => character.1334.txt} | 0 ...{character_1335.txt => character.1335.txt} | 0 ...{character_1336.txt => character.1336.txt} | 0 ...{character_1337.txt => character.1337.txt} | 0 ...{character_1338.txt => character.1338.txt} | 0 .../{character_134.txt => character.134.txt} | 0 ...{character_1340.txt => character.1340.txt} | 0 ...{character_1341.txt => character.1341.txt} | 0 ...{character_1342.txt => character.1342.txt} | 0 ...{character_1343.txt => character.1343.txt} | 0 ...{character_1344.txt => character.1344.txt} | 0 ...{character_1345.txt => character.1345.txt} | 0 ...{character_1346.txt => character.1346.txt} | 0 ...{character_1347.txt => character.1347.txt} | 0 ...{character_1348.txt => character.1348.txt} | 0 ...{character_1349.txt => character.1349.txt} | 0 .../{character_135.txt => character.135.txt} | 0 ...{character_1350.txt => character.1350.txt} | 0 ...{character_1351.txt => character.1351.txt} | 0 ...{character_1352.txt => character.1352.txt} | 0 ...{character_1353.txt => character.1353.txt} | 0 ...{character_1354.txt => character.1354.txt} | 0 ...{character_1355.txt => character.1355.txt} | 0 ...{character_1356.txt => character.1356.txt} | 0 ...{character_1357.txt => character.1357.txt} | 0 ...{character_1358.txt => character.1358.txt} | 0 ...{character_1359.txt => character.1359.txt} | 0 .../{character_136.txt => character.136.txt} | 0 ...{character_1360.txt => character.1360.txt} | 0 ...{character_1361.txt => character.1361.txt} | 0 ...{character_1362.txt => character.1362.txt} | 0 ...{character_1363.txt => character.1363.txt} | 0 ...{character_1364.txt => character.1364.txt} | 0 ...{character_1365.txt => character.1365.txt} | 0 ...{character_1366.txt => character.1366.txt} | 0 ...{character_1367.txt => character.1367.txt} | 0 ...{character_1368.txt => character.1368.txt} | 0 ...{character_1369.txt => character.1369.txt} | 0 ...{character_1370.txt => character.1370.txt} | 0 ...{character_1371.txt => character.1371.txt} | 0 ...{character_1372.txt => character.1372.txt} | 0 ...{character_1373.txt => character.1373.txt} | 0 ...{character_1374.txt => character.1374.txt} | 0 ...{character_1375.txt => character.1375.txt} | 0 ...{character_1376.txt => character.1376.txt} | 0 ...{character_1377.txt => character.1377.txt} | 0 ...{character_1378.txt => character.1378.txt} | 0 ...{character_1379.txt => character.1379.txt} | 0 ...{character_1380.txt => character.1380.txt} | 0 ...{character_1381.txt => character.1381.txt} | 0 ...{character_1382.txt => character.1382.txt} | 0 ...{character_1383.txt => character.1383.txt} | 0 ...{character_1384.txt => character.1384.txt} | 0 ...{character_1385.txt => character.1385.txt} | 0 ...{character_1386.txt => character.1386.txt} | 0 ...{character_1387.txt => character.1387.txt} | 0 ...{character_1388.txt => character.1388.txt} | 0 ...{character_1389.txt => character.1389.txt} | 0 ...{character_1390.txt => character.1390.txt} | 0 ...{character_1391.txt => character.1391.txt} | 0 ...{character_1392.txt => character.1392.txt} | 0 ...{character_1393.txt => character.1393.txt} | 0 ...{character_1394.txt => character.1394.txt} | 0 ...{character_1395.txt => character.1395.txt} | 0 ...{character_1396.txt => character.1396.txt} | 0 ...{character_1397.txt => character.1397.txt} | 0 ...{character_1398.txt => character.1398.txt} | 0 ...{character_1399.txt => character.1399.txt} | 0 .../{character_140.txt => character.140.txt} | 0 ...{character_1400.txt => character.1400.txt} | 0 ...{character_1401.txt => character.1401.txt} | 0 ...{character_1402.txt => character.1402.txt} | 0 ...{character_1403.txt => character.1403.txt} | 0 ...{character_1404.txt => character.1404.txt} | 0 ...{character_1405.txt => character.1405.txt} | 0 ...{character_1406.txt => character.1406.txt} | 0 ...{character_1407.txt => character.1407.txt} | 0 ...{character_1408.txt => character.1408.txt} | 0 ...{character_1409.txt => character.1409.txt} | 0 .../{character_141.txt => character.141.txt} | 0 ...{character_1410.txt => character.1410.txt} | 0 ...{character_1411.txt => character.1411.txt} | 0 ...{character_1414.txt => character.1414.txt} | 0 ...{character_1415.txt => character.1415.txt} | 0 ...{character_1416.txt => character.1416.txt} | 0 ...{character_1417.txt => character.1417.txt} | 0 ...{character_1418.txt => character.1418.txt} | 0 ...{character_1419.txt => character.1419.txt} | 0 .../{character_142.txt => character.142.txt} | 0 ...{character_1420.txt => character.1420.txt} | 0 ...{character_1421.txt => character.1421.txt} | 0 ...{character_1422.txt => character.1422.txt} | 0 ...{character_1423.txt => character.1423.txt} | 0 ...{character_1424.txt => character.1424.txt} | 0 ...{character_1425.txt => character.1425.txt} | 0 ...{character_1426.txt => character.1426.txt} | 0 ...{character_1427.txt => character.1427.txt} | 0 ...{character_1428.txt => character.1428.txt} | 0 ...{character_1429.txt => character.1429.txt} | 0 .../{character_143.txt => character.143.txt} | 0 ...{character_1430.txt => character.1430.txt} | 0 ...{character_1431.txt => character.1431.txt} | 0 ...{character_1432.txt => character.1432.txt} | 0 ...{character_1433.txt => character.1433.txt} | 0 ...{character_1434.txt => character.1434.txt} | 0 ...{character_1435.txt => character.1435.txt} | 0 ...{character_1436.txt => character.1436.txt} | 0 ...{character_1437.txt => character.1437.txt} | 0 ...{character_1438.txt => character.1438.txt} | 0 ...{character_1439.txt => character.1439.txt} | 0 .../{character_144.txt => character.144.txt} | 0 ...{character_1440.txt => character.1440.txt} | 0 ...{character_1441.txt => character.1441.txt} | 0 ...{character_1442.txt => character.1442.txt} | 0 ...{character_1443.txt => character.1443.txt} | 0 ...{character_1444.txt => character.1444.txt} | 0 ...{character_1445.txt => character.1445.txt} | 0 .../{character_145.txt => character.145.txt} | 0 ...{character_1455.txt => character.1455.txt} | 0 ...{character_1456.txt => character.1456.txt} | 0 ...{character_1457.txt => character.1457.txt} | 0 ...{character_1458.txt => character.1458.txt} | 0 ...{character_1459.txt => character.1459.txt} | 0 .../{character_146.txt => character.146.txt} | 0 ...{character_1460.txt => character.1460.txt} | 0 ...{character_1461.txt => character.1461.txt} | 0 ...{character_1462.txt => character.1462.txt} | 0 ...{character_1463.txt => character.1463.txt} | 0 ...{character_1464.txt => character.1464.txt} | 0 ...{character_1465.txt => character.1465.txt} | 0 ...{character_1466.txt => character.1466.txt} | 0 ...{character_1467.txt => character.1467.txt} | 0 ...{character_1468.txt => character.1468.txt} | 0 ...{character_1469.txt => character.1469.txt} | 0 .../{character_147.txt => character.147.txt} | 0 ...{character_1470.txt => character.1470.txt} | 0 ...{character_1471.txt => character.1471.txt} | 0 ...{character_1472.txt => character.1472.txt} | 0 ...{character_1473.txt => character.1473.txt} | 0 ...{character_1474.txt => character.1474.txt} | 0 ...{character_1475.txt => character.1475.txt} | 0 ...{character_1476.txt => character.1476.txt} | 0 ...{character_1477.txt => character.1477.txt} | 2 +- ...{character_1478.txt => character.1478.txt} | 0 ...{character_1479.txt => character.1479.txt} | 0 .../{character_148.txt => character.148.txt} | 0 ...{character_1480.txt => character.1480.txt} | 0 ...{character_1481.txt => character.1481.txt} | 0 ...{character_1482.txt => character.1482.txt} | 0 ...{character_1483.txt => character.1483.txt} | 0 ...{character_1484.txt => character.1484.txt} | 0 ...{character_1485.txt => character.1485.txt} | 0 ...{character_1486.txt => character.1486.txt} | 0 ...{character_1487.txt => character.1487.txt} | 0 ...{character_1488.txt => character.1488.txt} | 0 ...{character_1489.txt => character.1489.txt} | 0 ...{character_1490.txt => character.1490.txt} | 0 ...{character_1491.txt => character.1491.txt} | 0 ...{character_1492.txt => character.1492.txt} | 0 ...{character_1493.txt => character.1493.txt} | 0 ...{character_1494.txt => character.1494.txt} | 0 ...{character_1495.txt => character.1495.txt} | 0 ...{character_1496.txt => character.1496.txt} | 0 ...{character_1497.txt => character.1497.txt} | 0 ...{character_1498.txt => character.1498.txt} | 0 ...{character_1499.txt => character.1499.txt} | 0 ...{character_1500.txt => character.1500.txt} | 0 ...{character_1501.txt => character.1501.txt} | 0 ...{character_1502.txt => character.1502.txt} | 0 ...{character_1503.txt => character.1503.txt} | 0 ...{character_1504.txt => character.1504.txt} | 0 ...{character_1505.txt => character.1505.txt} | 0 ...{character_1506.txt => character.1506.txt} | 0 ...{character_1507.txt => character.1507.txt} | 0 ...{character_1508.txt => character.1508.txt} | 0 ...{character_1509.txt => character.1509.txt} | 0 .../{character_151.txt => character.151.txt} | 2 +- ...{character_1510.txt => character.1510.txt} | 0 ...{character_1511.txt => character.1511.txt} | 0 ...{character_1512.txt => character.1512.txt} | 0 ...{character_1513.txt => character.1513.txt} | 0 ...{character_1514.txt => character.1514.txt} | 0 ...{character_1515.txt => character.1515.txt} | 0 ...{character_1516.txt => character.1516.txt} | 0 ...{character_1517.txt => character.1517.txt} | 0 ...{character_1518.txt => character.1518.txt} | 0 ...{character_1519.txt => character.1519.txt} | 0 .../{character_152.txt => character.152.txt} | 0 ...{character_1520.txt => character.1520.txt} | 0 ...{character_1521.txt => character.1521.txt} | 0 ...{character_1522.txt => character.1522.txt} | 0 ...{character_1523.txt => character.1523.txt} | 0 ...{character_1524.txt => character.1524.txt} | 0 ...{character_1525.txt => character.1525.txt} | 0 ...{character_1526.txt => character.1526.txt} | 0 ...{character_1527.txt => character.1527.txt} | 0 ...{character_1528.txt => character.1528.txt} | 0 ...{character_1529.txt => character.1529.txt} | 0 .../{character_153.txt => character.153.txt} | 0 ...{character_1530.txt => character.1530.txt} | 0 ...{character_1531.txt => character.1531.txt} | 0 ...{character_1532.txt => character.1532.txt} | 0 ...{character_1533.txt => character.1533.txt} | 0 ...{character_1534.txt => character.1534.txt} | 0 ...{character_1535.txt => character.1535.txt} | 0 ...{character_1536.txt => character.1536.txt} | 0 ...{character_1537.txt => character.1537.txt} | 0 ...{character_1538.txt => character.1538.txt} | 0 ...{character_1539.txt => character.1539.txt} | 0 .../{character_154.txt => character.154.txt} | 0 ...{character_1540.txt => character.1540.txt} | 0 ...{character_1541.txt => character.1541.txt} | 0 ...{character_1542.txt => character.1542.txt} | 0 ...{character_1543.txt => character.1543.txt} | 0 ...{character_1544.txt => character.1544.txt} | 0 ...{character_1545.txt => character.1545.txt} | 0 ...{character_1546.txt => character.1546.txt} | 0 ...{character_1547.txt => character.1547.txt} | 0 ...{character_1548.txt => character.1548.txt} | 0 ...{character_1549.txt => character.1549.txt} | 0 .../{character_155.txt => character.155.txt} | 0 ...{character_1550.txt => character.1550.txt} | 0 ...{character_1551.txt => character.1551.txt} | 0 ...{character_1552.txt => character.1552.txt} | 0 ...{character_1553.txt => character.1553.txt} | 0 ...{character_1554.txt => character.1554.txt} | 0 ...{character_1555.txt => character.1555.txt} | 0 ...{character_1556.txt => character.1556.txt} | 0 ...{character_1557.txt => character.1557.txt} | 0 ...{character_1558.txt => character.1558.txt} | 0 ...{character_1559.txt => character.1559.txt} | 0 .../{character_156.txt => character.156.txt} | 0 ...{character_1560.txt => character.1560.txt} | 0 ...{character_1561.txt => character.1561.txt} | 0 ...{character_1562.txt => character.1562.txt} | 0 ...{character_1563.txt => character.1563.txt} | 0 ...{character_1564.txt => character.1564.txt} | 0 ...{character_1565.txt => character.1565.txt} | 0 ...{character_1566.txt => character.1566.txt} | 0 ...{character_1567.txt => character.1567.txt} | 0 ...{character_1568.txt => character.1568.txt} | 0 ...{character_1569.txt => character.1569.txt} | 0 .../{character_157.txt => character.157.txt} | 0 ...{character_1570.txt => character.1570.txt} | 0 ...{character_1571.txt => character.1571.txt} | 0 ...{character_1572.txt => character.1572.txt} | 0 ...{character_1573.txt => character.1573.txt} | 0 ...{character_1574.txt => character.1574.txt} | 0 ...{character_1575.txt => character.1575.txt} | 0 ...{character_1576.txt => character.1576.txt} | 0 ...{character_1577.txt => character.1577.txt} | 0 ...{character_1578.txt => character.1578.txt} | 0 ...{character_1579.txt => character.1579.txt} | 0 .../{character_158.txt => character.158.txt} | 0 ...{character_1580.txt => character.1580.txt} | 0 ...{character_1581.txt => character.1581.txt} | 0 ...{character_1582.txt => character.1582.txt} | 0 ...{character_1583.txt => character.1583.txt} | 0 ...{character_1584.txt => character.1584.txt} | 0 ...{character_1585.txt => character.1585.txt} | 0 ...{character_1586.txt => character.1586.txt} | 0 ...{character_1587.txt => character.1587.txt} | 0 ...{character_1588.txt => character.1588.txt} | 0 ...{character_1589.txt => character.1589.txt} | 0 .../{character_159.txt => character.159.txt} | 0 ...{character_1590.txt => character.1590.txt} | 0 ...{character_1591.txt => character.1591.txt} | 0 ...{character_1592.txt => character.1592.txt} | 0 ...{character_1593.txt => character.1593.txt} | 0 ...{character_1594.txt => character.1594.txt} | 0 ...{character_1595.txt => character.1595.txt} | 0 ...{character_1596.txt => character.1596.txt} | 0 ...{character_1597.txt => character.1597.txt} | 0 ...{character_1598.txt => character.1598.txt} | 0 ...{character_1599.txt => character.1599.txt} | 0 .../{character_160.txt => character.160.txt} | 0 ...{character_1600.txt => character.1600.txt} | 0 ...{character_1601.txt => character.1601.txt} | 0 ...{character_1602.txt => character.1602.txt} | 0 ...{character_1603.txt => character.1603.txt} | 0 ...{character_1604.txt => character.1604.txt} | 0 ...{character_1605.txt => character.1605.txt} | 0 ...{character_1606.txt => character.1606.txt} | 0 ...{character_1607.txt => character.1607.txt} | 0 ...{character_1608.txt => character.1608.txt} | 0 ...{character_1609.txt => character.1609.txt} | 0 .../{character_161.txt => character.161.txt} | 0 ...{character_1610.txt => character.1610.txt} | 0 ...{character_1611.txt => character.1611.txt} | 0 ...{character_1612.txt => character.1612.txt} | 0 ...{character_1613.txt => character.1613.txt} | 0 ...{character_1614.txt => character.1614.txt} | 0 ...{character_1615.txt => character.1615.txt} | 0 ...{character_1616.txt => character.1616.txt} | 0 ...{character_1617.txt => character.1617.txt} | 0 ...{character_1618.txt => character.1618.txt} | 0 ...{character_1619.txt => character.1619.txt} | 0 .../{character_162.txt => character.162.txt} | 0 ...{character_1620.txt => character.1620.txt} | 0 ...{character_1621.txt => character.1621.txt} | 0 ...{character_1622.txt => character.1622.txt} | 0 ...{character_1623.txt => character.1623.txt} | 0 ...{character_1624.txt => character.1624.txt} | 0 ...{character_1625.txt => character.1625.txt} | 0 ...{character_1626.txt => character.1626.txt} | 0 ...{character_1627.txt => character.1627.txt} | 0 ...{character_1628.txt => character.1628.txt} | 0 ...{character_1629.txt => character.1629.txt} | 0 .../{character_163.txt => character.163.txt} | 2 +- ...{character_1630.txt => character.1630.txt} | 0 ...{character_1631.txt => character.1631.txt} | 0 ...{character_1632.txt => character.1632.txt} | 0 ...{character_1633.txt => character.1633.txt} | 0 ...{character_1634.txt => character.1634.txt} | 0 ...{character_1635.txt => character.1635.txt} | 0 ...{character_1636.txt => character.1636.txt} | 0 ...{character_1637.txt => character.1637.txt} | 0 ...{character_1638.txt => character.1638.txt} | 0 ...{character_1639.txt => character.1639.txt} | 0 .../{character_164.txt => character.164.txt} | 0 ...{character_1640.txt => character.1640.txt} | 0 ...{character_1641.txt => character.1641.txt} | 0 ...{character_1642.txt => character.1642.txt} | 0 ...{character_1643.txt => character.1643.txt} | 0 ...{character_1644.txt => character.1644.txt} | 0 ...{character_1645.txt => character.1645.txt} | 0 ...{character_1646.txt => character.1646.txt} | 0 ...{character_1647.txt => character.1647.txt} | 0 ...{character_1648.txt => character.1648.txt} | 0 ...{character_1649.txt => character.1649.txt} | 0 .../{character_165.txt => character.165.txt} | 0 ...{character_1650.txt => character.1650.txt} | 0 ...{character_1651.txt => character.1651.txt} | 0 ...{character_1652.txt => character.1652.txt} | 0 ...{character_1653.txt => character.1653.txt} | 0 ...{character_1654.txt => character.1654.txt} | 0 ...{character_1655.txt => character.1655.txt} | 0 ...{character_1656.txt => character.1656.txt} | 0 ...{character_1657.txt => character.1657.txt} | 0 ...{character_1658.txt => character.1658.txt} | 0 ...{character_1659.txt => character.1659.txt} | 0 .../{character_166.txt => character.166.txt} | 0 ...{character_1660.txt => character.1660.txt} | 0 ...{character_1661.txt => character.1661.txt} | 0 ...{character_1662.txt => character.1662.txt} | 0 ...{character_1663.txt => character.1663.txt} | 0 ...{character_1664.txt => character.1664.txt} | 0 ...{character_1665.txt => character.1665.txt} | 0 ...{character_1666.txt => character.1666.txt} | 0 ...{character_1667.txt => character.1667.txt} | 0 ...{character_1668.txt => character.1668.txt} | 0 ...{character_1669.txt => character.1669.txt} | 0 .../{character_167.txt => character.167.txt} | 0 ...{character_1670.txt => character.1670.txt} | 0 ...{character_1671.txt => character.1671.txt} | 0 ...{character_1672.txt => character.1672.txt} | 0 ...{character_1673.txt => character.1673.txt} | 0 ...{character_1674.txt => character.1674.txt} | 0 ...{character_1675.txt => character.1675.txt} | 0 ...{character_1676.txt => character.1676.txt} | 0 ...{character_1677.txt => character.1677.txt} | 0 ...{character_1678.txt => character.1678.txt} | 0 ...{character_1679.txt => character.1679.txt} | 0 .../{character_168.txt => character.168.txt} | 0 ...{character_1680.txt => character.1680.txt} | 0 ...{character_1681.txt => character.1681.txt} | 0 ...{character_1682.txt => character.1682.txt} | 0 ...{character_1683.txt => character.1683.txt} | 0 ...{character_1684.txt => character.1684.txt} | 0 ...{character_1685.txt => character.1685.txt} | 0 ...{character_1686.txt => character.1686.txt} | 0 ...{character_1687.txt => character.1687.txt} | 0 ...{character_1688.txt => character.1688.txt} | 0 ...{character_1689.txt => character.1689.txt} | 0 .../{character_169.txt => character.169.txt} | 0 ...{character_1690.txt => character.1690.txt} | 0 ...{character_1691.txt => character.1691.txt} | 0 ...{character_1692.txt => character.1692.txt} | 0 ...{character_1693.txt => character.1693.txt} | 0 ...{character_1694.txt => character.1694.txt} | 0 ...{character_1695.txt => character.1695.txt} | 0 ...{character_1696.txt => character.1696.txt} | 0 ...{character_1697.txt => character.1697.txt} | 0 ...{character_1698.txt => character.1698.txt} | 0 ...{character_1699.txt => character.1699.txt} | 0 .../{character_170.txt => character.170.txt} | 0 ...{character_1700.txt => character.1700.txt} | 0 ...{character_1701.txt => character.1701.txt} | 0 ...{character_1702.txt => character.1702.txt} | 0 ...{character_1703.txt => character.1703.txt} | 0 ...{character_1704.txt => character.1704.txt} | 0 ...{character_1705.txt => character.1705.txt} | 0 ...{character_1706.txt => character.1706.txt} | 0 ...{character_1707.txt => character.1707.txt} | 0 ...{character_1708.txt => character.1708.txt} | 0 ...{character_1709.txt => character.1709.txt} | 0 .../{character_171.txt => character.171.txt} | 0 ...{character_1710.txt => character.1710.txt} | 0 ...{character_1711.txt => character.1711.txt} | 0 ...{character_1712.txt => character.1712.txt} | 0 ...{character_1713.txt => character.1713.txt} | 0 ...{character_1714.txt => character.1714.txt} | 0 ...{character_1715.txt => character.1715.txt} | 0 ...{character_1716.txt => character.1716.txt} | 0 ...{character_1717.txt => character.1717.txt} | 0 ...{character_1718.txt => character.1718.txt} | 0 ...{character_1719.txt => character.1719.txt} | 0 .../{character_172.txt => character.172.txt} | 0 ...{character_1720.txt => character.1720.txt} | 0 ...{character_1721.txt => character.1721.txt} | 0 ...{character_1722.txt => character.1722.txt} | 0 ...{character_1723.txt => character.1723.txt} | 0 ...{character_1724.txt => character.1724.txt} | 0 ...{character_1725.txt => character.1725.txt} | 0 ...{character_1726.txt => character.1726.txt} | 0 ...{character_1727.txt => character.1727.txt} | 0 ...{character_1728.txt => character.1728.txt} | 0 ...{character_1729.txt => character.1729.txt} | 0 .../{character_173.txt => character.173.txt} | 0 ...{character_1730.txt => character.1730.txt} | 0 ...{character_1731.txt => character.1731.txt} | 0 ...{character_1732.txt => character.1732.txt} | 0 ...{character_1733.txt => character.1733.txt} | 0 ...{character_1734.txt => character.1734.txt} | 0 ...{character_1735.txt => character.1735.txt} | 0 ...{character_1736.txt => character.1736.txt} | 0 ...{character_1737.txt => character.1737.txt} | 0 ...{character_1738.txt => character.1738.txt} | 0 ...{character_1739.txt => character.1739.txt} | 0 .../{character_174.txt => character.174.txt} | 0 ...{character_1740.txt => character.1740.txt} | 0 ...{character_1741.txt => character.1741.txt} | 0 ...{character_1742.txt => character.1742.txt} | 0 ...{character_1743.txt => character.1743.txt} | 0 ...{character_1744.txt => character.1744.txt} | 0 ...{character_1745.txt => character.1745.txt} | 0 ...{character_1746.txt => character.1746.txt} | 0 ...{character_1747.txt => character.1747.txt} | 0 ...{character_1748.txt => character.1748.txt} | 0 ...{character_1749.txt => character.1749.txt} | 0 .../{character_175.txt => character.175.txt} | 0 ...{character_1750.txt => character.1750.txt} | 0 ...{character_1751.txt => character.1751.txt} | 0 ...{character_1752.txt => character.1752.txt} | 0 ...{character_1753.txt => character.1753.txt} | 0 ...{character_1754.txt => character.1754.txt} | 0 ...{character_1755.txt => character.1755.txt} | 0 ...{character_1756.txt => character.1756.txt} | 0 ...{character_1757.txt => character.1757.txt} | 0 ...{character_1758.txt => character.1758.txt} | 0 ...{character_1759.txt => character.1759.txt} | 0 .../{character_176.txt => character.176.txt} | 0 ...{character_1760.txt => character.1760.txt} | 0 ...{character_1761.txt => character.1761.txt} | 0 ...{character_1762.txt => character.1762.txt} | 0 ...{character_1763.txt => character.1763.txt} | 0 ...{character_1764.txt => character.1764.txt} | 0 ...{character_1765.txt => character.1765.txt} | 0 ...{character_1766.txt => character.1766.txt} | 0 ...{character_1767.txt => character.1767.txt} | 0 ...{character_1768.txt => character.1768.txt} | 0 ...{character_1769.txt => character.1769.txt} | 0 .../{character_177.txt => character.177.txt} | 0 ...{character_1770.txt => character.1770.txt} | 0 ...{character_1771.txt => character.1771.txt} | 0 ...{character_1772.txt => character.1772.txt} | 0 ...{character_1773.txt => character.1773.txt} | 0 ...{character_1774.txt => character.1774.txt} | 0 ...{character_1775.txt => character.1775.txt} | 0 ...{character_1776.txt => character.1776.txt} | 0 ...{character_1778.txt => character.1778.txt} | 0 ...{character_1779.txt => character.1779.txt} | 0 .../{character_178.txt => character.178.txt} | 0 ...{character_1780.txt => character.1780.txt} | 0 ...{character_1781.txt => character.1781.txt} | 0 ...{character_1782.txt => character.1782.txt} | 0 ...{character_1783.txt => character.1783.txt} | 0 ...{character_1784.txt => character.1784.txt} | 0 ...{character_1785.txt => character.1785.txt} | 0 ...{character_1786.txt => character.1786.txt} | 0 ...{character_1787.txt => character.1787.txt} | 0 ...{character_1788.txt => character.1788.txt} | 0 ...{character_1789.txt => character.1789.txt} | 0 .../{character_179.txt => character.179.txt} | 0 ...{character_1790.txt => character.1790.txt} | 0 ...{character_1791.txt => character.1791.txt} | 0 ...{character_1792.txt => character.1792.txt} | 0 ...{character_1793.txt => character.1793.txt} | 0 ...{character_1794.txt => character.1794.txt} | 0 ...{character_1796.txt => character.1796.txt} | 0 ...{character_1797.txt => character.1797.txt} | 0 ...{character_1798.txt => character.1798.txt} | 0 ...{character_1799.txt => character.1799.txt} | 0 .../{character_180.txt => character.180.txt} | 0 ...{character_1800.txt => character.1800.txt} | 0 ...{character_1801.txt => character.1801.txt} | 0 ...{character_1802.txt => character.1802.txt} | 0 ...{character_1803.txt => character.1803.txt} | 0 ...{character_1804.txt => character.1804.txt} | 0 ...{character_1805.txt => character.1805.txt} | 0 ...{character_1806.txt => character.1806.txt} | 0 ...{character_1807.txt => character.1807.txt} | 0 ...{character_1808.txt => character.1808.txt} | 0 ...{character_1809.txt => character.1809.txt} | 0 .../{character_181.txt => character.181.txt} | 0 ...{character_1810.txt => character.1810.txt} | 0 ...{character_1811.txt => character.1811.txt} | 0 ...{character_1812.txt => character.1812.txt} | 0 ...{character_1813.txt => character.1813.txt} | 0 ...{character_1814.txt => character.1814.txt} | 0 ...{character_1815.txt => character.1815.txt} | 0 ...{character_1816.txt => character.1816.txt} | 0 ...{character_1817.txt => character.1817.txt} | 0 ...{character_1818.txt => character.1818.txt} | 0 ...{character_1819.txt => character.1819.txt} | 0 .../{character_182.txt => character.182.txt} | 0 ...{character_1820.txt => character.1820.txt} | 0 ...{character_1821.txt => character.1821.txt} | 0 ...{character_1822.txt => character.1822.txt} | 0 ...{character_1823.txt => character.1823.txt} | 0 ...{character_1824.txt => character.1824.txt} | 0 ...{character_1825.txt => character.1825.txt} | 0 ...{character_1826.txt => character.1826.txt} | 0 ...{character_1827.txt => character.1827.txt} | 0 ...{character_1828.txt => character.1828.txt} | 0 ...{character_1829.txt => character.1829.txt} | 0 .../{character_183.txt => character.183.txt} | 0 ...{character_1830.txt => character.1830.txt} | 0 ...{character_1831.txt => character.1831.txt} | 0 ...{character_1832.txt => character.1832.txt} | 0 ...{character_1833.txt => character.1833.txt} | 0 ...{character_1834.txt => character.1834.txt} | 0 ...{character_1835.txt => character.1835.txt} | 0 ...{character_1836.txt => character.1836.txt} | 0 ...{character_1837.txt => character.1837.txt} | 0 ...{character_1838.txt => character.1838.txt} | 0 ...{character_1839.txt => character.1839.txt} | 0 .../{character_184.txt => character.184.txt} | 0 ...{character_1840.txt => character.1840.txt} | 0 ...{character_1841.txt => character.1841.txt} | 0 ...{character_1842.txt => character.1842.txt} | 0 ...{character_1843.txt => character.1843.txt} | 0 ...{character_1844.txt => character.1844.txt} | 0 ...{character_1845.txt => character.1845.txt} | 0 ...{character_1846.txt => character.1846.txt} | 0 ...{character_1847.txt => character.1847.txt} | 0 ...{character_1848.txt => character.1848.txt} | 0 ...{character_1849.txt => character.1849.txt} | 0 .../{character_185.txt => character.185.txt} | 0 ...{character_1850.txt => character.1850.txt} | 0 ...{character_1851.txt => character.1851.txt} | 0 ...{character_1852.txt => character.1852.txt} | 0 ...{character_1853.txt => character.1853.txt} | 0 ...{character_1854.txt => character.1854.txt} | 0 ...{character_1855.txt => character.1855.txt} | 0 ...{character_1856.txt => character.1856.txt} | 0 ...{character_1857.txt => character.1857.txt} | 0 ...{character_1858.txt => character.1858.txt} | 0 ...{character_1859.txt => character.1859.txt} | 0 .../{character_186.txt => character.186.txt} | 0 ...{character_1860.txt => character.1860.txt} | 0 ...{character_1861.txt => character.1861.txt} | 0 ...{character_1862.txt => character.1862.txt} | 0 ...{character_1863.txt => character.1863.txt} | 0 ...{character_1864.txt => character.1864.txt} | 0 ...{character_1865.txt => character.1865.txt} | 0 ...{character_1866.txt => character.1866.txt} | 0 ...{character_1867.txt => character.1867.txt} | 0 ...{character_1868.txt => character.1868.txt} | 0 ...{character_1869.txt => character.1869.txt} | 0 .../{character_187.txt => character.187.txt} | 0 ...{character_1870.txt => character.1870.txt} | 0 ...{character_1871.txt => character.1871.txt} | 0 ...{character_1872.txt => character.1872.txt} | 0 ...{character_1873.txt => character.1873.txt} | 0 ...{character_1874.txt => character.1874.txt} | 0 ...{character_1875.txt => character.1875.txt} | 0 ...{character_1876.txt => character.1876.txt} | 0 ...{character_1877.txt => character.1877.txt} | 0 ...{character_1878.txt => character.1878.txt} | 0 ...{character_1879.txt => character.1879.txt} | 0 .../{character_188.txt => character.188.txt} | 0 ...{character_1880.txt => character.1880.txt} | 0 ...{character_1881.txt => character.1881.txt} | 0 ...{character_1882.txt => character.1882.txt} | 0 ...{character_1883.txt => character.1883.txt} | 0 ...{character_1884.txt => character.1884.txt} | 0 ...{character_1885.txt => character.1885.txt} | 0 ...{character_1886.txt => character.1886.txt} | 0 ...{character_1887.txt => character.1887.txt} | 0 ...{character_1888.txt => character.1888.txt} | 0 ...{character_1889.txt => character.1889.txt} | 0 .../{character_189.txt => character.189.txt} | 0 ...{character_1890.txt => character.1890.txt} | 0 ...{character_1891.txt => character.1891.txt} | 0 ...{character_1892.txt => character.1892.txt} | 0 ...{character_1893.txt => character.1893.txt} | 0 ...{character_1894.txt => character.1894.txt} | 0 ...{character_1895.txt => character.1895.txt} | 0 ...{character_1896.txt => character.1896.txt} | 0 ...{character_1897.txt => character.1897.txt} | 0 ...{character_1898.txt => character.1898.txt} | 0 ...{character_1899.txt => character.1899.txt} | 0 .../{character_19.txt => character.19.txt} | 0 .../{character_190.txt => character.190.txt} | 0 ...{character_1900.txt => character.1900.txt} | 0 ...{character_1901.txt => character.1901.txt} | 0 ...{character_1902.txt => character.1902.txt} | 0 ...{character_1903.txt => character.1903.txt} | 0 ...{character_1904.txt => character.1904.txt} | 0 ...{character_1905.txt => character.1905.txt} | 0 ...{character_1906.txt => character.1906.txt} | 0 ...{character_1907.txt => character.1907.txt} | 0 ...{character_1908.txt => character.1908.txt} | 0 ...{character_1909.txt => character.1909.txt} | 0 .../{character_191.txt => character.191.txt} | 0 ...{character_1910.txt => character.1910.txt} | 0 ...{character_1911.txt => character.1911.txt} | 0 ...{character_1912.txt => character.1912.txt} | 0 ...{character_1913.txt => character.1913.txt} | 0 ...{character_1914.txt => character.1914.txt} | 0 ...{character_1915.txt => character.1915.txt} | 0 ...{character_1916.txt => character.1916.txt} | 0 ...{character_1917.txt => character.1917.txt} | 0 ...{character_1918.txt => character.1918.txt} | 0 ...{character_1919.txt => character.1919.txt} | 0 .../{character_192.txt => character.192.txt} | 0 ...{character_1920.txt => character.1920.txt} | 0 ...{character_1921.txt => character.1921.txt} | 0 ...{character_1922.txt => character.1922.txt} | 0 ...{character_1923.txt => character.1923.txt} | 0 ...{character_1924.txt => character.1924.txt} | 0 ...{character_1925.txt => character.1925.txt} | 0 ...{character_1926.txt => character.1926.txt} | 0 ...{character_1927.txt => character.1927.txt} | 0 ...{character_1928.txt => character.1928.txt} | 0 ...{character_1929.txt => character.1929.txt} | 0 .../{character_193.txt => character.193.txt} | 0 ...{character_1930.txt => character.1930.txt} | 0 ...{character_1931.txt => character.1931.txt} | 0 ...{character_1932.txt => character.1932.txt} | 0 ...{character_1933.txt => character.1933.txt} | 0 ...{character_1934.txt => character.1934.txt} | 0 ...{character_1935.txt => character.1935.txt} | 0 ...{character_1937.txt => character.1937.txt} | 0 ...{character_1938.txt => character.1938.txt} | 0 ...{character_1939.txt => character.1939.txt} | 0 .../{character_194.txt => character.194.txt} | 0 ...{character_1940.txt => character.1940.txt} | 0 ...{character_1941.txt => character.1941.txt} | 0 ...{character_1942.txt => character.1942.txt} | 0 ...{character_1943.txt => character.1943.txt} | 0 ...{character_1944.txt => character.1944.txt} | 0 ...{character_1945.txt => character.1945.txt} | 0 ...{character_1946.txt => character.1946.txt} | 0 ...{character_1947.txt => character.1947.txt} | 0 ...{character_1948.txt => character.1948.txt} | 0 ...{character_1949.txt => character.1949.txt} | 0 .../{character_195.txt => character.195.txt} | 0 ...{character_1950.txt => character.1950.txt} | 0 ...{character_1951.txt => character.1951.txt} | 0 ...{character_1952.txt => character.1952.txt} | 0 ...{character_1953.txt => character.1953.txt} | 0 ...{character_1954.txt => character.1954.txt} | 0 ...{character_1955.txt => character.1955.txt} | 0 ...{character_1956.txt => character.1956.txt} | 0 ...{character_1957.txt => character.1957.txt} | 0 ...{character_1958.txt => character.1958.txt} | 0 ...{character_1959.txt => character.1959.txt} | 0 .../{character_196.txt => character.196.txt} | 0 ...{character_1960.txt => character.1960.txt} | 0 ...{character_1961.txt => character.1961.txt} | 0 ...{character_1962.txt => character.1962.txt} | 0 ...{character_1963.txt => character.1963.txt} | 0 ...{character_1964.txt => character.1964.txt} | 0 ...{character_1965.txt => character.1965.txt} | 0 ...{character_1966.txt => character.1966.txt} | 0 ...{character_1967.txt => character.1967.txt} | 0 ...{character_1968.txt => character.1968.txt} | 0 ...{character_1969.txt => character.1969.txt} | 0 .../{character_197.txt => character.197.txt} | 0 ...{character_1970.txt => character.1970.txt} | 0 ...{character_1971.txt => character.1971.txt} | 0 ...{character_1972.txt => character.1972.txt} | 0 ...{character_1973.txt => character.1973.txt} | 0 ...{character_1974.txt => character.1974.txt} | 0 ...{character_1975.txt => character.1975.txt} | 0 ...{character_1976.txt => character.1976.txt} | 0 ...{character_1977.txt => character.1977.txt} | 0 ...{character_1978.txt => character.1978.txt} | 0 ...{character_1979.txt => character.1979.txt} | 0 .../{character_198.txt => character.198.txt} | 0 ...{character_1980.txt => character.1980.txt} | 0 ...{character_1981.txt => character.1981.txt} | 0 ...{character_1982.txt => character.1982.txt} | 0 ...{character_1983.txt => character.1983.txt} | 0 ...{character_1984.txt => character.1984.txt} | 0 ...{character_1985.txt => character.1985.txt} | 0 ...{character_1986.txt => character.1986.txt} | 0 ...{character_1987.txt => character.1987.txt} | 0 ...{character_1988.txt => character.1988.txt} | 0 ...{character_1989.txt => character.1989.txt} | 0 .../{character_199.txt => character.199.txt} | 0 ...{character_1990.txt => character.1990.txt} | 0 ...{character_1991.txt => character.1991.txt} | 0 ...{character_1992.txt => character.1992.txt} | 0 ...{character_1993.txt => character.1993.txt} | 0 ...{character_1994.txt => character.1994.txt} | 0 ...{character_1995.txt => character.1995.txt} | 0 ...{character_1996.txt => character.1996.txt} | 0 ...{character_1997.txt => character.1997.txt} | 0 ...{character_1998.txt => character.1998.txt} | 0 ...{character_1999.txt => character.1999.txt} | 0 .../meta/{character_2.txt => character.2.txt} | 0 .../{character_20.txt => character.20.txt} | 0 .../{character_200.txt => character.200.txt} | 0 ...{character_2000.txt => character.2000.txt} | 0 ...{character_2001.txt => character.2001.txt} | 0 ...{character_2002.txt => character.2002.txt} | 0 ...{character_2003.txt => character.2003.txt} | 0 ...{character_2004.txt => character.2004.txt} | 0 ...{character_2005.txt => character.2005.txt} | 0 ...{character_2006.txt => character.2006.txt} | 0 ...{character_2007.txt => character.2007.txt} | 0 ...{character_2008.txt => character.2008.txt} | 0 ...{character_2009.txt => character.2009.txt} | 0 .../{character_201.txt => character.201.txt} | 0 ...{character_2010.txt => character.2010.txt} | 0 ...{character_2011.txt => character.2011.txt} | 0 ...{character_2012.txt => character.2012.txt} | 0 ...{character_2013.txt => character.2013.txt} | 0 ...{character_2014.txt => character.2014.txt} | 0 ...{character_2015.txt => character.2015.txt} | 0 ...{character_2016.txt => character.2016.txt} | 0 ...{character_2017.txt => character.2017.txt} | 0 ...{character_2018.txt => character.2018.txt} | 0 ...{character_2019.txt => character.2019.txt} | 0 ...{character_2020.txt => character.2020.txt} | 0 ...{character_2021.txt => character.2021.txt} | 0 ...{character_2022.txt => character.2022.txt} | 0 ...{character_2023.txt => character.2023.txt} | 2 +- ...{character_2024.txt => character.2024.txt} | 0 ...{character_2025.txt => character.2025.txt} | 0 ...{character_2026.txt => character.2026.txt} | 0 ...{character_2027.txt => character.2027.txt} | 0 ...{character_2028.txt => character.2028.txt} | 0 ...{character_2029.txt => character.2029.txt} | 0 .../{character_203.txt => character.203.txt} | 0 ...{character_2030.txt => character.2030.txt} | 0 ...{character_2031.txt => character.2031.txt} | 0 ...{character_2032.txt => character.2032.txt} | 0 ...{character_2033.txt => character.2033.txt} | 0 ...{character_2034.txt => character.2034.txt} | 0 ...{character_2035.txt => character.2035.txt} | 0 ...{character_2036.txt => character.2036.txt} | 0 ...{character_2037.txt => character.2037.txt} | 0 ...{character_2038.txt => character.2038.txt} | 0 ...{character_2039.txt => character.2039.txt} | 0 ...{character_2040.txt => character.2040.txt} | 0 ...{character_2041.txt => character.2041.txt} | 0 ...{character_2042.txt => character.2042.txt} | 0 ...{character_2043.txt => character.2043.txt} | 0 ...{character_2044.txt => character.2044.txt} | 0 ...{character_2045.txt => character.2045.txt} | 0 ...{character_2046.txt => character.2046.txt} | 0 ...{character_2047.txt => character.2047.txt} | 0 ...{character_2048.txt => character.2048.txt} | 0 ...{character_2049.txt => character.2049.txt} | 0 .../{character_205.txt => character.205.txt} | 0 ...{character_2050.txt => character.2050.txt} | 0 ...{character_2051.txt => character.2051.txt} | 0 ...{character_2052.txt => character.2052.txt} | 2 +- ...{character_2053.txt => character.2053.txt} | 0 ...{character_2054.txt => character.2054.txt} | 0 ...{character_2055.txt => character.2055.txt} | 0 ...{character_2056.txt => character.2056.txt} | 0 ...{character_2057.txt => character.2057.txt} | 0 ...{character_2058.txt => character.2058.txt} | 0 ...{character_2059.txt => character.2059.txt} | 0 .../{character_206.txt => character.206.txt} | 0 ...{character_2060.txt => character.2060.txt} | 0 ...{character_2061.txt => character.2061.txt} | 0 ...{character_2062.txt => character.2062.txt} | 0 ...{character_2063.txt => character.2063.txt} | 0 ...{character_2064.txt => character.2064.txt} | 0 ...{character_2065.txt => character.2065.txt} | 0 ...{character_2066.txt => character.2066.txt} | 0 ...{character_2067.txt => character.2067.txt} | 0 ...{character_2068.txt => character.2068.txt} | 0 ...{character_2069.txt => character.2069.txt} | 0 .../{character_207.txt => character.207.txt} | 0 ...{character_2070.txt => character.2070.txt} | 0 ...{character_2071.txt => character.2071.txt} | 0 ...{character_2072.txt => character.2072.txt} | 0 ...{character_2073.txt => character.2073.txt} | 0 ...{character_2074.txt => character.2074.txt} | 0 ...{character_2075.txt => character.2075.txt} | 0 ...{character_2076.txt => character.2076.txt} | 0 ...{character_2077.txt => character.2077.txt} | 0 ...{character_2078.txt => character.2078.txt} | 0 ...{character_2079.txt => character.2079.txt} | 0 .../{character_208.txt => character.208.txt} | 0 ...{character_2080.txt => character.2080.txt} | 0 ...{character_2081.txt => character.2081.txt} | 0 ...{character_2082.txt => character.2082.txt} | 0 ...{character_2083.txt => character.2083.txt} | 0 ...{character_2084.txt => character.2084.txt} | 0 ...{character_2085.txt => character.2085.txt} | 0 ...{character_2086.txt => character.2086.txt} | 0 ...{character_2087.txt => character.2087.txt} | 0 ...{character_2088.txt => character.2088.txt} | 0 ...{character_2089.txt => character.2089.txt} | 0 .../{character_209.txt => character.209.txt} | 0 ...{character_2090.txt => character.2090.txt} | 0 ...{character_2091.txt => character.2091.txt} | 0 ...{character_2092.txt => character.2092.txt} | 0 ...{character_2093.txt => character.2093.txt} | 0 ...{character_2094.txt => character.2094.txt} | 0 ...{character_2095.txt => character.2095.txt} | 0 ...{character_2096.txt => character.2096.txt} | 0 ...{character_2097.txt => character.2097.txt} | 0 ...{character_2098.txt => character.2098.txt} | 0 ...{character_2099.txt => character.2099.txt} | 0 .../{character_21.txt => character.21.txt} | 0 .../{character_210.txt => character.210.txt} | 0 ...{character_2100.txt => character.2100.txt} | 0 ...{character_2101.txt => character.2101.txt} | 0 ...{character_2102.txt => character.2102.txt} | 0 ...{character_2103.txt => character.2103.txt} | 0 ...{character_2104.txt => character.2104.txt} | 0 ...{character_2105.txt => character.2105.txt} | 0 ...{character_2106.txt => character.2106.txt} | 0 ...{character_2107.txt => character.2107.txt} | 0 ...{character_2108.txt => character.2108.txt} | 0 ...{character_2109.txt => character.2109.txt} | 0 .../{character_211.txt => character.211.txt} | 0 ...{character_2110.txt => character.2110.txt} | 0 ...{character_2111.txt => character.2111.txt} | 0 ...{character_2112.txt => character.2112.txt} | 0 ...{character_2114.txt => character.2114.txt} | 0 ...{character_2115.txt => character.2115.txt} | 0 ...{character_2116.txt => character.2116.txt} | 0 ...{character_2117.txt => character.2117.txt} | 0 ...{character_2118.txt => character.2118.txt} | 0 ...{character_2119.txt => character.2119.txt} | 0 .../{character_212.txt => character.212.txt} | 0 ...{character_2120.txt => character.2120.txt} | 0 ...{character_2121.txt => character.2121.txt} | 0 ...{character_2122.txt => character.2122.txt} | 0 ...{character_2123.txt => character.2123.txt} | 0 ...{character_2124.txt => character.2124.txt} | 0 ...{character_2125.txt => character.2125.txt} | 0 ...{character_2126.txt => character.2126.txt} | 0 ...{character_2127.txt => character.2127.txt} | 0 ...{character_2128.txt => character.2128.txt} | 0 ...{character_2129.txt => character.2129.txt} | 0 .../{character_213.txt => character.213.txt} | 0 ...{character_2130.txt => character.2130.txt} | 0 ...{character_2131.txt => character.2131.txt} | 0 ...{character_2132.txt => character.2132.txt} | 0 ...{character_2133.txt => character.2133.txt} | 0 ...{character_2134.txt => character.2134.txt} | 0 ...{character_2135.txt => character.2135.txt} | 0 ...{character_2136.txt => character.2136.txt} | 0 ...{character_2137.txt => character.2137.txt} | 0 ...{character_2138.txt => character.2138.txt} | 0 ...{character_2139.txt => character.2139.txt} | 0 .../{character_214.txt => character.214.txt} | 0 ...{character_2140.txt => character.2140.txt} | 0 ...{character_2141.txt => character.2141.txt} | 0 ...{character_2142.txt => character.2142.txt} | 0 ...{character_2143.txt => character.2143.txt} | 0 ...{character_2144.txt => character.2144.txt} | 0 ...{character_2145.txt => character.2145.txt} | 0 ...{character_2146.txt => character.2146.txt} | 0 ...{character_2147.txt => character.2147.txt} | 0 ...{character_2148.txt => character.2148.txt} | 0 ...{character_2149.txt => character.2149.txt} | 0 .../{character_215.txt => character.215.txt} | 0 ...{character_2150.txt => character.2150.txt} | 0 ...{character_2151.txt => character.2151.txt} | 0 ...{character_2152.txt => character.2152.txt} | 0 ...{character_2153.txt => character.2153.txt} | 0 mods/skinsdb/meta/character.2154.txt | 3 + mods/skinsdb/meta/character.2155.txt | 3 + mods/skinsdb/meta/character.2156.txt | 3 + mods/skinsdb/meta/character.2157.txt | 3 + mods/skinsdb/meta/character.2158.txt | 3 + mods/skinsdb/meta/character.2159.txt | 3 + .../{character_216.txt => character.216.txt} | 0 mods/skinsdb/meta/character.2160.txt | 3 + mods/skinsdb/meta/character.2161.txt | 3 + mods/skinsdb/meta/character.2162.txt | 3 + mods/skinsdb/meta/character.2163.txt | 3 + mods/skinsdb/meta/character.2164.txt | 3 + mods/skinsdb/meta/character.2165.txt | 3 + mods/skinsdb/meta/character.2166.txt | 3 + mods/skinsdb/meta/character.2167.txt | 3 + mods/skinsdb/meta/character.2168.txt | 3 + mods/skinsdb/meta/character.2169.txt | 3 + .../{character_217.txt => character.217.txt} | 0 mods/skinsdb/meta/character.2170.txt | 3 + mods/skinsdb/meta/character.2171.txt | 3 + mods/skinsdb/meta/character.2172.txt | 3 + mods/skinsdb/meta/character.2173.txt | 3 + mods/skinsdb/meta/character.2174.txt | 3 + mods/skinsdb/meta/character.2175.txt | 3 + mods/skinsdb/meta/character.2176.txt | 3 + mods/skinsdb/meta/character.2177.txt | 3 + mods/skinsdb/meta/character.2178.txt | 3 + mods/skinsdb/meta/character.2179.txt | 3 + .../{character_218.txt => character.218.txt} | 0 mods/skinsdb/meta/character.2180.txt | 3 + mods/skinsdb/meta/character.2181.txt | 3 + mods/skinsdb/meta/character.2182.txt | 3 + mods/skinsdb/meta/character.2183.txt | 3 + mods/skinsdb/meta/character.2184.txt | 3 + mods/skinsdb/meta/character.2185.txt | 3 + mods/skinsdb/meta/character.2186.txt | 3 + mods/skinsdb/meta/character.2187.txt | 3 + mods/skinsdb/meta/character.2188.txt | 3 + mods/skinsdb/meta/character.2189.txt | 3 + .../{character_219.txt => character.219.txt} | 0 mods/skinsdb/meta/character.2190.txt | 3 + mods/skinsdb/meta/character.2191.txt | 3 + mods/skinsdb/meta/character.2192.txt | 3 + mods/skinsdb/meta/character.2193.txt | 3 + mods/skinsdb/meta/character.2194.txt | 3 + mods/skinsdb/meta/character.2195.txt | 3 + mods/skinsdb/meta/character.2196.txt | 3 + mods/skinsdb/meta/character.2197.txt | 3 + mods/skinsdb/meta/character.2198.txt | 3 + mods/skinsdb/meta/character.2199.txt | 3 + .../{character_22.txt => character.22.txt} | 0 .../{character_220.txt => character.220.txt} | 0 mods/skinsdb/meta/character.2200.txt | 3 + mods/skinsdb/meta/character.2201.txt | 3 + mods/skinsdb/meta/character.2202.txt | 3 + mods/skinsdb/meta/character.2203.txt | 3 + mods/skinsdb/meta/character.2204.txt | 3 + mods/skinsdb/meta/character.2205.txt | 3 + mods/skinsdb/meta/character.2206.txt | 3 + mods/skinsdb/meta/character.2207.txt | 3 + mods/skinsdb/meta/character.2208.txt | 3 + mods/skinsdb/meta/character.2209.txt | 3 + .../{character_221.txt => character.221.txt} | 0 mods/skinsdb/meta/character.2210.txt | 3 + mods/skinsdb/meta/character.2211.txt | 3 + mods/skinsdb/meta/character.2212.txt | 3 + mods/skinsdb/meta/character.2213.txt | 3 + mods/skinsdb/meta/character.2214.txt | 3 + mods/skinsdb/meta/character.2215.txt | 3 + mods/skinsdb/meta/character.2216.txt | 3 + mods/skinsdb/meta/character.2217.txt | 3 + mods/skinsdb/meta/character.2218.txt | 3 + mods/skinsdb/meta/character.2219.txt | 3 + .../{character_222.txt => character.222.txt} | 0 mods/skinsdb/meta/character.2220.txt | 3 + mods/skinsdb/meta/character.2221.txt | 3 + mods/skinsdb/meta/character.2222.txt | 3 + mods/skinsdb/meta/character.2223.txt | 3 + mods/skinsdb/meta/character.2224.txt | 3 + mods/skinsdb/meta/character.2225.txt | 3 + mods/skinsdb/meta/character.2226.txt | 3 + mods/skinsdb/meta/character.2227.txt | 3 + mods/skinsdb/meta/character.2228.txt | 3 + mods/skinsdb/meta/character.2229.txt | 3 + .../{character_223.txt => character.223.txt} | 0 mods/skinsdb/meta/character.2230.txt | 3 + mods/skinsdb/meta/character.2231.txt | 3 + mods/skinsdb/meta/character.2232.txt | 3 + mods/skinsdb/meta/character.2233.txt | 3 + mods/skinsdb/meta/character.2234.txt | 3 + mods/skinsdb/meta/character.2235.txt | 3 + mods/skinsdb/meta/character.2236.txt | 3 + mods/skinsdb/meta/character.2237.txt | 3 + mods/skinsdb/meta/character.2238.txt | 3 + mods/skinsdb/meta/character.2239.txt | 3 + .../{character_224.txt => character.224.txt} | 2 +- mods/skinsdb/meta/character.2240.txt | 3 + mods/skinsdb/meta/character.2241.txt | 3 + mods/skinsdb/meta/character.2242.txt | 3 + mods/skinsdb/meta/character.2243.txt | 3 + mods/skinsdb/meta/character.2244.txt | 3 + mods/skinsdb/meta/character.2245.txt | 3 + mods/skinsdb/meta/character.2246.txt | 3 + mods/skinsdb/meta/character.2247.txt | 3 + mods/skinsdb/meta/character.2248.txt | 3 + mods/skinsdb/meta/character.2249.txt | 3 + .../{character_225.txt => character.225.txt} | 0 mods/skinsdb/meta/character.2250.txt | 3 + mods/skinsdb/meta/character.2251.txt | 3 + mods/skinsdb/meta/character.2252.txt | 3 + mods/skinsdb/meta/character.2253.txt | 3 + mods/skinsdb/meta/character.2254.txt | 3 + mods/skinsdb/meta/character.2255.txt | 3 + mods/skinsdb/meta/character.2256.txt | 3 + mods/skinsdb/meta/character.2257.txt | 3 + mods/skinsdb/meta/character.2258.txt | 3 + mods/skinsdb/meta/character.2259.txt | 3 + mods/skinsdb/meta/character.2260.txt | 3 + mods/skinsdb/meta/character.2261.txt | 3 + mods/skinsdb/meta/character.2262.txt | 3 + mods/skinsdb/meta/character.2263.txt | 3 + mods/skinsdb/meta/character.2264.txt | 3 + mods/skinsdb/meta/character.2277.txt | 3 + mods/skinsdb/meta/character.2278.txt | 3 + mods/skinsdb/meta/character.2279.txt | 3 + .../{character_228.txt => character.228.txt} | 0 mods/skinsdb/meta/character.2280.txt | 3 + mods/skinsdb/meta/character.2281.txt | 3 + mods/skinsdb/meta/character.2282.txt | 3 + mods/skinsdb/meta/character.2283.txt | 3 + mods/skinsdb/meta/character.2284.txt | 3 + mods/skinsdb/meta/character.2285.txt | 3 + mods/skinsdb/meta/character.2286.txt | 3 + mods/skinsdb/meta/character.2287.txt | 3 + mods/skinsdb/meta/character.2288.txt | 3 + mods/skinsdb/meta/character.2289.txt | 3 + .../{character_229.txt => character.229.txt} | 0 mods/skinsdb/meta/character.2290.txt | 3 + mods/skinsdb/meta/character.2291.txt | 3 + mods/skinsdb/meta/character.2292.txt | 3 + mods/skinsdb/meta/character.2293.txt | 3 + mods/skinsdb/meta/character.2294.txt | 3 + mods/skinsdb/meta/character.2295.txt | 3 + mods/skinsdb/meta/character.2296.txt | 3 + mods/skinsdb/meta/character.2297.txt | 3 + mods/skinsdb/meta/character.2298.txt | 3 + mods/skinsdb/meta/character.2299.txt | 3 + .../{character_230.txt => character.230.txt} | 0 mods/skinsdb/meta/character.2300.txt | 3 + mods/skinsdb/meta/character.2301.txt | 3 + mods/skinsdb/meta/character.2302.txt | 3 + mods/skinsdb/meta/character.2303.txt | 3 + mods/skinsdb/meta/character.2304.txt | 3 + mods/skinsdb/meta/character.2305.txt | 3 + mods/skinsdb/meta/character.2306.txt | 3 + mods/skinsdb/meta/character.2307.txt | 3 + mods/skinsdb/meta/character.2308.txt | 3 + mods/skinsdb/meta/character.2309.txt | 3 + .../{character_231.txt => character.231.txt} | 0 mods/skinsdb/meta/character.2310.txt | 3 + mods/skinsdb/meta/character.2311.txt | 3 + mods/skinsdb/meta/character.2312.txt | 3 + mods/skinsdb/meta/character.2313.txt | 3 + mods/skinsdb/meta/character.2314.txt | 3 + mods/skinsdb/meta/character.2315.txt | 3 + mods/skinsdb/meta/character.2316.txt | 3 + mods/skinsdb/meta/character.2317.txt | 3 + mods/skinsdb/meta/character.2318.txt | 3 + mods/skinsdb/meta/character.2319.txt | 3 + .../{character_232.txt => character.232.txt} | 0 mods/skinsdb/meta/character.2320.txt | 3 + mods/skinsdb/meta/character.2321.txt | 3 + mods/skinsdb/meta/character.2322.txt | 3 + mods/skinsdb/meta/character.2323.txt | 3 + mods/skinsdb/meta/character.2324.txt | 3 + mods/skinsdb/meta/character.2325.txt | 3 + mods/skinsdb/meta/character.2326.txt | 3 + mods/skinsdb/meta/character.2327.txt | 3 + mods/skinsdb/meta/character.2328.txt | 3 + mods/skinsdb/meta/character.2329.txt | 3 + .../{character_233.txt => character.233.txt} | 0 mods/skinsdb/meta/character.2330.txt | 3 + mods/skinsdb/meta/character.2331.txt | 3 + mods/skinsdb/meta/character.2332.txt | 3 + mods/skinsdb/meta/character.2333.txt | 3 + mods/skinsdb/meta/character.2334.txt | 3 + mods/skinsdb/meta/character.2335.txt | 3 + mods/skinsdb/meta/character.2336.txt | 3 + mods/skinsdb/meta/character.2337.txt | 3 + mods/skinsdb/meta/character.2338.txt | 3 + mods/skinsdb/meta/character.2339.txt | 3 + .../{character_234.txt => character.234.txt} | 0 mods/skinsdb/meta/character.2340.txt | 3 + mods/skinsdb/meta/character.2341.txt | 3 + mods/skinsdb/meta/character.2342.txt | 3 + mods/skinsdb/meta/character.2343.txt | 3 + mods/skinsdb/meta/character.2344.txt | 3 + mods/skinsdb/meta/character.2345.txt | 3 + mods/skinsdb/meta/character.2346.txt | 3 + mods/skinsdb/meta/character.2347.txt | 3 + mods/skinsdb/meta/character.2348.txt | 3 + mods/skinsdb/meta/character.2349.txt | 3 + .../{character_235.txt => character.235.txt} | 0 mods/skinsdb/meta/character.2350.txt | 3 + mods/skinsdb/meta/character.2351.txt | 3 + .../{character_237.txt => character.237.txt} | 0 .../{character_239.txt => character.239.txt} | 0 .../{character_24.txt => character.24.txt} | 0 .../{character_241.txt => character.241.txt} | 0 .../{character_242.txt => character.242.txt} | 0 .../{character_243.txt => character.243.txt} | 0 .../{character_244.txt => character.244.txt} | 0 .../{character_245.txt => character.245.txt} | 0 .../{character_246.txt => character.246.txt} | 0 .../{character_247.txt => character.247.txt} | 0 .../{character_248.txt => character.248.txt} | 0 .../{character_249.txt => character.249.txt} | 0 .../{character_25.txt => character.25.txt} | 0 .../{character_250.txt => character.250.txt} | 0 .../{character_251.txt => character.251.txt} | 0 .../{character_252.txt => character.252.txt} | 0 .../{character_253.txt => character.253.txt} | 0 .../{character_254.txt => character.254.txt} | 0 .../{character_255.txt => character.255.txt} | 0 .../{character_256.txt => character.256.txt} | 0 .../{character_257.txt => character.257.txt} | 0 .../{character_258.txt => character.258.txt} | 0 .../{character_259.txt => character.259.txt} | 0 .../{character_26.txt => character.26.txt} | 0 .../{character_260.txt => character.260.txt} | 0 .../{character_261.txt => character.261.txt} | 0 .../{character_262.txt => character.262.txt} | 0 .../{character_263.txt => character.263.txt} | 0 .../{character_264.txt => character.264.txt} | 0 .../{character_265.txt => character.265.txt} | 0 .../{character_266.txt => character.266.txt} | 0 .../{character_267.txt => character.267.txt} | 0 .../{character_268.txt => character.268.txt} | 0 .../{character_269.txt => character.269.txt} | 0 .../{character_27.txt => character.27.txt} | 0 .../{character_270.txt => character.270.txt} | 0 .../{character_271.txt => character.271.txt} | 0 .../{character_272.txt => character.272.txt} | 0 .../{character_273.txt => character.273.txt} | 0 .../{character_274.txt => character.274.txt} | 0 .../{character_275.txt => character.275.txt} | 0 .../{character_276.txt => character.276.txt} | 0 .../{character_277.txt => character.277.txt} | 0 .../{character_278.txt => character.278.txt} | 0 .../{character_279.txt => character.279.txt} | 0 .../{character_28.txt => character.28.txt} | 0 .../{character_280.txt => character.280.txt} | 0 .../{character_281.txt => character.281.txt} | 0 .../{character_282.txt => character.282.txt} | 0 .../{character_283.txt => character.283.txt} | 0 .../{character_284.txt => character.284.txt} | 0 .../{character_285.txt => character.285.txt} | 0 .../{character_286.txt => character.286.txt} | 0 .../{character_287.txt => character.287.txt} | 0 .../{character_288.txt => character.288.txt} | 0 .../{character_289.txt => character.289.txt} | 0 .../{character_29.txt => character.29.txt} | 0 .../{character_290.txt => character.290.txt} | 0 .../{character_291.txt => character.291.txt} | 0 .../{character_292.txt => character.292.txt} | 0 .../{character_295.txt => character.295.txt} | 0 .../{character_297.txt => character.297.txt} | 0 .../{character_299.txt => character.299.txt} | 0 .../meta/{character_3.txt => character.3.txt} | 0 .../{character_30.txt => character.30.txt} | 0 .../{character_300.txt => character.300.txt} | 0 .../{character_301.txt => character.301.txt} | 0 .../{character_302.txt => character.302.txt} | 0 .../{character_303.txt => character.303.txt} | 0 .../{character_304.txt => character.304.txt} | 0 .../{character_305.txt => character.305.txt} | 0 .../{character_306.txt => character.306.txt} | 0 .../{character_307.txt => character.307.txt} | 0 .../{character_308.txt => character.308.txt} | 0 .../{character_309.txt => character.309.txt} | 0 .../{character_31.txt => character.31.txt} | 0 .../{character_310.txt => character.310.txt} | 0 .../{character_311.txt => character.311.txt} | 0 .../{character_312.txt => character.312.txt} | 0 .../{character_313.txt => character.313.txt} | 2 +- .../{character_314.txt => character.314.txt} | 0 .../{character_315.txt => character.315.txt} | 0 .../{character_316.txt => character.316.txt} | 0 .../{character_317.txt => character.317.txt} | 0 .../{character_318.txt => character.318.txt} | 0 .../{character_319.txt => character.319.txt} | 0 .../{character_320.txt => character.320.txt} | 0 .../{character_321.txt => character.321.txt} | 0 .../{character_322.txt => character.322.txt} | 0 .../{character_323.txt => character.323.txt} | 0 .../{character_324.txt => character.324.txt} | 0 .../{character_325.txt => character.325.txt} | 0 .../{character_326.txt => character.326.txt} | 0 .../{character_327.txt => character.327.txt} | 0 .../{character_328.txt => character.328.txt} | 0 .../{character_329.txt => character.329.txt} | 0 .../{character_330.txt => character.330.txt} | 0 .../{character_331.txt => character.331.txt} | 0 .../{character_332.txt => character.332.txt} | 0 .../{character_333.txt => character.333.txt} | 0 .../{character_334.txt => character.334.txt} | 0 .../{character_335.txt => character.335.txt} | 0 .../{character_336.txt => character.336.txt} | 0 .../{character_337.txt => character.337.txt} | 0 .../{character_338.txt => character.338.txt} | 0 .../{character_339.txt => character.339.txt} | 0 .../{character_34.txt => character.34.txt} | 0 .../{character_340.txt => character.340.txt} | 0 .../{character_341.txt => character.341.txt} | 0 .../{character_342.txt => character.342.txt} | 0 .../{character_344.txt => character.344.txt} | 0 .../{character_349.txt => character.349.txt} | 0 .../{character_35.txt => character.35.txt} | 0 .../{character_352.txt => character.352.txt} | 0 .../{character_353.txt => character.353.txt} | 0 .../{character_356.txt => character.356.txt} | 0 .../{character_357.txt => character.357.txt} | 0 .../{character_359.txt => character.359.txt} | 0 .../{character_36.txt => character.36.txt} | 0 .../{character_361.txt => character.361.txt} | 0 .../{character_362.txt => character.362.txt} | 0 .../{character_363.txt => character.363.txt} | 0 .../{character_364.txt => character.364.txt} | 0 .../{character_365.txt => character.365.txt} | 0 .../{character_366.txt => character.366.txt} | 0 .../{character_367.txt => character.367.txt} | 0 .../{character_368.txt => character.368.txt} | 0 .../{character_369.txt => character.369.txt} | 0 .../{character_37.txt => character.37.txt} | 0 .../{character_370.txt => character.370.txt} | 0 .../{character_371.txt => character.371.txt} | 0 .../{character_372.txt => character.372.txt} | 0 .../{character_373.txt => character.373.txt} | 0 .../{character_374.txt => character.374.txt} | 0 .../{character_375.txt => character.375.txt} | 0 .../{character_376.txt => character.376.txt} | 0 .../{character_377.txt => character.377.txt} | 0 .../{character_378.txt => character.378.txt} | 0 .../{character_379.txt => character.379.txt} | 0 .../{character_380.txt => character.380.txt} | 0 .../{character_381.txt => character.381.txt} | 0 .../{character_382.txt => character.382.txt} | 0 .../{character_383.txt => character.383.txt} | 0 .../{character_384.txt => character.384.txt} | 0 .../{character_385.txt => character.385.txt} | 0 .../{character_387.txt => character.387.txt} | 0 .../{character_389.txt => character.389.txt} | 0 .../{character_390.txt => character.390.txt} | 0 .../{character_392.txt => character.392.txt} | 0 .../{character_393.txt => character.393.txt} | 0 .../{character_396.txt => character.396.txt} | 0 .../{character_399.txt => character.399.txt} | 0 .../meta/{character_4.txt => character.4.txt} | 0 .../{character_400.txt => character.400.txt} | 0 .../{character_401.txt => character.401.txt} | 0 .../{character_402.txt => character.402.txt} | 0 .../{character_403.txt => character.403.txt} | 0 .../{character_404.txt => character.404.txt} | 0 .../{character_405.txt => character.405.txt} | 0 .../{character_406.txt => character.406.txt} | 0 .../{character_407.txt => character.407.txt} | 0 .../{character_408.txt => character.408.txt} | 0 .../{character_409.txt => character.409.txt} | 0 .../{character_410.txt => character.410.txt} | 0 .../{character_411.txt => character.411.txt} | 0 .../{character_412.txt => character.412.txt} | 0 .../{character_413.txt => character.413.txt} | 0 .../{character_414.txt => character.414.txt} | 0 .../{character_415.txt => character.415.txt} | 0 .../{character_416.txt => character.416.txt} | 0 .../{character_417.txt => character.417.txt} | 0 .../{character_418.txt => character.418.txt} | 0 .../{character_419.txt => character.419.txt} | 0 .../{character_420.txt => character.420.txt} | 0 .../{character_421.txt => character.421.txt} | 0 .../{character_428.txt => character.428.txt} | 0 .../{character_429.txt => character.429.txt} | 0 .../{character_430.txt => character.430.txt} | 0 .../{character_431.txt => character.431.txt} | 0 .../{character_432.txt => character.432.txt} | 0 .../{character_433.txt => character.433.txt} | 0 .../{character_434.txt => character.434.txt} | 0 .../{character_435.txt => character.435.txt} | 0 .../{character_436.txt => character.436.txt} | 0 .../{character_437.txt => character.437.txt} | 0 .../{character_438.txt => character.438.txt} | 0 .../{character_439.txt => character.439.txt} | 0 .../{character_440.txt => character.440.txt} | 0 .../{character_441.txt => character.441.txt} | 0 .../{character_442.txt => character.442.txt} | 0 .../{character_443.txt => character.443.txt} | 0 .../{character_444.txt => character.444.txt} | 0 .../{character_445.txt => character.445.txt} | 0 .../{character_446.txt => character.446.txt} | 0 .../{character_447.txt => character.447.txt} | 0 .../{character_448.txt => character.448.txt} | 0 .../{character_449.txt => character.449.txt} | 0 .../{character_450.txt => character.450.txt} | 0 .../{character_451.txt => character.451.txt} | 0 .../{character_452.txt => character.452.txt} | 0 .../{character_453.txt => character.453.txt} | 0 .../{character_454.txt => character.454.txt} | 0 .../{character_456.txt => character.456.txt} | 0 .../{character_457.txt => character.457.txt} | 0 .../{character_458.txt => character.458.txt} | 0 .../{character_459.txt => character.459.txt} | 0 .../{character_460.txt => character.460.txt} | 0 .../{character_461.txt => character.461.txt} | 0 .../{character_462.txt => character.462.txt} | 0 .../{character_463.txt => character.463.txt} | 0 .../{character_464.txt => character.464.txt} | 0 .../{character_465.txt => character.465.txt} | 0 .../{character_466.txt => character.466.txt} | 0 .../{character_467.txt => character.467.txt} | 0 .../{character_468.txt => character.468.txt} | 0 .../{character_469.txt => character.469.txt} | 0 .../{character_470.txt => character.470.txt} | 0 .../{character_471.txt => character.471.txt} | 0 .../{character_473.txt => character.473.txt} | 0 .../{character_474.txt => character.474.txt} | 0 .../{character_475.txt => character.475.txt} | 0 .../{character_476.txt => character.476.txt} | 0 .../{character_477.txt => character.477.txt} | 0 .../{character_478.txt => character.478.txt} | 0 .../{character_479.txt => character.479.txt} | 0 .../{character_480.txt => character.480.txt} | 0 .../{character_482.txt => character.482.txt} | 0 .../{character_483.txt => character.483.txt} | 0 .../{character_484.txt => character.484.txt} | 0 .../{character_485.txt => character.485.txt} | 0 .../{character_486.txt => character.486.txt} | 0 .../{character_487.txt => character.487.txt} | 0 .../{character_488.txt => character.488.txt} | 0 .../{character_489.txt => character.489.txt} | 0 .../{character_490.txt => character.490.txt} | 0 .../{character_491.txt => character.491.txt} | 0 .../{character_492.txt => character.492.txt} | 0 .../{character_493.txt => character.493.txt} | 0 .../{character_494.txt => character.494.txt} | 0 .../{character_495.txt => character.495.txt} | 0 .../{character_496.txt => character.496.txt} | 0 .../{character_497.txt => character.497.txt} | 0 .../{character_498.txt => character.498.txt} | 0 .../meta/{character_5.txt => character.5.txt} | 0 .../{character_50.txt => character.50.txt} | 0 .../{character_500.txt => character.500.txt} | 0 .../{character_501.txt => character.501.txt} | 0 .../{character_502.txt => character.502.txt} | 0 .../{character_503.txt => character.503.txt} | 0 .../{character_504.txt => character.504.txt} | 0 .../{character_505.txt => character.505.txt} | 0 .../{character_507.txt => character.507.txt} | 0 .../{character_510.txt => character.510.txt} | 0 .../{character_511.txt => character.511.txt} | 0 .../{character_512.txt => character.512.txt} | 0 .../{character_513.txt => character.513.txt} | 0 .../{character_514.txt => character.514.txt} | 0 .../{character_515.txt => character.515.txt} | 0 .../{character_516.txt => character.516.txt} | 0 .../{character_517.txt => character.517.txt} | 0 .../{character_518.txt => character.518.txt} | 0 .../{character_519.txt => character.519.txt} | 0 .../{character_52.txt => character.52.txt} | 0 .../{character_520.txt => character.520.txt} | 0 .../{character_521.txt => character.521.txt} | 0 .../{character_522.txt => character.522.txt} | 0 .../{character_523.txt => character.523.txt} | 0 .../{character_524.txt => character.524.txt} | 0 .../{character_525.txt => character.525.txt} | 0 .../{character_526.txt => character.526.txt} | 0 .../{character_527.txt => character.527.txt} | 0 .../{character_528.txt => character.528.txt} | 0 .../{character_529.txt => character.529.txt} | 0 .../{character_530.txt => character.530.txt} | 0 .../{character_531.txt => character.531.txt} | 0 .../{character_532.txt => character.532.txt} | 0 .../{character_533.txt => character.533.txt} | 0 .../{character_534.txt => character.534.txt} | 0 .../{character_535.txt => character.535.txt} | 0 .../{character_536.txt => character.536.txt} | 0 .../{character_537.txt => character.537.txt} | 0 .../{character_539.txt => character.539.txt} | 0 .../{character_54.txt => character.54.txt} | 0 .../{character_540.txt => character.540.txt} | 0 .../{character_541.txt => character.541.txt} | 0 .../{character_542.txt => character.542.txt} | 0 .../{character_543.txt => character.543.txt} | 0 .../{character_544.txt => character.544.txt} | 0 .../{character_545.txt => character.545.txt} | 0 .../{character_546.txt => character.546.txt} | 0 .../{character_547.txt => character.547.txt} | 0 .../{character_548.txt => character.548.txt} | 0 .../{character_549.txt => character.549.txt} | 0 .../{character_55.txt => character.55.txt} | 0 .../{character_550.txt => character.550.txt} | 0 .../{character_551.txt => character.551.txt} | 0 .../{character_552.txt => character.552.txt} | 0 .../{character_553.txt => character.553.txt} | 0 .../{character_554.txt => character.554.txt} | 0 .../{character_555.txt => character.555.txt} | 0 .../{character_556.txt => character.556.txt} | 0 .../{character_558.txt => character.558.txt} | 0 .../{character_559.txt => character.559.txt} | 0 .../{character_560.txt => character.560.txt} | 0 .../{character_561.txt => character.561.txt} | 0 .../{character_562.txt => character.562.txt} | 0 .../{character_563.txt => character.563.txt} | 0 .../{character_564.txt => character.564.txt} | 0 .../{character_565.txt => character.565.txt} | 0 .../{character_567.txt => character.567.txt} | 0 .../{character_57.txt => character.57.txt} | 0 .../{character_570.txt => character.570.txt} | 0 .../{character_571.txt => character.571.txt} | 0 .../{character_572.txt => character.572.txt} | 0 .../{character_573.txt => character.573.txt} | 0 .../{character_575.txt => character.575.txt} | 0 .../{character_576.txt => character.576.txt} | 0 .../{character_577.txt => character.577.txt} | 0 .../{character_578.txt => character.578.txt} | 0 .../{character_579.txt => character.579.txt} | 0 .../{character_580.txt => character.580.txt} | 0 .../{character_581.txt => character.581.txt} | 0 .../{character_582.txt => character.582.txt} | 0 .../{character_583.txt => character.583.txt} | 0 .../{character_584.txt => character.584.txt} | 0 .../{character_585.txt => character.585.txt} | 0 .../{character_586.txt => character.586.txt} | 0 .../{character_587.txt => character.587.txt} | 0 .../{character_588.txt => character.588.txt} | 0 .../{character_589.txt => character.589.txt} | 0 .../{character_590.txt => character.590.txt} | 0 .../{character_591.txt => character.591.txt} | 0 .../{character_592.txt => character.592.txt} | 0 mods/skinsdb/meta/character.593.txt | 3 + .../{character_594.txt => character.594.txt} | 0 .../{character_595.txt => character.595.txt} | 0 .../{character_596.txt => character.596.txt} | 0 .../{character_597.txt => character.597.txt} | 0 .../{character_598.txt => character.598.txt} | 0 .../{character_599.txt => character.599.txt} | 0 .../meta/{character_6.txt => character.6.txt} | 0 .../{character_600.txt => character.600.txt} | 0 .../{character_601.txt => character.601.txt} | 0 .../{character_602.txt => character.602.txt} | 0 .../{character_603.txt => character.603.txt} | 0 .../{character_604.txt => character.604.txt} | 0 .../{character_605.txt => character.605.txt} | 0 .../{character_606.txt => character.606.txt} | 0 .../{character_607.txt => character.607.txt} | 0 .../{character_608.txt => character.608.txt} | 0 .../{character_609.txt => character.609.txt} | 0 .../{character_61.txt => character.61.txt} | 0 .../{character_610.txt => character.610.txt} | 0 .../{character_611.txt => character.611.txt} | 0 .../{character_612.txt => character.612.txt} | 0 .../{character_613.txt => character.613.txt} | 0 .../{character_614.txt => character.614.txt} | 0 .../{character_615.txt => character.615.txt} | 0 .../{character_616.txt => character.616.txt} | 0 .../{character_618.txt => character.618.txt} | 0 .../{character_619.txt => character.619.txt} | 0 .../{character_620.txt => character.620.txt} | 0 .../{character_621.txt => character.621.txt} | 0 .../{character_622.txt => character.622.txt} | 0 .../{character_623.txt => character.623.txt} | 0 .../{character_624.txt => character.624.txt} | 0 .../{character_625.txt => character.625.txt} | 0 .../{character_626.txt => character.626.txt} | 0 .../{character_627.txt => character.627.txt} | 0 .../{character_628.txt => character.628.txt} | 0 .../{character_629.txt => character.629.txt} | 0 .../{character_630.txt => character.630.txt} | 0 .../{character_631.txt => character.631.txt} | 0 .../{character_632.txt => character.632.txt} | 0 .../{character_633.txt => character.633.txt} | 0 .../{character_634.txt => character.634.txt} | 0 .../{character_635.txt => character.635.txt} | 0 .../{character_636.txt => character.636.txt} | 0 .../{character_637.txt => character.637.txt} | 0 .../{character_638.txt => character.638.txt} | 0 .../{character_639.txt => character.639.txt} | 0 .../{character_640.txt => character.640.txt} | 0 .../{character_641.txt => character.641.txt} | 0 .../{character_642.txt => character.642.txt} | 0 .../{character_643.txt => character.643.txt} | 0 .../{character_644.txt => character.644.txt} | 0 .../{character_645.txt => character.645.txt} | 0 .../{character_646.txt => character.646.txt} | 0 .../{character_647.txt => character.647.txt} | 0 mods/skinsdb/meta/character.648.txt | 3 + .../{character_649.txt => character.649.txt} | 0 .../{character_650.txt => character.650.txt} | 0 .../{character_651.txt => character.651.txt} | 0 .../{character_652.txt => character.652.txt} | 0 .../{character_656.txt => character.656.txt} | 0 .../{character_657.txt => character.657.txt} | 0 .../{character_658.txt => character.658.txt} | 0 .../{character_659.txt => character.659.txt} | 0 .../{character_660.txt => character.660.txt} | 0 .../{character_661.txt => character.661.txt} | 0 .../{character_662.txt => character.662.txt} | 0 .../{character_663.txt => character.663.txt} | 0 .../{character_664.txt => character.664.txt} | 0 .../{character_666.txt => character.666.txt} | 0 .../{character_667.txt => character.667.txt} | 0 .../{character_668.txt => character.668.txt} | 0 .../{character_669.txt => character.669.txt} | 0 .../{character_670.txt => character.670.txt} | 0 .../{character_671.txt => character.671.txt} | 0 .../{character_672.txt => character.672.txt} | 0 .../{character_673.txt => character.673.txt} | 0 .../{character_674.txt => character.674.txt} | 0 .../{character_675.txt => character.675.txt} | 0 .../{character_676.txt => character.676.txt} | 0 .../{character_677.txt => character.677.txt} | 0 .../{character_678.txt => character.678.txt} | 0 .../{character_679.txt => character.679.txt} | 0 .../{character_680.txt => character.680.txt} | 0 .../{character_681.txt => character.681.txt} | 0 .../{character_682.txt => character.682.txt} | 0 .../{character_683.txt => character.683.txt} | 0 .../{character_684.txt => character.684.txt} | 0 .../{character_685.txt => character.685.txt} | 0 .../{character_686.txt => character.686.txt} | 0 .../{character_687.txt => character.687.txt} | 0 .../{character_688.txt => character.688.txt} | 0 .../{character_689.txt => character.689.txt} | 0 .../{character_69.txt => character.69.txt} | 0 .../{character_690.txt => character.690.txt} | 0 .../{character_691.txt => character.691.txt} | 0 .../{character_692.txt => character.692.txt} | 0 .../{character_693.txt => character.693.txt} | 0 .../{character_694.txt => character.694.txt} | 0 .../{character_695.txt => character.695.txt} | 0 .../{character_696.txt => character.696.txt} | 0 .../{character_697.txt => character.697.txt} | 0 .../{character_698.txt => character.698.txt} | 0 .../{character_699.txt => character.699.txt} | 0 .../meta/{character_7.txt => character.7.txt} | 0 .../{character_70.txt => character.70.txt} | 0 .../{character_700.txt => character.700.txt} | 0 .../{character_701.txt => character.701.txt} | 0 .../{character_702.txt => character.702.txt} | 0 .../{character_703.txt => character.703.txt} | 0 .../{character_704.txt => character.704.txt} | 0 .../{character_705.txt => character.705.txt} | 0 .../{character_706.txt => character.706.txt} | 0 .../{character_707.txt => character.707.txt} | 0 .../{character_708.txt => character.708.txt} | 0 .../{character_709.txt => character.709.txt} | 0 .../{character_71.txt => character.71.txt} | 0 .../{character_710.txt => character.710.txt} | 0 .../{character_711.txt => character.711.txt} | 0 .../{character_712.txt => character.712.txt} | 0 .../{character_713.txt => character.713.txt} | 0 .../{character_714.txt => character.714.txt} | 0 .../{character_715.txt => character.715.txt} | 0 .../{character_716.txt => character.716.txt} | 0 .../{character_717.txt => character.717.txt} | 0 .../{character_718.txt => character.718.txt} | 0 .../{character_72.txt => character.72.txt} | 0 .../{character_720.txt => character.720.txt} | 0 .../{character_721.txt => character.721.txt} | 0 .../{character_723.txt => character.723.txt} | 0 .../{character_724.txt => character.724.txt} | 0 .../{character_725.txt => character.725.txt} | 0 .../{character_726.txt => character.726.txt} | 0 .../{character_727.txt => character.727.txt} | 0 .../{character_728.txt => character.728.txt} | 0 .../{character_729.txt => character.729.txt} | 0 .../{character_73.txt => character.73.txt} | 0 .../{character_730.txt => character.730.txt} | 0 .../{character_731.txt => character.731.txt} | 0 .../{character_732.txt => character.732.txt} | 0 .../{character_734.txt => character.734.txt} | 0 .../{character_735.txt => character.735.txt} | 0 .../{character_736.txt => character.736.txt} | 0 .../{character_737.txt => character.737.txt} | 0 .../{character_738.txt => character.738.txt} | 0 .../{character_739.txt => character.739.txt} | 0 .../{character_74.txt => character.74.txt} | 0 .../{character_740.txt => character.740.txt} | 0 .../{character_741.txt => character.741.txt} | 0 .../{character_742.txt => character.742.txt} | 0 .../{character_743.txt => character.743.txt} | 0 .../{character_744.txt => character.744.txt} | 0 .../{character_745.txt => character.745.txt} | 0 .../{character_746.txt => character.746.txt} | 0 .../{character_747.txt => character.747.txt} | 0 .../{character_748.txt => character.748.txt} | 0 .../{character_749.txt => character.749.txt} | 0 .../{character_75.txt => character.75.txt} | 0 .../{character_750.txt => character.750.txt} | 0 .../{character_751.txt => character.751.txt} | 0 .../{character_752.txt => character.752.txt} | 0 .../{character_753.txt => character.753.txt} | 0 .../{character_754.txt => character.754.txt} | 0 .../{character_755.txt => character.755.txt} | 0 .../{character_756.txt => character.756.txt} | 0 .../{character_757.txt => character.757.txt} | 0 .../{character_758.txt => character.758.txt} | 0 .../{character_759.txt => character.759.txt} | 0 .../{character_76.txt => character.76.txt} | 0 .../{character_760.txt => character.760.txt} | 0 .../{character_761.txt => character.761.txt} | 0 .../{character_762.txt => character.762.txt} | 0 .../{character_763.txt => character.763.txt} | 0 .../{character_764.txt => character.764.txt} | 0 .../{character_765.txt => character.765.txt} | 0 .../{character_766.txt => character.766.txt} | 0 .../{character_767.txt => character.767.txt} | 0 .../{character_768.txt => character.768.txt} | 0 .../{character_769.txt => character.769.txt} | 0 .../{character_77.txt => character.77.txt} | 0 .../{character_770.txt => character.770.txt} | 0 .../{character_771.txt => character.771.txt} | 0 .../{character_772.txt => character.772.txt} | 0 .../{character_773.txt => character.773.txt} | 0 .../{character_774.txt => character.774.txt} | 0 .../{character_775.txt => character.775.txt} | 0 .../{character_776.txt => character.776.txt} | 0 .../{character_777.txt => character.777.txt} | 0 .../{character_778.txt => character.778.txt} | 0 .../{character_779.txt => character.779.txt} | 0 .../{character_78.txt => character.78.txt} | 0 .../{character_780.txt => character.780.txt} | 0 .../{character_781.txt => character.781.txt} | 0 .../{character_782.txt => character.782.txt} | 0 .../{character_783.txt => character.783.txt} | 0 .../{character_784.txt => character.784.txt} | 0 .../{character_785.txt => character.785.txt} | 0 .../{character_786.txt => character.786.txt} | 0 .../{character_787.txt => character.787.txt} | 0 .../{character_788.txt => character.788.txt} | 0 .../{character_789.txt => character.789.txt} | 0 .../{character_790.txt => character.790.txt} | 0 .../{character_791.txt => character.791.txt} | 0 .../{character_792.txt => character.792.txt} | 0 .../{character_793.txt => character.793.txt} | 0 .../{character_794.txt => character.794.txt} | 0 .../{character_795.txt => character.795.txt} | 0 .../{character_796.txt => character.796.txt} | 0 .../{character_797.txt => character.797.txt} | 0 .../{character_798.txt => character.798.txt} | 0 .../{character_799.txt => character.799.txt} | 0 .../meta/{character_8.txt => character.8.txt} | 0 .../{character_80.txt => character.80.txt} | 0 .../{character_800.txt => character.800.txt} | 0 .../{character_801.txt => character.801.txt} | 0 .../{character_802.txt => character.802.txt} | 0 .../{character_803.txt => character.803.txt} | 0 .../{character_804.txt => character.804.txt} | 0 .../{character_805.txt => character.805.txt} | 0 .../{character_806.txt => character.806.txt} | 0 .../{character_807.txt => character.807.txt} | 0 .../{character_808.txt => character.808.txt} | 0 .../{character_809.txt => character.809.txt} | 0 .../{character_81.txt => character.81.txt} | 0 .../{character_810.txt => character.810.txt} | 0 .../{character_811.txt => character.811.txt} | 0 .../{character_812.txt => character.812.txt} | 0 .../{character_813.txt => character.813.txt} | 0 .../{character_814.txt => character.814.txt} | 0 .../{character_815.txt => character.815.txt} | 0 .../{character_816.txt => character.816.txt} | 0 .../{character_817.txt => character.817.txt} | 0 .../{character_818.txt => character.818.txt} | 0 .../{character_819.txt => character.819.txt} | 0 .../{character_82.txt => character.82.txt} | 0 .../{character_821.txt => character.821.txt} | 0 .../{character_822.txt => character.822.txt} | 0 .../{character_823.txt => character.823.txt} | 0 .../{character_824.txt => character.824.txt} | 0 .../{character_827.txt => character.827.txt} | 0 .../{character_828.txt => character.828.txt} | 0 .../{character_829.txt => character.829.txt} | 0 .../{character_83.txt => character.83.txt} | 0 .../{character_830.txt => character.830.txt} | 0 .../{character_831.txt => character.831.txt} | 0 .../{character_832.txt => character.832.txt} | 0 .../{character_833.txt => character.833.txt} | 0 .../{character_834.txt => character.834.txt} | 0 .../{character_835.txt => character.835.txt} | 0 .../{character_836.txt => character.836.txt} | 0 .../{character_837.txt => character.837.txt} | 0 .../{character_838.txt => character.838.txt} | 0 .../{character_839.txt => character.839.txt} | 0 .../{character_84.txt => character.84.txt} | 0 .../{character_841.txt => character.841.txt} | 0 .../{character_843.txt => character.843.txt} | 0 .../{character_844.txt => character.844.txt} | 0 .../{character_845.txt => character.845.txt} | 0 .../{character_846.txt => character.846.txt} | 0 .../{character_847.txt => character.847.txt} | 0 .../{character_848.txt => character.848.txt} | 0 .../{character_85.txt => character.85.txt} | 0 .../{character_850.txt => character.850.txt} | 0 .../{character_851.txt => character.851.txt} | 0 .../{character_852.txt => character.852.txt} | 0 .../{character_853.txt => character.853.txt} | 0 .../{character_855.txt => character.855.txt} | 0 .../{character_856.txt => character.856.txt} | 0 .../{character_857.txt => character.857.txt} | 0 .../{character_859.txt => character.859.txt} | 0 .../{character_860.txt => character.860.txt} | 0 .../{character_861.txt => character.861.txt} | 0 .../{character_862.txt => character.862.txt} | 0 .../{character_863.txt => character.863.txt} | 0 .../{character_864.txt => character.864.txt} | 0 .../{character_865.txt => character.865.txt} | 0 .../{character_866.txt => character.866.txt} | 0 .../{character_869.txt => character.869.txt} | 0 .../{character_87.txt => character.87.txt} | 0 .../{character_870.txt => character.870.txt} | 0 .../{character_871.txt => character.871.txt} | 0 .../{character_874.txt => character.874.txt} | 0 .../{character_877.txt => character.877.txt} | 0 .../{character_878.txt => character.878.txt} | 0 .../{character_879.txt => character.879.txt} | 0 .../{character_88.txt => character.88.txt} | 0 .../{character_880.txt => character.880.txt} | 0 .../{character_881.txt => character.881.txt} | 0 .../{character_882.txt => character.882.txt} | 0 .../{character_883.txt => character.883.txt} | 0 .../{character_884.txt => character.884.txt} | 0 .../{character_885.txt => character.885.txt} | 0 .../{character_886.txt => character.886.txt} | 0 .../{character_887.txt => character.887.txt} | 0 .../{character_888.txt => character.888.txt} | 0 .../{character_889.txt => character.889.txt} | 0 .../{character_89.txt => character.89.txt} | 0 .../{character_890.txt => character.890.txt} | 0 .../{character_891.txt => character.891.txt} | 0 .../{character_893.txt => character.893.txt} | 0 .../{character_894.txt => character.894.txt} | 0 .../{character_895.txt => character.895.txt} | 0 .../{character_896.txt => character.896.txt} | 0 .../{character_897.txt => character.897.txt} | 0 .../{character_898.txt => character.898.txt} | 0 .../{character_899.txt => character.899.txt} | 0 .../meta/{character_9.txt => character.9.txt} | 0 .../{character_900.txt => character.900.txt} | 0 .../{character_901.txt => character.901.txt} | 0 .../{character_902.txt => character.902.txt} | 0 .../{character_903.txt => character.903.txt} | 0 .../{character_904.txt => character.904.txt} | 0 .../{character_905.txt => character.905.txt} | 0 .../{character_906.txt => character.906.txt} | 0 .../{character_907.txt => character.907.txt} | 0 .../{character_908.txt => character.908.txt} | 0 .../{character_909.txt => character.909.txt} | 0 .../{character_910.txt => character.910.txt} | 0 .../{character_911.txt => character.911.txt} | 0 .../{character_912.txt => character.912.txt} | 0 .../{character_913.txt => character.913.txt} | 0 .../{character_914.txt => character.914.txt} | 0 .../{character_915.txt => character.915.txt} | 0 .../{character_916.txt => character.916.txt} | 0 .../{character_917.txt => character.917.txt} | 0 .../{character_918.txt => character.918.txt} | 0 .../{character_919.txt => character.919.txt} | 0 .../{character_92.txt => character.92.txt} | 0 .../{character_920.txt => character.920.txt} | 0 .../{character_921.txt => character.921.txt} | 0 .../{character_922.txt => character.922.txt} | 0 .../{character_923.txt => character.923.txt} | 0 .../{character_924.txt => character.924.txt} | 0 .../{character_925.txt => character.925.txt} | 0 .../{character_926.txt => character.926.txt} | 0 .../{character_927.txt => character.927.txt} | 0 .../{character_928.txt => character.928.txt} | 0 .../{character_929.txt => character.929.txt} | 0 .../{character_93.txt => character.93.txt} | 0 .../{character_930.txt => character.930.txt} | 0 .../{character_931.txt => character.931.txt} | 0 .../{character_932.txt => character.932.txt} | 0 .../{character_933.txt => character.933.txt} | 0 .../{character_934.txt => character.934.txt} | 0 .../{character_935.txt => character.935.txt} | 0 .../{character_936.txt => character.936.txt} | 0 .../{character_937.txt => character.937.txt} | 0 .../{character_938.txt => character.938.txt} | 0 .../{character_939.txt => character.939.txt} | 0 .../{character_940.txt => character.940.txt} | 0 .../{character_941.txt => character.941.txt} | 0 .../{character_942.txt => character.942.txt} | 0 .../{character_943.txt => character.943.txt} | 0 .../{character_944.txt => character.944.txt} | 0 .../{character_945.txt => character.945.txt} | 0 .../{character_946.txt => character.946.txt} | 0 .../{character_947.txt => character.947.txt} | 0 .../{character_948.txt => character.948.txt} | 0 .../{character_949.txt => character.949.txt} | 0 .../{character_95.txt => character.95.txt} | 0 .../{character_950.txt => character.950.txt} | 0 .../{character_951.txt => character.951.txt} | 0 .../{character_952.txt => character.952.txt} | 0 .../{character_953.txt => character.953.txt} | 0 .../{character_954.txt => character.954.txt} | 0 .../{character_955.txt => character.955.txt} | 0 .../{character_956.txt => character.956.txt} | 0 .../{character_957.txt => character.957.txt} | 0 .../{character_958.txt => character.958.txt} | 0 .../{character_959.txt => character.959.txt} | 0 .../{character_96.txt => character.96.txt} | 0 .../{character_960.txt => character.960.txt} | 0 .../{character_961.txt => character.961.txt} | 0 .../{character_962.txt => character.962.txt} | 0 .../{character_963.txt => character.963.txt} | 0 .../{character_964.txt => character.964.txt} | 0 .../{character_965.txt => character.965.txt} | 0 .../{character_966.txt => character.966.txt} | 0 .../{character_967.txt => character.967.txt} | 0 .../{character_968.txt => character.968.txt} | 0 .../{character_969.txt => character.969.txt} | 0 .../{character_970.txt => character.970.txt} | 0 .../{character_971.txt => character.971.txt} | 0 .../{character_972.txt => character.972.txt} | 0 .../{character_973.txt => character.973.txt} | 0 .../{character_974.txt => character.974.txt} | 0 .../{character_975.txt => character.975.txt} | 0 .../{character_976.txt => character.976.txt} | 0 .../{character_977.txt => character.977.txt} | 0 .../{character_978.txt => character.978.txt} | 0 .../{character_979.txt => character.979.txt} | 0 .../{character_98.txt => character.98.txt} | 0 .../{character_980.txt => character.980.txt} | 0 .../{character_981.txt => character.981.txt} | 0 .../{character_982.txt => character.982.txt} | 0 .../{character_983.txt => character.983.txt} | 0 .../{character_984.txt => character.984.txt} | 0 .../{character_985.txt => character.985.txt} | 0 .../{character_986.txt => character.986.txt} | 0 .../{character_987.txt => character.987.txt} | 0 .../{character_988.txt => character.988.txt} | 0 .../{character_989.txt => character.989.txt} | 0 .../{character_99.txt => character.99.txt} | 0 .../{character_990.txt => character.990.txt} | 0 .../{character_991.txt => character.991.txt} | 0 .../{character_992.txt => character.992.txt} | 0 .../{character_993.txt => character.993.txt} | 0 .../{character_994.txt => character.994.txt} | 0 .../{character_995.txt => character.995.txt} | 0 .../{character_996.txt => character.996.txt} | 0 .../{character_997.txt => character.997.txt} | 0 .../{character_998.txt => character.998.txt} | 0 .../{character_999.txt => character.999.txt} | 0 mods/skinsdb/meta/character_1135.txt | 3 - mods/skinsdb/meta/character_593.txt | 3 - mods/skinsdb/meta/character_648.txt | 3 - mods/skinsdb/mod.conf | 2 +- mods/skinsdb/models/skinsdb_hand.b3d | Bin 0 -> 1023 bytes mods/skinsdb/models/skinsdb_hand.blend | Bin 0 -> 554856 bytes mods/skinsdb/models/skinsdb_hand_18.b3d | Bin 0 -> 789 bytes mods/skinsdb/models/skinsdb_hand_18.blend | Bin 0 -> 551108 bytes mods/skinsdb/skin_meta_api.lua | 54 +- mods/skinsdb/skinlist.lua | 196 +- mods/skinsdb/skins_updater.lua | 32 +- .../{character_1.png => character.1.png} | Bin .../{character_10.png => character.10.png} | Bin ...{character_1000.png => character.1000.png} | Bin ...{character_1001.png => character.1001.png} | Bin ...{character_1002.png => character.1002.png} | Bin ...{character_1003.png => character.1003.png} | Bin ...{character_1004.png => character.1004.png} | Bin ...{character_1005.png => character.1005.png} | Bin ...{character_1006.png => character.1006.png} | Bin ...{character_1007.png => character.1007.png} | Bin ...{character_1008.png => character.1008.png} | Bin ...{character_1009.png => character.1009.png} | Bin .../{character_101.png => character.101.png} | Bin ...{character_1010.png => character.1010.png} | Bin ...{character_1011.png => character.1011.png} | Bin ...{character_1012.png => character.1012.png} | Bin ...{character_1013.png => character.1013.png} | Bin ...{character_1014.png => character.1014.png} | Bin ...{character_1015.png => character.1015.png} | Bin ...{character_1016.png => character.1016.png} | Bin ...{character_1017.png => character.1017.png} | Bin ...{character_1018.png => character.1018.png} | Bin ...{character_1019.png => character.1019.png} | Bin ...{character_1020.png => character.1020.png} | Bin ...{character_1021.png => character.1021.png} | Bin ...{character_1022.png => character.1022.png} | Bin ...{character_1023.png => character.1023.png} | Bin ...{character_1024.png => character.1024.png} | Bin ...{character_1025.png => character.1025.png} | Bin ...{character_1026.png => character.1026.png} | Bin ...{character_1027.png => character.1027.png} | Bin ...{character_1028.png => character.1028.png} | Bin ...{character_1029.png => character.1029.png} | Bin ...{character_1030.png => character.1030.png} | Bin ...{character_1031.png => character.1031.png} | Bin ...{character_1032.png => character.1032.png} | Bin ...{character_1033.png => character.1033.png} | Bin ...{character_1034.png => character.1034.png} | Bin ...{character_1035.png => character.1035.png} | Bin ...{character_1036.png => character.1036.png} | Bin ...{character_1037.png => character.1037.png} | Bin ...{character_1038.png => character.1038.png} | Bin ...{character_1039.png => character.1039.png} | Bin ...{character_1040.png => character.1040.png} | Bin ...{character_1041.png => character.1041.png} | Bin ...{character_1042.png => character.1042.png} | Bin ...{character_1043.png => character.1043.png} | Bin ...{character_1044.png => character.1044.png} | Bin ...{character_1045.png => character.1045.png} | Bin ...{character_1046.png => character.1046.png} | Bin ...{character_1047.png => character.1047.png} | Bin ...{character_1048.png => character.1048.png} | Bin ...{character_1049.png => character.1049.png} | Bin ...{character_1050.png => character.1050.png} | Bin ...{character_1051.png => character.1051.png} | Bin ...{character_1052.png => character.1052.png} | Bin ...{character_1053.png => character.1053.png} | Bin ...{character_1054.png => character.1054.png} | Bin ...{character_1055.png => character.1055.png} | Bin ...{character_1056.png => character.1056.png} | Bin ...{character_1057.png => character.1057.png} | Bin ...{character_1058.png => character.1058.png} | Bin ...{character_1059.png => character.1059.png} | Bin ...{character_1060.png => character.1060.png} | Bin ...{character_1061.png => character.1061.png} | Bin ...{character_1062.png => character.1062.png} | Bin ...{character_1063.png => character.1063.png} | Bin ...{character_1064.png => character.1064.png} | Bin ...{character_1065.png => character.1065.png} | Bin ...{character_1066.png => character.1066.png} | Bin ...{character_1067.png => character.1067.png} | Bin ...{character_1068.png => character.1068.png} | Bin ...{character_1069.png => character.1069.png} | Bin ...{character_1070.png => character.1070.png} | Bin ...{character_1071.png => character.1071.png} | Bin ...{character_1072.png => character.1072.png} | Bin ...{character_1073.png => character.1073.png} | Bin ...{character_1075.png => character.1075.png} | Bin ...{character_1076.png => character.1076.png} | Bin ...{character_1077.png => character.1077.png} | Bin ...{character_1078.png => character.1078.png} | Bin ...{character_1079.png => character.1079.png} | Bin .../{character_108.png => character.108.png} | Bin ...{character_1080.png => character.1080.png} | Bin ...{character_1081.png => character.1081.png} | Bin ...{character_1082.png => character.1082.png} | Bin ...{character_1083.png => character.1083.png} | Bin ...{character_1084.png => character.1084.png} | Bin ...{character_1085.png => character.1085.png} | Bin ...{character_1086.png => character.1086.png} | Bin ...{character_1087.png => character.1087.png} | Bin ...{character_1088.png => character.1088.png} | Bin ...{character_1089.png => character.1089.png} | Bin .../{character_109.png => character.109.png} | Bin ...{character_1090.png => character.1090.png} | Bin ...{character_1091.png => character.1091.png} | Bin ...{character_1092.png => character.1092.png} | Bin ...{character_1093.png => character.1093.png} | Bin ...{character_1094.png => character.1094.png} | Bin ...{character_1095.png => character.1095.png} | Bin ...{character_1096.png => character.1096.png} | Bin ...{character_1097.png => character.1097.png} | Bin ...{character_1098.png => character.1098.png} | Bin ...{character_1099.png => character.1099.png} | Bin .../{character_110.png => character.110.png} | Bin ...{character_1100.png => character.1100.png} | Bin ...{character_1101.png => character.1101.png} | Bin ...{character_1102.png => character.1102.png} | Bin ...{character_1103.png => character.1103.png} | Bin ...{character_1104.png => character.1104.png} | Bin ...{character_1105.png => character.1105.png} | Bin ...{character_1106.png => character.1106.png} | Bin ...{character_1107.png => character.1107.png} | Bin ...{character_1108.png => character.1108.png} | Bin ...{character_1109.png => character.1109.png} | Bin .../{character_111.png => character.111.png} | Bin ...{character_1110.png => character.1110.png} | Bin ...{character_1111.png => character.1111.png} | Bin ...{character_1112.png => character.1112.png} | Bin ...{character_1113.png => character.1113.png} | Bin ...{character_1114.png => character.1114.png} | Bin ...{character_1115.png => character.1115.png} | Bin ...{character_1116.png => character.1116.png} | Bin ...{character_1117.png => character.1117.png} | Bin ...{character_1118.png => character.1118.png} | Bin ...{character_1119.png => character.1119.png} | Bin .../{character_112.png => character.112.png} | Bin ...{character_1120.png => character.1120.png} | Bin ...{character_1121.png => character.1121.png} | Bin ...{character_1122.png => character.1122.png} | Bin ...{character_1123.png => character.1123.png} | Bin ...{character_1124.png => character.1124.png} | Bin ...{character_1126.png => character.1126.png} | Bin ...{character_1127.png => character.1127.png} | Bin .../{character_113.png => character.113.png} | Bin ...{character_1133.png => character.1133.png} | Bin ...{character_1134.png => character.1134.png} | Bin ...{character_1135.png => character.1135.png} | Bin ...{character_1136.png => character.1136.png} | Bin ...{character_1137.png => character.1137.png} | Bin ...{character_1138.png => character.1138.png} | Bin ...{character_1139.png => character.1139.png} | Bin .../{character_114.png => character.114.png} | Bin ...{character_1140.png => character.1140.png} | Bin ...{character_1141.png => character.1141.png} | Bin ...{character_1142.png => character.1142.png} | Bin ...{character_1143.png => character.1143.png} | Bin ...{character_1144.png => character.1144.png} | Bin ...{character_1145.png => character.1145.png} | Bin ...{character_1146.png => character.1146.png} | Bin ...{character_1147.png => character.1147.png} | Bin ...{character_1148.png => character.1148.png} | Bin ...{character_1149.png => character.1149.png} | Bin ...{character_1150.png => character.1150.png} | Bin ...{character_1151.png => character.1151.png} | Bin ...{character_1153.png => character.1153.png} | Bin ...{character_1154.png => character.1154.png} | Bin ...{character_1155.png => character.1155.png} | Bin ...{character_1156.png => character.1156.png} | Bin ...{character_1157.png => character.1157.png} | Bin ...{character_1158.png => character.1158.png} | Bin ...{character_1159.png => character.1159.png} | Bin ...{character_1160.png => character.1160.png} | Bin ...{character_1161.png => character.1161.png} | Bin ...{character_1162.png => character.1162.png} | Bin ...{character_1163.png => character.1163.png} | Bin ...{character_1164.png => character.1164.png} | Bin ...{character_1165.png => character.1165.png} | Bin ...{character_1166.png => character.1166.png} | Bin ...{character_1167.png => character.1167.png} | Bin ...{character_1168.png => character.1168.png} | Bin ...{character_1169.png => character.1169.png} | Bin .../{character_117.png => character.117.png} | Bin ...{character_1170.png => character.1170.png} | Bin ...{character_1171.png => character.1171.png} | Bin ...{character_1172.png => character.1172.png} | Bin ...{character_1173.png => character.1173.png} | Bin ...{character_1174.png => character.1174.png} | Bin ...{character_1175.png => character.1175.png} | Bin ...{character_1176.png => character.1176.png} | Bin ...{character_1177.png => character.1177.png} | Bin ...{character_1178.png => character.1178.png} | Bin ...{character_1179.png => character.1179.png} | Bin .../{character_118.png => character.118.png} | Bin ...{character_1180.png => character.1180.png} | Bin ...{character_1181.png => character.1181.png} | Bin ...{character_1182.png => character.1182.png} | Bin ...{character_1183.png => character.1183.png} | Bin ...{character_1184.png => character.1184.png} | Bin ...{character_1185.png => character.1185.png} | Bin ...{character_1186.png => character.1186.png} | Bin ...{character_1191.png => character.1191.png} | Bin ...{character_1192.png => character.1192.png} | Bin ...{character_1193.png => character.1193.png} | Bin ...{character_1194.png => character.1194.png} | Bin ...{character_1195.png => character.1195.png} | Bin ...{character_1196.png => character.1196.png} | Bin ...{character_1197.png => character.1197.png} | Bin ...{character_1198.png => character.1198.png} | Bin ...{character_1199.png => character.1199.png} | Bin .../{character_12.png => character.12.png} | Bin ...{character_1200.png => character.1200.png} | Bin ...{character_1201.png => character.1201.png} | Bin ...{character_1202.png => character.1202.png} | Bin ...{character_1203.png => character.1203.png} | Bin ...{character_1204.png => character.1204.png} | Bin ...{character_1205.png => character.1205.png} | Bin ...{character_1206.png => character.1206.png} | Bin ...{character_1207.png => character.1207.png} | Bin ...{character_1208.png => character.1208.png} | Bin ...{character_1209.png => character.1209.png} | Bin .../{character_121.png => character.121.png} | Bin ...{character_1210.png => character.1210.png} | Bin ...{character_1211.png => character.1211.png} | Bin ...{character_1212.png => character.1212.png} | Bin ...{character_1213.png => character.1213.png} | Bin ...{character_1214.png => character.1214.png} | Bin ...{character_1215.png => character.1215.png} | Bin ...{character_1216.png => character.1216.png} | Bin ...{character_1217.png => character.1217.png} | Bin ...{character_1218.png => character.1218.png} | Bin ...{character_1219.png => character.1219.png} | Bin ...{character_1220.png => character.1220.png} | Bin ...{character_1221.png => character.1221.png} | Bin ...{character_1222.png => character.1222.png} | Bin ...{character_1223.png => character.1223.png} | Bin ...{character_1224.png => character.1224.png} | Bin ...{character_1225.png => character.1225.png} | Bin ...{character_1226.png => character.1226.png} | Bin ...{character_1227.png => character.1227.png} | Bin ...{character_1228.png => character.1228.png} | Bin ...{character_1229.png => character.1229.png} | Bin ...{character_1230.png => character.1230.png} | Bin ...{character_1231.png => character.1231.png} | Bin ...{character_1232.png => character.1232.png} | Bin ...{character_1233.png => character.1233.png} | Bin ...{character_1234.png => character.1234.png} | Bin ...{character_1235.png => character.1235.png} | Bin ...{character_1236.png => character.1236.png} | Bin ...{character_1237.png => character.1237.png} | Bin ...{character_1238.png => character.1238.png} | Bin ...{character_1239.png => character.1239.png} | Bin .../{character_124.png => character.124.png} | Bin ...{character_1240.png => character.1240.png} | Bin ...{character_1241.png => character.1241.png} | Bin ...{character_1242.png => character.1242.png} | Bin ...{character_1243.png => character.1243.png} | Bin ...{character_1244.png => character.1244.png} | Bin ...{character_1245.png => character.1245.png} | Bin ...{character_1246.png => character.1246.png} | Bin ...{character_1247.png => character.1247.png} | Bin ...{character_1248.png => character.1248.png} | Bin ...{character_1249.png => character.1249.png} | Bin ...{character_1250.png => character.1250.png} | Bin ...{character_1251.png => character.1251.png} | Bin ...{character_1252.png => character.1252.png} | Bin ...{character_1253.png => character.1253.png} | Bin ...{character_1254.png => character.1254.png} | Bin ...{character_1255.png => character.1255.png} | Bin ...{character_1256.png => character.1256.png} | Bin ...{character_1257.png => character.1257.png} | Bin ...{character_1258.png => character.1258.png} | Bin ...{character_1259.png => character.1259.png} | Bin .../{character_126.png => character.126.png} | Bin ...{character_1260.png => character.1260.png} | Bin ...{character_1261.png => character.1261.png} | Bin ...{character_1262.png => character.1262.png} | Bin ...{character_1263.png => character.1263.png} | Bin ...{character_1264.png => character.1264.png} | Bin ...{character_1265.png => character.1265.png} | Bin ...{character_1266.png => character.1266.png} | Bin ...{character_1267.png => character.1267.png} | Bin ...{character_1268.png => character.1268.png} | Bin ...{character_1269.png => character.1269.png} | Bin ...{character_1270.png => character.1270.png} | Bin ...{character_1271.png => character.1271.png} | Bin ...{character_1272.png => character.1272.png} | Bin ...{character_1273.png => character.1273.png} | Bin ...{character_1274.png => character.1274.png} | Bin ...{character_1275.png => character.1275.png} | Bin ...{character_1276.png => character.1276.png} | Bin ...{character_1277.png => character.1277.png} | Bin ...{character_1278.png => character.1278.png} | Bin ...{character_1279.png => character.1279.png} | Bin .../{character_128.png => character.128.png} | Bin ...{character_1280.png => character.1280.png} | Bin ...{character_1281.png => character.1281.png} | Bin ...{character_1282.png => character.1282.png} | Bin ...{character_1283.png => character.1283.png} | Bin ...{character_1284.png => character.1284.png} | Bin ...{character_1285.png => character.1285.png} | Bin ...{character_1286.png => character.1286.png} | Bin ...{character_1287.png => character.1287.png} | Bin ...{character_1288.png => character.1288.png} | Bin ...{character_1289.png => character.1289.png} | Bin .../{character_129.png => character.129.png} | Bin ...{character_1290.png => character.1290.png} | Bin ...{character_1291.png => character.1291.png} | Bin ...{character_1292.png => character.1292.png} | Bin ...{character_1293.png => character.1293.png} | Bin ...{character_1294.png => character.1294.png} | Bin ...{character_1295.png => character.1295.png} | Bin ...{character_1296.png => character.1296.png} | Bin ...{character_1297.png => character.1297.png} | Bin ...{character_1298.png => character.1298.png} | Bin ...{character_1299.png => character.1299.png} | Bin ...{character_1300.png => character.1300.png} | Bin ...{character_1301.png => character.1301.png} | Bin ...{character_1302.png => character.1302.png} | Bin ...{character_1303.png => character.1303.png} | Bin ...{character_1304.png => character.1304.png} | Bin ...{character_1305.png => character.1305.png} | Bin ...{character_1306.png => character.1306.png} | Bin ...{character_1307.png => character.1307.png} | Bin ...{character_1308.png => character.1308.png} | Bin ...{character_1309.png => character.1309.png} | Bin ...{character_1310.png => character.1310.png} | Bin ...{character_1311.png => character.1311.png} | Bin ...{character_1312.png => character.1312.png} | Bin ...{character_1313.png => character.1313.png} | Bin ...{character_1314.png => character.1314.png} | Bin ...{character_1315.png => character.1315.png} | Bin ...{character_1316.png => character.1316.png} | Bin ...{character_1317.png => character.1317.png} | Bin ...{character_1318.png => character.1318.png} | Bin ...{character_1319.png => character.1319.png} | Bin ...{character_1320.png => character.1320.png} | Bin ...{character_1321.png => character.1321.png} | Bin ...{character_1322.png => character.1322.png} | Bin ...{character_1323.png => character.1323.png} | Bin ...{character_1324.png => character.1324.png} | Bin ...{character_1325.png => character.1325.png} | Bin ...{character_1326.png => character.1326.png} | Bin ...{character_1327.png => character.1327.png} | Bin ...{character_1328.png => character.1328.png} | Bin ...{character_1329.png => character.1329.png} | Bin ...{character_1330.png => character.1330.png} | Bin ...{character_1331.png => character.1331.png} | Bin ...{character_1332.png => character.1332.png} | Bin ...{character_1333.png => character.1333.png} | Bin ...{character_1334.png => character.1334.png} | Bin ...{character_1335.png => character.1335.png} | Bin ...{character_1336.png => character.1336.png} | Bin ...{character_1337.png => character.1337.png} | Bin ...{character_1338.png => character.1338.png} | Bin .../{character_134.png => character.134.png} | Bin ...{character_1340.png => character.1340.png} | Bin ...{character_1341.png => character.1341.png} | Bin ...{character_1342.png => character.1342.png} | Bin ...{character_1343.png => character.1343.png} | Bin ...{character_1344.png => character.1344.png} | Bin ...{character_1345.png => character.1345.png} | Bin ...{character_1346.png => character.1346.png} | Bin ...{character_1347.png => character.1347.png} | Bin ...{character_1348.png => character.1348.png} | Bin ...{character_1349.png => character.1349.png} | Bin .../{character_135.png => character.135.png} | Bin ...{character_1350.png => character.1350.png} | Bin ...{character_1351.png => character.1351.png} | Bin ...{character_1352.png => character.1352.png} | Bin ...{character_1353.png => character.1353.png} | Bin ...{character_1354.png => character.1354.png} | Bin ...{character_1355.png => character.1355.png} | Bin ...{character_1356.png => character.1356.png} | Bin ...{character_1357.png => character.1357.png} | Bin ...{character_1358.png => character.1358.png} | Bin ...{character_1359.png => character.1359.png} | Bin .../{character_136.png => character.136.png} | Bin ...{character_1360.png => character.1360.png} | Bin ...{character_1361.png => character.1361.png} | Bin ...{character_1362.png => character.1362.png} | Bin ...{character_1363.png => character.1363.png} | Bin ...{character_1364.png => character.1364.png} | Bin ...{character_1365.png => character.1365.png} | Bin ...{character_1366.png => character.1366.png} | Bin ...{character_1367.png => character.1367.png} | Bin ...{character_1368.png => character.1368.png} | Bin ...{character_1369.png => character.1369.png} | Bin ...{character_1370.png => character.1370.png} | Bin ...{character_1371.png => character.1371.png} | Bin ...{character_1372.png => character.1372.png} | Bin ...{character_1373.png => character.1373.png} | Bin ...{character_1374.png => character.1374.png} | Bin ...{character_1375.png => character.1375.png} | Bin ...{character_1376.png => character.1376.png} | Bin ...{character_1377.png => character.1377.png} | Bin ...{character_1378.png => character.1378.png} | Bin ...{character_1379.png => character.1379.png} | Bin ...{character_1380.png => character.1380.png} | Bin ...{character_1381.png => character.1381.png} | Bin ...{character_1382.png => character.1382.png} | Bin ...{character_1383.png => character.1383.png} | Bin ...{character_1384.png => character.1384.png} | Bin ...{character_1385.png => character.1385.png} | Bin ...{character_1386.png => character.1386.png} | Bin ...{character_1387.png => character.1387.png} | Bin ...{character_1388.png => character.1388.png} | Bin ...{character_1389.png => character.1389.png} | Bin ...{character_1390.png => character.1390.png} | Bin ...{character_1391.png => character.1391.png} | Bin ...{character_1392.png => character.1392.png} | Bin ...{character_1393.png => character.1393.png} | Bin ...{character_1394.png => character.1394.png} | Bin ...{character_1395.png => character.1395.png} | Bin ...{character_1396.png => character.1396.png} | Bin ...{character_1397.png => character.1397.png} | Bin ...{character_1398.png => character.1398.png} | Bin ...{character_1399.png => character.1399.png} | Bin .../{character_140.png => character.140.png} | Bin ...{character_1400.png => character.1400.png} | Bin ...{character_1401.png => character.1401.png} | Bin ...{character_1402.png => character.1402.png} | Bin ...{character_1403.png => character.1403.png} | Bin ...{character_1404.png => character.1404.png} | Bin ...{character_1405.png => character.1405.png} | Bin ...{character_1406.png => character.1406.png} | Bin ...{character_1407.png => character.1407.png} | Bin ...{character_1408.png => character.1408.png} | Bin ...{character_1409.png => character.1409.png} | Bin .../{character_141.png => character.141.png} | Bin ...{character_1410.png => character.1410.png} | Bin ...{character_1411.png => character.1411.png} | Bin ...{character_1414.png => character.1414.png} | Bin ...{character_1415.png => character.1415.png} | Bin ...{character_1416.png => character.1416.png} | Bin ...{character_1417.png => character.1417.png} | Bin ...{character_1418.png => character.1418.png} | Bin ...{character_1419.png => character.1419.png} | Bin .../{character_142.png => character.142.png} | Bin ...{character_1420.png => character.1420.png} | Bin ...{character_1421.png => character.1421.png} | Bin ...{character_1422.png => character.1422.png} | Bin ...{character_1423.png => character.1423.png} | Bin ...{character_1424.png => character.1424.png} | Bin ...{character_1425.png => character.1425.png} | Bin ...{character_1426.png => character.1426.png} | Bin ...{character_1427.png => character.1427.png} | Bin ...{character_1428.png => character.1428.png} | Bin ...{character_1429.png => character.1429.png} | Bin .../{character_143.png => character.143.png} | Bin ...{character_1430.png => character.1430.png} | Bin ...{character_1431.png => character.1431.png} | Bin ...{character_1432.png => character.1432.png} | Bin ...{character_1433.png => character.1433.png} | Bin ...{character_1434.png => character.1434.png} | Bin ...{character_1435.png => character.1435.png} | Bin ...{character_1436.png => character.1436.png} | Bin ...{character_1437.png => character.1437.png} | Bin ...{character_1438.png => character.1438.png} | Bin ...{character_1439.png => character.1439.png} | Bin .../{character_144.png => character.144.png} | Bin ...{character_1440.png => character.1440.png} | Bin ...{character_1441.png => character.1441.png} | Bin ...{character_1442.png => character.1442.png} | Bin ...{character_1443.png => character.1443.png} | Bin ...{character_1444.png => character.1444.png} | Bin ...{character_1445.png => character.1445.png} | Bin .../{character_145.png => character.145.png} | Bin ...{character_1455.png => character.1455.png} | Bin ...{character_1456.png => character.1456.png} | Bin ...{character_1457.png => character.1457.png} | Bin ...{character_1458.png => character.1458.png} | Bin ...{character_1459.png => character.1459.png} | Bin .../{character_146.png => character.146.png} | Bin ...{character_1460.png => character.1460.png} | Bin ...{character_1461.png => character.1461.png} | Bin ...{character_1462.png => character.1462.png} | Bin ...{character_1463.png => character.1463.png} | Bin ...{character_1464.png => character.1464.png} | Bin ...{character_1465.png => character.1465.png} | Bin ...{character_1466.png => character.1466.png} | Bin ...{character_1467.png => character.1467.png} | Bin ...{character_1468.png => character.1468.png} | Bin ...{character_1469.png => character.1469.png} | Bin .../{character_147.png => character.147.png} | Bin ...{character_1470.png => character.1470.png} | Bin ...{character_1471.png => character.1471.png} | Bin ...{character_1472.png => character.1472.png} | Bin ...{character_1473.png => character.1473.png} | Bin ...{character_1474.png => character.1474.png} | Bin ...{character_1475.png => character.1475.png} | Bin ...{character_1476.png => character.1476.png} | Bin ...{character_1477.png => character.1477.png} | Bin ...{character_1478.png => character.1478.png} | Bin ...{character_1479.png => character.1479.png} | Bin .../{character_148.png => character.148.png} | Bin ...{character_1480.png => character.1480.png} | Bin ...{character_1481.png => character.1481.png} | Bin ...{character_1482.png => character.1482.png} | Bin ...{character_1483.png => character.1483.png} | Bin ...{character_1484.png => character.1484.png} | Bin ...{character_1485.png => character.1485.png} | Bin ...{character_1486.png => character.1486.png} | Bin ...{character_1487.png => character.1487.png} | Bin ...{character_1488.png => character.1488.png} | Bin ...{character_1489.png => character.1489.png} | Bin ...{character_1490.png => character.1490.png} | Bin ...{character_1491.png => character.1491.png} | Bin ...{character_1492.png => character.1492.png} | Bin ...{character_1493.png => character.1493.png} | Bin ...{character_1494.png => character.1494.png} | Bin ...{character_1495.png => character.1495.png} | Bin ...{character_1496.png => character.1496.png} | Bin ...{character_1497.png => character.1497.png} | Bin ...{character_1498.png => character.1498.png} | Bin ...{character_1499.png => character.1499.png} | Bin ...{character_1500.png => character.1500.png} | Bin ...{character_1501.png => character.1501.png} | Bin ...{character_1502.png => character.1502.png} | Bin ...{character_1503.png => character.1503.png} | Bin ...{character_1504.png => character.1504.png} | Bin ...{character_1505.png => character.1505.png} | Bin ...{character_1506.png => character.1506.png} | Bin ...{character_1507.png => character.1507.png} | Bin ...{character_1508.png => character.1508.png} | Bin ...{character_1509.png => character.1509.png} | Bin .../{character_151.png => character.151.png} | Bin ...{character_1510.png => character.1510.png} | Bin ...{character_1511.png => character.1511.png} | Bin ...{character_1512.png => character.1512.png} | Bin ...{character_1513.png => character.1513.png} | Bin ...{character_1514.png => character.1514.png} | Bin ...{character_1515.png => character.1515.png} | Bin ...{character_1516.png => character.1516.png} | Bin ...{character_1517.png => character.1517.png} | Bin ...{character_1518.png => character.1518.png} | Bin ...{character_1519.png => character.1519.png} | Bin .../{character_152.png => character.152.png} | Bin ...{character_1520.png => character.1520.png} | Bin ...{character_1521.png => character.1521.png} | Bin ...{character_1522.png => character.1522.png} | Bin ...{character_1523.png => character.1523.png} | Bin ...{character_1524.png => character.1524.png} | Bin ...{character_1525.png => character.1525.png} | Bin ...{character_1526.png => character.1526.png} | Bin ...{character_1527.png => character.1527.png} | Bin ...{character_1528.png => character.1528.png} | Bin ...{character_1529.png => character.1529.png} | Bin .../{character_153.png => character.153.png} | Bin ...{character_1530.png => character.1530.png} | Bin ...{character_1531.png => character.1531.png} | Bin ...{character_1532.png => character.1532.png} | Bin ...{character_1533.png => character.1533.png} | Bin ...{character_1534.png => character.1534.png} | Bin ...{character_1535.png => character.1535.png} | Bin ...{character_1536.png => character.1536.png} | Bin ...{character_1537.png => character.1537.png} | Bin ...{character_1538.png => character.1538.png} | Bin ...{character_1539.png => character.1539.png} | Bin .../{character_154.png => character.154.png} | Bin ...{character_1540.png => character.1540.png} | Bin ...{character_1541.png => character.1541.png} | Bin ...{character_1542.png => character.1542.png} | Bin ...{character_1543.png => character.1543.png} | Bin ...{character_1544.png => character.1544.png} | Bin ...{character_1545.png => character.1545.png} | Bin ...{character_1546.png => character.1546.png} | Bin ...{character_1547.png => character.1547.png} | Bin ...{character_1548.png => character.1548.png} | Bin ...{character_1549.png => character.1549.png} | Bin .../{character_155.png => character.155.png} | Bin ...{character_1550.png => character.1550.png} | Bin ...{character_1551.png => character.1551.png} | Bin ...{character_1552.png => character.1552.png} | Bin ...{character_1553.png => character.1553.png} | Bin ...{character_1554.png => character.1554.png} | Bin ...{character_1555.png => character.1555.png} | Bin ...{character_1556.png => character.1556.png} | Bin ...{character_1557.png => character.1557.png} | Bin ...{character_1558.png => character.1558.png} | Bin ...{character_1559.png => character.1559.png} | Bin .../{character_156.png => character.156.png} | Bin ...{character_1560.png => character.1560.png} | Bin ...{character_1561.png => character.1561.png} | Bin ...{character_1562.png => character.1562.png} | Bin ...{character_1563.png => character.1563.png} | Bin ...{character_1564.png => character.1564.png} | Bin ...{character_1565.png => character.1565.png} | Bin ...{character_1566.png => character.1566.png} | Bin ...{character_1567.png => character.1567.png} | Bin ...{character_1568.png => character.1568.png} | Bin ...{character_1569.png => character.1569.png} | Bin .../{character_157.png => character.157.png} | Bin ...{character_1570.png => character.1570.png} | Bin ...{character_1571.png => character.1571.png} | Bin ...{character_1572.png => character.1572.png} | Bin ...{character_1573.png => character.1573.png} | Bin ...{character_1574.png => character.1574.png} | Bin ...{character_1575.png => character.1575.png} | Bin ...{character_1576.png => character.1576.png} | Bin ...{character_1577.png => character.1577.png} | Bin ...{character_1578.png => character.1578.png} | Bin ...{character_1579.png => character.1579.png} | Bin .../{character_158.png => character.158.png} | Bin ...{character_1580.png => character.1580.png} | Bin ...{character_1581.png => character.1581.png} | Bin ...{character_1582.png => character.1582.png} | Bin ...{character_1583.png => character.1583.png} | Bin ...{character_1584.png => character.1584.png} | Bin ...{character_1585.png => character.1585.png} | Bin ...{character_1586.png => character.1586.png} | Bin ...{character_1587.png => character.1587.png} | Bin ...{character_1588.png => character.1588.png} | Bin ...{character_1589.png => character.1589.png} | Bin .../{character_159.png => character.159.png} | Bin ...{character_1590.png => character.1590.png} | Bin ...{character_1591.png => character.1591.png} | Bin ...{character_1592.png => character.1592.png} | Bin ...{character_1593.png => character.1593.png} | Bin ...{character_1594.png => character.1594.png} | Bin ...{character_1595.png => character.1595.png} | Bin ...{character_1596.png => character.1596.png} | Bin ...{character_1597.png => character.1597.png} | Bin ...{character_1598.png => character.1598.png} | Bin ...{character_1599.png => character.1599.png} | Bin .../{character_160.png => character.160.png} | Bin ...{character_1600.png => character.1600.png} | Bin ...{character_1601.png => character.1601.png} | Bin ...{character_1602.png => character.1602.png} | Bin ...{character_1603.png => character.1603.png} | Bin ...{character_1604.png => character.1604.png} | Bin ...{character_1605.png => character.1605.png} | Bin ...{character_1606.png => character.1606.png} | Bin ...{character_1607.png => character.1607.png} | Bin ...{character_1608.png => character.1608.png} | Bin ...{character_1609.png => character.1609.png} | Bin .../{character_161.png => character.161.png} | Bin ...{character_1610.png => character.1610.png} | Bin ...{character_1611.png => character.1611.png} | Bin ...{character_1612.png => character.1612.png} | Bin ...{character_1613.png => character.1613.png} | Bin ...{character_1614.png => character.1614.png} | Bin ...{character_1615.png => character.1615.png} | Bin ...{character_1616.png => character.1616.png} | Bin ...{character_1617.png => character.1617.png} | Bin ...{character_1618.png => character.1618.png} | Bin ...{character_1619.png => character.1619.png} | Bin .../{character_162.png => character.162.png} | Bin ...{character_1620.png => character.1620.png} | Bin ...{character_1621.png => character.1621.png} | Bin ...{character_1622.png => character.1622.png} | Bin ...{character_1623.png => character.1623.png} | Bin ...{character_1624.png => character.1624.png} | Bin ...{character_1625.png => character.1625.png} | Bin ...{character_1626.png => character.1626.png} | Bin ...{character_1627.png => character.1627.png} | Bin ...{character_1628.png => character.1628.png} | Bin ...{character_1629.png => character.1629.png} | Bin .../{character_163.png => character.163.png} | Bin ...{character_1630.png => character.1630.png} | Bin ...{character_1631.png => character.1631.png} | Bin ...{character_1632.png => character.1632.png} | Bin ...{character_1633.png => character.1633.png} | Bin ...{character_1634.png => character.1634.png} | Bin ...{character_1635.png => character.1635.png} | Bin ...{character_1636.png => character.1636.png} | Bin ...{character_1637.png => character.1637.png} | Bin ...{character_1638.png => character.1638.png} | Bin ...{character_1639.png => character.1639.png} | Bin .../{character_164.png => character.164.png} | Bin ...{character_1640.png => character.1640.png} | Bin ...{character_1641.png => character.1641.png} | Bin ...{character_1642.png => character.1642.png} | Bin ...{character_1643.png => character.1643.png} | Bin ...{character_1644.png => character.1644.png} | Bin ...{character_1645.png => character.1645.png} | Bin ...{character_1646.png => character.1646.png} | Bin ...{character_1647.png => character.1647.png} | Bin ...{character_1648.png => character.1648.png} | Bin ...{character_1649.png => character.1649.png} | Bin .../{character_165.png => character.165.png} | Bin ...{character_1650.png => character.1650.png} | Bin ...{character_1651.png => character.1651.png} | Bin ...{character_1652.png => character.1652.png} | Bin ...{character_1653.png => character.1653.png} | Bin ...{character_1654.png => character.1654.png} | Bin ...{character_1655.png => character.1655.png} | Bin ...{character_1656.png => character.1656.png} | Bin ...{character_1657.png => character.1657.png} | Bin ...{character_1658.png => character.1658.png} | Bin ...{character_1659.png => character.1659.png} | Bin .../{character_166.png => character.166.png} | Bin ...{character_1660.png => character.1660.png} | Bin ...{character_1661.png => character.1661.png} | Bin ...{character_1662.png => character.1662.png} | Bin ...{character_1663.png => character.1663.png} | Bin ...{character_1664.png => character.1664.png} | Bin ...{character_1665.png => character.1665.png} | Bin ...{character_1666.png => character.1666.png} | Bin ...{character_1667.png => character.1667.png} | Bin ...{character_1668.png => character.1668.png} | Bin ...{character_1669.png => character.1669.png} | Bin .../{character_167.png => character.167.png} | Bin ...{character_1670.png => character.1670.png} | Bin ...{character_1671.png => character.1671.png} | Bin ...{character_1672.png => character.1672.png} | Bin ...{character_1673.png => character.1673.png} | Bin ...{character_1674.png => character.1674.png} | Bin ...{character_1675.png => character.1675.png} | Bin ...{character_1676.png => character.1676.png} | Bin ...{character_1677.png => character.1677.png} | Bin ...{character_1678.png => character.1678.png} | Bin ...{character_1679.png => character.1679.png} | Bin .../{character_168.png => character.168.png} | Bin ...{character_1680.png => character.1680.png} | Bin ...{character_1681.png => character.1681.png} | Bin ...{character_1682.png => character.1682.png} | Bin ...{character_1683.png => character.1683.png} | Bin ...{character_1684.png => character.1684.png} | Bin ...{character_1685.png => character.1685.png} | Bin ...{character_1686.png => character.1686.png} | Bin ...{character_1687.png => character.1687.png} | Bin ...{character_1688.png => character.1688.png} | Bin ...{character_1689.png => character.1689.png} | Bin .../{character_169.png => character.169.png} | Bin ...{character_1690.png => character.1690.png} | Bin ...{character_1691.png => character.1691.png} | Bin ...{character_1692.png => character.1692.png} | Bin ...{character_1693.png => character.1693.png} | Bin ...{character_1694.png => character.1694.png} | Bin ...{character_1695.png => character.1695.png} | Bin ...{character_1696.png => character.1696.png} | Bin ...{character_1697.png => character.1697.png} | Bin ...{character_1698.png => character.1698.png} | Bin ...{character_1699.png => character.1699.png} | Bin .../{character_170.png => character.170.png} | Bin ...{character_1700.png => character.1700.png} | Bin ...{character_1701.png => character.1701.png} | Bin ...{character_1702.png => character.1702.png} | Bin ...{character_1703.png => character.1703.png} | Bin ...{character_1704.png => character.1704.png} | Bin ...{character_1705.png => character.1705.png} | Bin ...{character_1706.png => character.1706.png} | Bin ...{character_1707.png => character.1707.png} | Bin ...{character_1708.png => character.1708.png} | Bin ...{character_1709.png => character.1709.png} | Bin .../{character_171.png => character.171.png} | Bin ...{character_1710.png => character.1710.png} | Bin ...{character_1711.png => character.1711.png} | Bin ...{character_1712.png => character.1712.png} | Bin ...{character_1713.png => character.1713.png} | Bin ...{character_1714.png => character.1714.png} | Bin ...{character_1715.png => character.1715.png} | Bin ...{character_1716.png => character.1716.png} | Bin ...{character_1717.png => character.1717.png} | Bin ...{character_1718.png => character.1718.png} | Bin ...{character_1719.png => character.1719.png} | Bin .../{character_172.png => character.172.png} | Bin ...{character_1720.png => character.1720.png} | Bin ...{character_1721.png => character.1721.png} | Bin ...{character_1722.png => character.1722.png} | Bin ...{character_1723.png => character.1723.png} | Bin ...{character_1724.png => character.1724.png} | Bin ...{character_1725.png => character.1725.png} | Bin ...{character_1726.png => character.1726.png} | Bin ...{character_1727.png => character.1727.png} | Bin ...{character_1728.png => character.1728.png} | Bin ...{character_1729.png => character.1729.png} | Bin .../{character_173.png => character.173.png} | Bin ...{character_1730.png => character.1730.png} | Bin ...{character_1731.png => character.1731.png} | Bin ...{character_1732.png => character.1732.png} | Bin ...{character_1733.png => character.1733.png} | Bin ...{character_1734.png => character.1734.png} | Bin ...{character_1735.png => character.1735.png} | Bin ...{character_1736.png => character.1736.png} | Bin ...{character_1737.png => character.1737.png} | Bin ...{character_1738.png => character.1738.png} | Bin ...{character_1739.png => character.1739.png} | Bin .../{character_174.png => character.174.png} | Bin ...{character_1740.png => character.1740.png} | Bin ...{character_1741.png => character.1741.png} | Bin ...{character_1742.png => character.1742.png} | Bin ...{character_1743.png => character.1743.png} | Bin ...{character_1744.png => character.1744.png} | Bin ...{character_1745.png => character.1745.png} | Bin ...{character_1746.png => character.1746.png} | Bin ...{character_1747.png => character.1747.png} | Bin ...{character_1748.png => character.1748.png} | Bin ...{character_1749.png => character.1749.png} | Bin .../{character_175.png => character.175.png} | Bin ...{character_1750.png => character.1750.png} | Bin ...{character_1751.png => character.1751.png} | Bin ...{character_1752.png => character.1752.png} | Bin ...{character_1753.png => character.1753.png} | Bin ...{character_1754.png => character.1754.png} | Bin ...{character_1755.png => character.1755.png} | Bin ...{character_1756.png => character.1756.png} | Bin ...{character_1757.png => character.1757.png} | Bin ...{character_1758.png => character.1758.png} | Bin ...{character_1759.png => character.1759.png} | Bin .../{character_176.png => character.176.png} | Bin ...{character_1760.png => character.1760.png} | Bin ...{character_1761.png => character.1761.png} | Bin ...{character_1762.png => character.1762.png} | Bin ...{character_1763.png => character.1763.png} | Bin ...{character_1764.png => character.1764.png} | Bin ...{character_1765.png => character.1765.png} | Bin ...{character_1766.png => character.1766.png} | Bin ...{character_1767.png => character.1767.png} | Bin ...{character_1768.png => character.1768.png} | Bin ...{character_1769.png => character.1769.png} | Bin .../{character_177.png => character.177.png} | Bin ...{character_1770.png => character.1770.png} | Bin ...{character_1771.png => character.1771.png} | Bin ...{character_1772.png => character.1772.png} | Bin ...{character_1773.png => character.1773.png} | Bin ...{character_1774.png => character.1774.png} | Bin ...{character_1775.png => character.1775.png} | Bin ...{character_1776.png => character.1776.png} | Bin ...{character_1778.png => character.1778.png} | Bin ...{character_1779.png => character.1779.png} | Bin .../{character_178.png => character.178.png} | Bin ...{character_1780.png => character.1780.png} | Bin ...{character_1781.png => character.1781.png} | Bin ...{character_1782.png => character.1782.png} | Bin ...{character_1783.png => character.1783.png} | Bin ...{character_1784.png => character.1784.png} | Bin ...{character_1785.png => character.1785.png} | Bin ...{character_1786.png => character.1786.png} | Bin ...{character_1787.png => character.1787.png} | Bin ...{character_1788.png => character.1788.png} | Bin ...{character_1789.png => character.1789.png} | Bin .../{character_179.png => character.179.png} | Bin ...{character_1790.png => character.1790.png} | Bin ...{character_1791.png => character.1791.png} | Bin ...{character_1792.png => character.1792.png} | Bin ...{character_1793.png => character.1793.png} | Bin ...{character_1794.png => character.1794.png} | Bin ...{character_1796.png => character.1796.png} | Bin ...{character_1797.png => character.1797.png} | Bin ...{character_1798.png => character.1798.png} | Bin ...{character_1799.png => character.1799.png} | Bin .../{character_180.png => character.180.png} | Bin ...{character_1800.png => character.1800.png} | Bin ...{character_1801.png => character.1801.png} | Bin ...{character_1802.png => character.1802.png} | Bin ...{character_1803.png => character.1803.png} | Bin ...{character_1804.png => character.1804.png} | Bin ...{character_1805.png => character.1805.png} | Bin ...{character_1806.png => character.1806.png} | Bin ...{character_1807.png => character.1807.png} | Bin ...{character_1808.png => character.1808.png} | Bin ...{character_1809.png => character.1809.png} | Bin .../{character_181.png => character.181.png} | Bin ...{character_1810.png => character.1810.png} | Bin ...{character_1811.png => character.1811.png} | Bin ...{character_1812.png => character.1812.png} | Bin ...{character_1813.png => character.1813.png} | Bin ...{character_1814.png => character.1814.png} | Bin ...{character_1815.png => character.1815.png} | Bin ...{character_1816.png => character.1816.png} | Bin ...{character_1817.png => character.1817.png} | Bin ...{character_1818.png => character.1818.png} | Bin ...{character_1819.png => character.1819.png} | Bin .../{character_182.png => character.182.png} | Bin ...{character_1820.png => character.1820.png} | Bin ...{character_1821.png => character.1821.png} | Bin ...{character_1822.png => character.1822.png} | Bin ...{character_1823.png => character.1823.png} | Bin ...{character_1824.png => character.1824.png} | Bin ...{character_1825.png => character.1825.png} | Bin ...{character_1826.png => character.1826.png} | Bin ...{character_1827.png => character.1827.png} | Bin ...{character_1828.png => character.1828.png} | Bin ...{character_1829.png => character.1829.png} | Bin .../{character_183.png => character.183.png} | Bin ...{character_1830.png => character.1830.png} | Bin ...{character_1831.png => character.1831.png} | Bin ...{character_1832.png => character.1832.png} | Bin ...{character_1833.png => character.1833.png} | Bin ...{character_1834.png => character.1834.png} | Bin ...{character_1835.png => character.1835.png} | Bin ...{character_1836.png => character.1836.png} | Bin ...{character_1837.png => character.1837.png} | Bin ...{character_1838.png => character.1838.png} | Bin ...{character_1839.png => character.1839.png} | Bin .../{character_184.png => character.184.png} | Bin ...{character_1840.png => character.1840.png} | Bin ...{character_1841.png => character.1841.png} | Bin ...{character_1842.png => character.1842.png} | Bin ...{character_1843.png => character.1843.png} | Bin ...{character_1844.png => character.1844.png} | Bin ...{character_1845.png => character.1845.png} | Bin ...{character_1846.png => character.1846.png} | Bin ...{character_1847.png => character.1847.png} | Bin ...{character_1848.png => character.1848.png} | Bin ...{character_1849.png => character.1849.png} | Bin .../{character_185.png => character.185.png} | Bin ...{character_1850.png => character.1850.png} | Bin ...{character_1851.png => character.1851.png} | Bin ...{character_1852.png => character.1852.png} | Bin ...{character_1853.png => character.1853.png} | Bin ...{character_1854.png => character.1854.png} | Bin ...{character_1855.png => character.1855.png} | Bin ...{character_1856.png => character.1856.png} | Bin ...{character_1857.png => character.1857.png} | Bin ...{character_1858.png => character.1858.png} | Bin ...{character_1859.png => character.1859.png} | Bin .../{character_186.png => character.186.png} | Bin ...{character_1860.png => character.1860.png} | Bin ...{character_1861.png => character.1861.png} | Bin ...{character_1862.png => character.1862.png} | Bin ...{character_1863.png => character.1863.png} | Bin ...{character_1864.png => character.1864.png} | Bin ...{character_1865.png => character.1865.png} | Bin ...{character_1866.png => character.1866.png} | Bin ...{character_1867.png => character.1867.png} | Bin ...{character_1868.png => character.1868.png} | Bin ...{character_1869.png => character.1869.png} | Bin .../{character_187.png => character.187.png} | Bin ...{character_1870.png => character.1870.png} | Bin ...{character_1871.png => character.1871.png} | Bin ...{character_1872.png => character.1872.png} | Bin ...{character_1873.png => character.1873.png} | Bin ...{character_1874.png => character.1874.png} | Bin ...{character_1875.png => character.1875.png} | Bin ...{character_1876.png => character.1876.png} | Bin ...{character_1877.png => character.1877.png} | Bin ...{character_1878.png => character.1878.png} | Bin ...{character_1879.png => character.1879.png} | Bin .../{character_188.png => character.188.png} | Bin ...{character_1880.png => character.1880.png} | Bin ...{character_1881.png => character.1881.png} | Bin ...{character_1882.png => character.1882.png} | Bin ...{character_1883.png => character.1883.png} | Bin ...{character_1884.png => character.1884.png} | Bin ...{character_1885.png => character.1885.png} | Bin ...{character_1886.png => character.1886.png} | Bin ...{character_1887.png => character.1887.png} | Bin ...{character_1888.png => character.1888.png} | Bin ...{character_1889.png => character.1889.png} | Bin .../{character_189.png => character.189.png} | Bin ...{character_1890.png => character.1890.png} | Bin ...{character_1891.png => character.1891.png} | Bin ...{character_1892.png => character.1892.png} | Bin ...{character_1893.png => character.1893.png} | Bin ...{character_1894.png => character.1894.png} | Bin ...{character_1895.png => character.1895.png} | Bin ...{character_1896.png => character.1896.png} | Bin ...{character_1897.png => character.1897.png} | Bin ...{character_1898.png => character.1898.png} | Bin ...{character_1899.png => character.1899.png} | Bin .../{character_19.png => character.19.png} | Bin .../{character_190.png => character.190.png} | Bin ...{character_1900.png => character.1900.png} | Bin ...{character_1901.png => character.1901.png} | Bin ...{character_1902.png => character.1902.png} | Bin ...{character_1903.png => character.1903.png} | Bin ...{character_1904.png => character.1904.png} | Bin ...{character_1905.png => character.1905.png} | Bin ...{character_1906.png => character.1906.png} | Bin ...{character_1907.png => character.1907.png} | Bin ...{character_1908.png => character.1908.png} | Bin ...{character_1909.png => character.1909.png} | Bin .../{character_191.png => character.191.png} | Bin ...{character_1910.png => character.1910.png} | Bin ...{character_1911.png => character.1911.png} | Bin ...{character_1912.png => character.1912.png} | Bin ...{character_1913.png => character.1913.png} | Bin ...{character_1914.png => character.1914.png} | Bin ...{character_1915.png => character.1915.png} | Bin ...{character_1916.png => character.1916.png} | Bin ...{character_1917.png => character.1917.png} | Bin ...{character_1918.png => character.1918.png} | Bin ...{character_1919.png => character.1919.png} | Bin .../{character_192.png => character.192.png} | Bin ...{character_1920.png => character.1920.png} | Bin ...{character_1921.png => character.1921.png} | Bin ...{character_1922.png => character.1922.png} | Bin ...{character_1923.png => character.1923.png} | Bin ...{character_1924.png => character.1924.png} | Bin ...{character_1925.png => character.1925.png} | Bin ...{character_1926.png => character.1926.png} | Bin ...{character_1927.png => character.1927.png} | Bin ...{character_1928.png => character.1928.png} | Bin ...{character_1929.png => character.1929.png} | Bin .../{character_193.png => character.193.png} | Bin ...{character_1930.png => character.1930.png} | Bin ...{character_1931.png => character.1931.png} | Bin ...{character_1932.png => character.1932.png} | Bin ...{character_1933.png => character.1933.png} | Bin ...{character_1934.png => character.1934.png} | Bin ...{character_1935.png => character.1935.png} | Bin ...{character_1937.png => character.1937.png} | Bin ...{character_1938.png => character.1938.png} | Bin ...{character_1939.png => character.1939.png} | Bin .../{character_194.png => character.194.png} | Bin ...{character_1940.png => character.1940.png} | Bin ...{character_1941.png => character.1941.png} | Bin ...{character_1942.png => character.1942.png} | Bin ...{character_1943.png => character.1943.png} | Bin ...{character_1944.png => character.1944.png} | Bin ...{character_1945.png => character.1945.png} | Bin ...{character_1946.png => character.1946.png} | Bin ...{character_1947.png => character.1947.png} | Bin ...{character_1948.png => character.1948.png} | Bin ...{character_1949.png => character.1949.png} | Bin .../{character_195.png => character.195.png} | Bin ...{character_1950.png => character.1950.png} | Bin ...{character_1951.png => character.1951.png} | Bin ...{character_1952.png => character.1952.png} | Bin ...{character_1953.png => character.1953.png} | Bin ...{character_1954.png => character.1954.png} | Bin ...{character_1955.png => character.1955.png} | Bin ...{character_1956.png => character.1956.png} | Bin ...{character_1957.png => character.1957.png} | Bin ...{character_1958.png => character.1958.png} | Bin ...{character_1959.png => character.1959.png} | Bin .../{character_196.png => character.196.png} | Bin ...{character_1960.png => character.1960.png} | Bin ...{character_1961.png => character.1961.png} | Bin ...{character_1962.png => character.1962.png} | Bin ...{character_1963.png => character.1963.png} | Bin ...{character_1964.png => character.1964.png} | Bin ...{character_1965.png => character.1965.png} | Bin ...{character_1966.png => character.1966.png} | Bin ...{character_1967.png => character.1967.png} | Bin ...{character_1968.png => character.1968.png} | Bin ...{character_1969.png => character.1969.png} | Bin .../{character_197.png => character.197.png} | Bin ...{character_1970.png => character.1970.png} | Bin ...{character_1971.png => character.1971.png} | Bin ...{character_1972.png => character.1972.png} | Bin ...{character_1973.png => character.1973.png} | Bin ...{character_1974.png => character.1974.png} | Bin ...{character_1975.png => character.1975.png} | Bin ...{character_1976.png => character.1976.png} | Bin ...{character_1977.png => character.1977.png} | Bin ...{character_1978.png => character.1978.png} | Bin ...{character_1979.png => character.1979.png} | Bin .../{character_198.png => character.198.png} | Bin ...{character_1980.png => character.1980.png} | Bin ...{character_1981.png => character.1981.png} | Bin ...{character_1982.png => character.1982.png} | Bin ...{character_1983.png => character.1983.png} | Bin ...{character_1984.png => character.1984.png} | Bin ...{character_1985.png => character.1985.png} | Bin ...{character_1986.png => character.1986.png} | Bin ...{character_1987.png => character.1987.png} | Bin ...{character_1988.png => character.1988.png} | Bin ...{character_1989.png => character.1989.png} | Bin .../{character_199.png => character.199.png} | Bin ...{character_1990.png => character.1990.png} | Bin ...{character_1991.png => character.1991.png} | Bin ...{character_1992.png => character.1992.png} | Bin ...{character_1993.png => character.1993.png} | Bin ...{character_1994.png => character.1994.png} | Bin ...{character_1995.png => character.1995.png} | Bin ...{character_1996.png => character.1996.png} | Bin ...{character_1997.png => character.1997.png} | Bin ...{character_1998.png => character.1998.png} | Bin ...{character_1999.png => character.1999.png} | Bin .../{character_2.png => character.2.png} | Bin .../{character_20.png => character.20.png} | Bin .../{character_200.png => character.200.png} | Bin ...{character_2000.png => character.2000.png} | Bin ...{character_2001.png => character.2001.png} | Bin ...{character_2002.png => character.2002.png} | Bin ...{character_2003.png => character.2003.png} | Bin ...{character_2004.png => character.2004.png} | Bin ...{character_2005.png => character.2005.png} | Bin ...{character_2006.png => character.2006.png} | Bin ...{character_2007.png => character.2007.png} | Bin ...{character_2008.png => character.2008.png} | Bin ...{character_2009.png => character.2009.png} | Bin .../{character_201.png => character.201.png} | Bin ...{character_2010.png => character.2010.png} | Bin ...{character_2011.png => character.2011.png} | Bin ...{character_2012.png => character.2012.png} | Bin ...{character_2013.png => character.2013.png} | Bin ...{character_2014.png => character.2014.png} | Bin ...{character_2015.png => character.2015.png} | Bin ...{character_2016.png => character.2016.png} | Bin ...{character_2017.png => character.2017.png} | Bin ...{character_2018.png => character.2018.png} | Bin ...{character_2019.png => character.2019.png} | Bin ...{character_2020.png => character.2020.png} | Bin ...{character_2021.png => character.2021.png} | Bin ...{character_2022.png => character.2022.png} | Bin ...{character_2023.png => character.2023.png} | Bin ...{character_2024.png => character.2024.png} | Bin ...{character_2025.png => character.2025.png} | Bin ...{character_2026.png => character.2026.png} | Bin ...{character_2027.png => character.2027.png} | Bin ...{character_2028.png => character.2028.png} | Bin ...{character_2029.png => character.2029.png} | Bin .../{character_203.png => character.203.png} | Bin ...{character_2030.png => character.2030.png} | Bin ...{character_2031.png => character.2031.png} | Bin ...{character_2032.png => character.2032.png} | Bin ...{character_2033.png => character.2033.png} | Bin ...{character_2034.png => character.2034.png} | Bin ...{character_2035.png => character.2035.png} | Bin ...{character_2036.png => character.2036.png} | Bin ...{character_2037.png => character.2037.png} | Bin ...{character_2038.png => character.2038.png} | Bin ...{character_2039.png => character.2039.png} | Bin ...{character_2040.png => character.2040.png} | Bin ...{character_2041.png => character.2041.png} | Bin ...{character_2042.png => character.2042.png} | Bin ...{character_2043.png => character.2043.png} | Bin ...{character_2044.png => character.2044.png} | Bin ...{character_2045.png => character.2045.png} | Bin ...{character_2046.png => character.2046.png} | Bin ...{character_2047.png => character.2047.png} | Bin ...{character_2048.png => character.2048.png} | Bin ...{character_2049.png => character.2049.png} | Bin .../{character_205.png => character.205.png} | Bin ...{character_2050.png => character.2050.png} | Bin ...{character_2051.png => character.2051.png} | Bin ...{character_2052.png => character.2052.png} | Bin ...{character_2053.png => character.2053.png} | Bin ...{character_2054.png => character.2054.png} | Bin ...{character_2055.png => character.2055.png} | Bin ...{character_2056.png => character.2056.png} | Bin ...{character_2057.png => character.2057.png} | Bin ...{character_2058.png => character.2058.png} | Bin ...{character_2059.png => character.2059.png} | Bin .../{character_206.png => character.206.png} | Bin ...{character_2060.png => character.2060.png} | Bin ...{character_2061.png => character.2061.png} | Bin ...{character_2062.png => character.2062.png} | Bin ...{character_2063.png => character.2063.png} | Bin ...{character_2064.png => character.2064.png} | Bin ...{character_2065.png => character.2065.png} | Bin ...{character_2066.png => character.2066.png} | Bin ...{character_2067.png => character.2067.png} | Bin ...{character_2068.png => character.2068.png} | Bin ...{character_2069.png => character.2069.png} | Bin .../{character_207.png => character.207.png} | Bin ...{character_2070.png => character.2070.png} | Bin ...{character_2071.png => character.2071.png} | Bin ...{character_2072.png => character.2072.png} | Bin ...{character_2073.png => character.2073.png} | Bin ...{character_2074.png => character.2074.png} | Bin ...{character_2075.png => character.2075.png} | Bin ...{character_2076.png => character.2076.png} | Bin ...{character_2077.png => character.2077.png} | Bin ...{character_2078.png => character.2078.png} | Bin ...{character_2079.png => character.2079.png} | Bin .../{character_208.png => character.208.png} | Bin ...{character_2080.png => character.2080.png} | Bin ...{character_2081.png => character.2081.png} | Bin ...{character_2082.png => character.2082.png} | Bin ...{character_2083.png => character.2083.png} | Bin ...{character_2084.png => character.2084.png} | Bin ...{character_2085.png => character.2085.png} | Bin ...{character_2086.png => character.2086.png} | Bin ...{character_2087.png => character.2087.png} | Bin ...{character_2088.png => character.2088.png} | Bin ...{character_2089.png => character.2089.png} | Bin .../{character_209.png => character.209.png} | Bin ...{character_2090.png => character.2090.png} | Bin ...{character_2091.png => character.2091.png} | Bin ...{character_2092.png => character.2092.png} | Bin ...{character_2093.png => character.2093.png} | Bin ...{character_2094.png => character.2094.png} | Bin ...{character_2095.png => character.2095.png} | Bin ...{character_2096.png => character.2096.png} | Bin ...{character_2097.png => character.2097.png} | Bin ...{character_2098.png => character.2098.png} | Bin ...{character_2099.png => character.2099.png} | Bin .../{character_21.png => character.21.png} | Bin .../{character_210.png => character.210.png} | Bin ...{character_2100.png => character.2100.png} | Bin ...{character_2101.png => character.2101.png} | Bin ...{character_2102.png => character.2102.png} | Bin ...{character_2103.png => character.2103.png} | Bin ...{character_2104.png => character.2104.png} | Bin ...{character_2105.png => character.2105.png} | Bin ...{character_2106.png => character.2106.png} | Bin ...{character_2107.png => character.2107.png} | Bin ...{character_2108.png => character.2108.png} | Bin ...{character_2109.png => character.2109.png} | Bin .../{character_211.png => character.211.png} | Bin ...{character_2110.png => character.2110.png} | Bin ...{character_2111.png => character.2111.png} | Bin ...{character_2112.png => character.2112.png} | Bin ...{character_2114.png => character.2114.png} | Bin ...{character_2115.png => character.2115.png} | Bin ...{character_2116.png => character.2116.png} | Bin ...{character_2117.png => character.2117.png} | Bin ...{character_2118.png => character.2118.png} | Bin ...{character_2119.png => character.2119.png} | Bin .../{character_212.png => character.212.png} | Bin ...{character_2120.png => character.2120.png} | Bin ...{character_2121.png => character.2121.png} | Bin ...{character_2122.png => character.2122.png} | Bin ...{character_2123.png => character.2123.png} | Bin ...{character_2124.png => character.2124.png} | Bin ...{character_2125.png => character.2125.png} | Bin ...{character_2126.png => character.2126.png} | Bin ...{character_2127.png => character.2127.png} | Bin ...{character_2128.png => character.2128.png} | Bin ...{character_2129.png => character.2129.png} | Bin .../{character_213.png => character.213.png} | Bin ...{character_2130.png => character.2130.png} | Bin ...{character_2131.png => character.2131.png} | Bin ...{character_2132.png => character.2132.png} | Bin ...{character_2133.png => character.2133.png} | Bin ...{character_2134.png => character.2134.png} | Bin ...{character_2135.png => character.2135.png} | Bin ...{character_2136.png => character.2136.png} | Bin ...{character_2137.png => character.2137.png} | Bin ...{character_2138.png => character.2138.png} | Bin ...{character_2139.png => character.2139.png} | Bin .../{character_214.png => character.214.png} | Bin ...{character_2140.png => character.2140.png} | Bin ...{character_2141.png => character.2141.png} | Bin ...{character_2142.png => character.2142.png} | Bin ...{character_2143.png => character.2143.png} | Bin ...{character_2144.png => character.2144.png} | Bin ...{character_2145.png => character.2145.png} | Bin ...{character_2146.png => character.2146.png} | Bin ...{character_2147.png => character.2147.png} | Bin ...{character_2148.png => character.2148.png} | Bin ...{character_2149.png => character.2149.png} | Bin .../{character_215.png => character.215.png} | Bin ...{character_2150.png => character.2150.png} | Bin ...{character_2151.png => character.2151.png} | Bin ...{character_2152.png => character.2152.png} | Bin ...{character_2153.png => character.2153.png} | Bin mods/skinsdb/textures/character.2154.png | Bin 0 -> 1863 bytes mods/skinsdb/textures/character.2155.png | Bin 0 -> 1829 bytes mods/skinsdb/textures/character.2156.png | Bin 0 -> 1256 bytes mods/skinsdb/textures/character.2157.png | Bin 0 -> 1113 bytes mods/skinsdb/textures/character.2158.png | Bin 0 -> 1059 bytes mods/skinsdb/textures/character.2159.png | Bin 0 -> 1648 bytes .../{character_216.png => character.216.png} | Bin mods/skinsdb/textures/character.2160.png | Bin 0 -> 687 bytes mods/skinsdb/textures/character.2161.png | Bin 0 -> 660 bytes mods/skinsdb/textures/character.2162.png | Bin 0 -> 1109 bytes mods/skinsdb/textures/character.2163.png | Bin 0 -> 763 bytes mods/skinsdb/textures/character.2164.png | Bin 0 -> 894 bytes mods/skinsdb/textures/character.2165.png | Bin 0 -> 2182 bytes mods/skinsdb/textures/character.2166.png | Bin 0 -> 1715 bytes mods/skinsdb/textures/character.2167.png | Bin 0 -> 1600 bytes mods/skinsdb/textures/character.2168.png | Bin 0 -> 1587 bytes mods/skinsdb/textures/character.2169.png | Bin 0 -> 1600 bytes .../{character_217.png => character.217.png} | Bin mods/skinsdb/textures/character.2170.png | Bin 0 -> 2831 bytes mods/skinsdb/textures/character.2171.png | Bin 0 -> 2254 bytes mods/skinsdb/textures/character.2172.png | Bin 0 -> 8734 bytes mods/skinsdb/textures/character.2173.png | Bin 0 -> 598 bytes mods/skinsdb/textures/character.2174.png | Bin 0 -> 1008 bytes mods/skinsdb/textures/character.2175.png | Bin 0 -> 1280 bytes mods/skinsdb/textures/character.2176.png | Bin 0 -> 2099 bytes mods/skinsdb/textures/character.2177.png | Bin 0 -> 601 bytes mods/skinsdb/textures/character.2178.png | Bin 0 -> 1238 bytes mods/skinsdb/textures/character.2179.png | Bin 0 -> 2634 bytes .../{character_218.png => character.218.png} | Bin mods/skinsdb/textures/character.2180.png | Bin 0 -> 1320 bytes mods/skinsdb/textures/character.2181.png | Bin 0 -> 1357 bytes mods/skinsdb/textures/character.2182.png | Bin 0 -> 1810 bytes mods/skinsdb/textures/character.2183.png | Bin 0 -> 1273 bytes mods/skinsdb/textures/character.2184.png | Bin 0 -> 2355 bytes mods/skinsdb/textures/character.2185.png | Bin 0 -> 1328 bytes mods/skinsdb/textures/character.2186.png | Bin 0 -> 1710 bytes mods/skinsdb/textures/character.2187.png | Bin 0 -> 1310 bytes mods/skinsdb/textures/character.2188.png | Bin 0 -> 1294 bytes mods/skinsdb/textures/character.2189.png | Bin 0 -> 8890 bytes .../{character_219.png => character.219.png} | Bin mods/skinsdb/textures/character.2190.png | Bin 0 -> 10891 bytes mods/skinsdb/textures/character.2191.png | Bin 0 -> 1000 bytes mods/skinsdb/textures/character.2192.png | Bin 0 -> 1615 bytes mods/skinsdb/textures/character.2193.png | Bin 0 -> 1634 bytes mods/skinsdb/textures/character.2194.png | Bin 0 -> 2024 bytes mods/skinsdb/textures/character.2195.png | Bin 0 -> 2098 bytes mods/skinsdb/textures/character.2196.png | Bin 0 -> 8996 bytes mods/skinsdb/textures/character.2197.png | Bin 0 -> 8977 bytes mods/skinsdb/textures/character.2198.png | Bin 0 -> 430 bytes mods/skinsdb/textures/character.2199.png | Bin 0 -> 49151 bytes .../{character_22.png => character.22.png} | Bin .../{character_220.png => character.220.png} | Bin mods/skinsdb/textures/character.2200.png | Bin 0 -> 2606 bytes mods/skinsdb/textures/character.2201.png | Bin 0 -> 6192 bytes mods/skinsdb/textures/character.2202.png | Bin 0 -> 8189 bytes mods/skinsdb/textures/character.2203.png | Bin 0 -> 333 bytes mods/skinsdb/textures/character.2204.png | Bin 0 -> 1984 bytes mods/skinsdb/textures/character.2205.png | Bin 0 -> 2733 bytes mods/skinsdb/textures/character.2206.png | Bin 0 -> 1575 bytes mods/skinsdb/textures/character.2207.png | Bin 0 -> 2196 bytes mods/skinsdb/textures/character.2208.png | Bin 0 -> 3286 bytes mods/skinsdb/textures/character.2209.png | Bin 0 -> 8243 bytes .../{character_221.png => character.221.png} | Bin mods/skinsdb/textures/character.2210.png | Bin 0 -> 8236 bytes mods/skinsdb/textures/character.2211.png | Bin 0 -> 7674 bytes mods/skinsdb/textures/character.2212.png | Bin 0 -> 1190 bytes mods/skinsdb/textures/character.2213.png | Bin 0 -> 814 bytes mods/skinsdb/textures/character.2214.png | Bin 0 -> 2016 bytes mods/skinsdb/textures/character.2215.png | Bin 0 -> 2387 bytes mods/skinsdb/textures/character.2216.png | Bin 0 -> 1385 bytes mods/skinsdb/textures/character.2217.png | Bin 0 -> 2842 bytes mods/skinsdb/textures/character.2218.png | Bin 0 -> 1223 bytes mods/skinsdb/textures/character.2219.png | Bin 0 -> 2606 bytes .../{character_222.png => character.222.png} | Bin mods/skinsdb/textures/character.2220.png | Bin 0 -> 1924 bytes mods/skinsdb/textures/character.2221.png | Bin 0 -> 1539 bytes mods/skinsdb/textures/character.2222.png | Bin 0 -> 1423 bytes mods/skinsdb/textures/character.2223.png | Bin 0 -> 2166 bytes mods/skinsdb/textures/character.2224.png | Bin 0 -> 2019 bytes mods/skinsdb/textures/character.2225.png | Bin 0 -> 1891 bytes mods/skinsdb/textures/character.2226.png | Bin 0 -> 2206 bytes mods/skinsdb/textures/character.2227.png | Bin 0 -> 3028 bytes mods/skinsdb/textures/character.2228.png | Bin 0 -> 2496 bytes mods/skinsdb/textures/character.2229.png | Bin 0 -> 9282 bytes .../{character_223.png => character.223.png} | Bin mods/skinsdb/textures/character.2230.png | Bin 0 -> 1539 bytes mods/skinsdb/textures/character.2231.png | Bin 0 -> 1410 bytes mods/skinsdb/textures/character.2232.png | Bin 0 -> 354 bytes mods/skinsdb/textures/character.2233.png | Bin 0 -> 1303 bytes mods/skinsdb/textures/character.2234.png | Bin 0 -> 1767 bytes mods/skinsdb/textures/character.2235.png | Bin 0 -> 1383 bytes mods/skinsdb/textures/character.2236.png | Bin 0 -> 1754 bytes mods/skinsdb/textures/character.2237.png | Bin 0 -> 10556 bytes mods/skinsdb/textures/character.2238.png | Bin 0 -> 1182 bytes mods/skinsdb/textures/character.2239.png | Bin 0 -> 1409 bytes .../{character_224.png => character.224.png} | Bin mods/skinsdb/textures/character.2240.png | Bin 0 -> 1992 bytes mods/skinsdb/textures/character.2241.png | Bin 0 -> 1408 bytes mods/skinsdb/textures/character.2242.png | Bin 0 -> 1065 bytes mods/skinsdb/textures/character.2243.png | Bin 0 -> 2443 bytes mods/skinsdb/textures/character.2244.png | Bin 0 -> 3781 bytes mods/skinsdb/textures/character.2245.png | Bin 0 -> 3803 bytes mods/skinsdb/textures/character.2246.png | Bin 0 -> 3503 bytes mods/skinsdb/textures/character.2247.png | Bin 0 -> 2783 bytes mods/skinsdb/textures/character.2248.png | Bin 0 -> 4337 bytes mods/skinsdb/textures/character.2249.png | Bin 0 -> 1216 bytes .../{character_225.png => character.225.png} | Bin mods/skinsdb/textures/character.2250.png | Bin 0 -> 1347 bytes mods/skinsdb/textures/character.2251.png | Bin 0 -> 1528 bytes mods/skinsdb/textures/character.2252.png | Bin 0 -> 2040 bytes mods/skinsdb/textures/character.2253.png | Bin 0 -> 2035 bytes mods/skinsdb/textures/character.2254.png | Bin 0 -> 2007 bytes mods/skinsdb/textures/character.2255.png | Bin 0 -> 11018 bytes mods/skinsdb/textures/character.2256.png | Bin 0 -> 1458 bytes mods/skinsdb/textures/character.2257.png | Bin 0 -> 3705 bytes mods/skinsdb/textures/character.2258.png | Bin 0 -> 6697 bytes mods/skinsdb/textures/character.2259.png | Bin 0 -> 2268 bytes mods/skinsdb/textures/character.2260.png | Bin 0 -> 2226 bytes mods/skinsdb/textures/character.2261.png | Bin 0 -> 3493 bytes mods/skinsdb/textures/character.2262.png | Bin 0 -> 4478 bytes mods/skinsdb/textures/character.2263.png | Bin 0 -> 2472 bytes mods/skinsdb/textures/character.2264.png | Bin 0 -> 2195 bytes mods/skinsdb/textures/character.2277.png | Bin 0 -> 3947 bytes mods/skinsdb/textures/character.2278.png | Bin 0 -> 3321 bytes mods/skinsdb/textures/character.2279.png | Bin 0 -> 4610 bytes .../{character_228.png => character.228.png} | Bin mods/skinsdb/textures/character.2280.png | Bin 0 -> 3589 bytes mods/skinsdb/textures/character.2281.png | Bin 0 -> 4038 bytes mods/skinsdb/textures/character.2282.png | Bin 0 -> 3721 bytes mods/skinsdb/textures/character.2283.png | Bin 0 -> 4614 bytes mods/skinsdb/textures/character.2284.png | Bin 0 -> 3390 bytes mods/skinsdb/textures/character.2285.png | Bin 0 -> 1578 bytes mods/skinsdb/textures/character.2286.png | Bin 0 -> 2211 bytes mods/skinsdb/textures/character.2287.png | Bin 0 -> 3824 bytes mods/skinsdb/textures/character.2288.png | Bin 0 -> 2048 bytes mods/skinsdb/textures/character.2289.png | Bin 0 -> 2617 bytes .../{character_229.png => character.229.png} | Bin mods/skinsdb/textures/character.2290.png | Bin 0 -> 3005 bytes mods/skinsdb/textures/character.2291.png | Bin 0 -> 3051 bytes mods/skinsdb/textures/character.2292.png | Bin 0 -> 3054 bytes mods/skinsdb/textures/character.2293.png | Bin 0 -> 2958 bytes mods/skinsdb/textures/character.2294.png | Bin 0 -> 1520 bytes mods/skinsdb/textures/character.2295.png | Bin 0 -> 1671 bytes mods/skinsdb/textures/character.2296.png | Bin 0 -> 1122 bytes mods/skinsdb/textures/character.2297.png | Bin 0 -> 3993 bytes mods/skinsdb/textures/character.2298.png | Bin 0 -> 949 bytes mods/skinsdb/textures/character.2299.png | Bin 0 -> 2114 bytes .../{character_230.png => character.230.png} | Bin mods/skinsdb/textures/character.2300.png | Bin 0 -> 2233 bytes mods/skinsdb/textures/character.2301.png | Bin 0 -> 3578 bytes mods/skinsdb/textures/character.2302.png | Bin 0 -> 3961 bytes mods/skinsdb/textures/character.2303.png | Bin 0 -> 10338 bytes mods/skinsdb/textures/character.2304.png | Bin 0 -> 13215 bytes mods/skinsdb/textures/character.2305.png | Bin 0 -> 4299 bytes mods/skinsdb/textures/character.2306.png | Bin 0 -> 3085 bytes mods/skinsdb/textures/character.2307.png | Bin 0 -> 4853 bytes mods/skinsdb/textures/character.2308.png | Bin 0 -> 770 bytes mods/skinsdb/textures/character.2309.png | Bin 0 -> 1211 bytes .../{character_231.png => character.231.png} | Bin mods/skinsdb/textures/character.2310.png | Bin 0 -> 11206 bytes mods/skinsdb/textures/character.2311.png | Bin 0 -> 3040 bytes mods/skinsdb/textures/character.2312.png | Bin 0 -> 2335 bytes mods/skinsdb/textures/character.2313.png | Bin 0 -> 5136 bytes mods/skinsdb/textures/character.2314.png | Bin 0 -> 4438 bytes mods/skinsdb/textures/character.2315.png | Bin 0 -> 7837 bytes mods/skinsdb/textures/character.2316.png | Bin 0 -> 1575 bytes mods/skinsdb/textures/character.2317.png | Bin 0 -> 4489 bytes mods/skinsdb/textures/character.2318.png | Bin 0 -> 4060 bytes mods/skinsdb/textures/character.2319.png | Bin 0 -> 2349 bytes .../{character_232.png => character.232.png} | Bin mods/skinsdb/textures/character.2320.png | Bin 0 -> 2321 bytes mods/skinsdb/textures/character.2321.png | Bin 0 -> 3398 bytes mods/skinsdb/textures/character.2322.png | Bin 0 -> 4767 bytes mods/skinsdb/textures/character.2323.png | Bin 0 -> 2289 bytes mods/skinsdb/textures/character.2324.png | Bin 0 -> 2318 bytes mods/skinsdb/textures/character.2325.png | Bin 0 -> 2335 bytes mods/skinsdb/textures/character.2326.png | Bin 0 -> 2418 bytes mods/skinsdb/textures/character.2327.png | Bin 0 -> 1841 bytes mods/skinsdb/textures/character.2328.png | Bin 0 -> 1778 bytes mods/skinsdb/textures/character.2329.png | Bin 0 -> 4582 bytes .../{character_233.png => character.233.png} | Bin mods/skinsdb/textures/character.2330.png | Bin 0 -> 3249 bytes mods/skinsdb/textures/character.2331.png | Bin 0 -> 2204 bytes mods/skinsdb/textures/character.2332.png | Bin 0 -> 2656 bytes mods/skinsdb/textures/character.2333.png | Bin 0 -> 2467 bytes mods/skinsdb/textures/character.2334.png | Bin 0 -> 971 bytes mods/skinsdb/textures/character.2335.png | Bin 0 -> 4350 bytes mods/skinsdb/textures/character.2336.png | Bin 0 -> 4717 bytes mods/skinsdb/textures/character.2337.png | Bin 0 -> 4396 bytes mods/skinsdb/textures/character.2338.png | Bin 0 -> 3301 bytes mods/skinsdb/textures/character.2339.png | Bin 0 -> 3672 bytes .../{character_234.png => character.234.png} | Bin mods/skinsdb/textures/character.2340.png | Bin 0 -> 3703 bytes mods/skinsdb/textures/character.2341.png | Bin 0 -> 3409 bytes mods/skinsdb/textures/character.2342.png | Bin 0 -> 3358 bytes mods/skinsdb/textures/character.2343.png | Bin 0 -> 3212 bytes mods/skinsdb/textures/character.2344.png | Bin 0 -> 3621 bytes mods/skinsdb/textures/character.2345.png | Bin 0 -> 3607 bytes mods/skinsdb/textures/character.2346.png | Bin 0 -> 3558 bytes mods/skinsdb/textures/character.2347.png | Bin 0 -> 3548 bytes mods/skinsdb/textures/character.2348.png | Bin 0 -> 2844 bytes mods/skinsdb/textures/character.2349.png | Bin 0 -> 2265 bytes .../{character_235.png => character.235.png} | Bin mods/skinsdb/textures/character.2350.png | Bin 0 -> 3096 bytes mods/skinsdb/textures/character.2351.png | Bin 0 -> 1490 bytes .../{character_237.png => character.237.png} | Bin .../{character_239.png => character.239.png} | Bin .../{character_24.png => character.24.png} | Bin .../{character_241.png => character.241.png} | Bin .../{character_242.png => character.242.png} | Bin .../{character_243.png => character.243.png} | Bin .../{character_244.png => character.244.png} | Bin .../{character_245.png => character.245.png} | Bin .../{character_246.png => character.246.png} | Bin .../{character_247.png => character.247.png} | Bin .../{character_248.png => character.248.png} | Bin .../{character_249.png => character.249.png} | Bin .../{character_25.png => character.25.png} | Bin .../{character_250.png => character.250.png} | Bin .../{character_251.png => character.251.png} | Bin .../{character_252.png => character.252.png} | Bin .../{character_253.png => character.253.png} | Bin .../{character_254.png => character.254.png} | Bin .../{character_255.png => character.255.png} | Bin .../{character_256.png => character.256.png} | Bin .../{character_257.png => character.257.png} | Bin .../{character_258.png => character.258.png} | Bin .../{character_259.png => character.259.png} | Bin .../{character_26.png => character.26.png} | Bin .../{character_260.png => character.260.png} | Bin .../{character_261.png => character.261.png} | Bin .../{character_262.png => character.262.png} | Bin .../{character_263.png => character.263.png} | Bin .../{character_264.png => character.264.png} | Bin .../{character_265.png => character.265.png} | Bin .../{character_266.png => character.266.png} | Bin .../{character_267.png => character.267.png} | Bin .../{character_268.png => character.268.png} | Bin .../{character_269.png => character.269.png} | Bin .../{character_27.png => character.27.png} | Bin .../{character_270.png => character.270.png} | Bin .../{character_271.png => character.271.png} | Bin .../{character_272.png => character.272.png} | Bin .../{character_273.png => character.273.png} | Bin .../{character_274.png => character.274.png} | Bin .../{character_275.png => character.275.png} | Bin .../{character_276.png => character.276.png} | Bin .../{character_277.png => character.277.png} | Bin .../{character_278.png => character.278.png} | Bin .../{character_279.png => character.279.png} | Bin .../{character_28.png => character.28.png} | Bin .../{character_280.png => character.280.png} | Bin .../{character_281.png => character.281.png} | Bin .../{character_282.png => character.282.png} | Bin .../{character_283.png => character.283.png} | Bin .../{character_284.png => character.284.png} | Bin .../{character_285.png => character.285.png} | Bin .../{character_286.png => character.286.png} | Bin .../{character_287.png => character.287.png} | Bin .../{character_288.png => character.288.png} | Bin .../{character_289.png => character.289.png} | Bin .../{character_29.png => character.29.png} | Bin .../{character_290.png => character.290.png} | Bin .../{character_291.png => character.291.png} | Bin .../{character_292.png => character.292.png} | Bin .../{character_295.png => character.295.png} | Bin .../{character_297.png => character.297.png} | Bin .../{character_299.png => character.299.png} | Bin .../{character_3.png => character.3.png} | Bin .../{character_30.png => character.30.png} | Bin .../{character_300.png => character.300.png} | Bin .../{character_301.png => character.301.png} | Bin .../{character_302.png => character.302.png} | Bin .../{character_303.png => character.303.png} | Bin .../{character_304.png => character.304.png} | Bin .../{character_305.png => character.305.png} | Bin .../{character_306.png => character.306.png} | Bin .../{character_307.png => character.307.png} | Bin .../{character_308.png => character.308.png} | Bin .../{character_309.png => character.309.png} | Bin .../{character_31.png => character.31.png} | Bin .../{character_310.png => character.310.png} | Bin .../{character_311.png => character.311.png} | Bin .../{character_312.png => character.312.png} | Bin .../{character_313.png => character.313.png} | Bin .../{character_314.png => character.314.png} | Bin .../{character_315.png => character.315.png} | Bin .../{character_316.png => character.316.png} | Bin .../{character_317.png => character.317.png} | Bin .../{character_318.png => character.318.png} | Bin .../{character_319.png => character.319.png} | Bin .../{character_320.png => character.320.png} | Bin .../{character_321.png => character.321.png} | Bin .../{character_322.png => character.322.png} | Bin .../{character_323.png => character.323.png} | Bin .../{character_324.png => character.324.png} | Bin .../{character_325.png => character.325.png} | Bin .../{character_326.png => character.326.png} | Bin .../{character_327.png => character.327.png} | Bin .../{character_328.png => character.328.png} | Bin .../{character_329.png => character.329.png} | Bin .../{character_330.png => character.330.png} | Bin .../{character_331.png => character.331.png} | Bin .../{character_332.png => character.332.png} | Bin .../{character_333.png => character.333.png} | Bin .../{character_334.png => character.334.png} | Bin .../{character_335.png => character.335.png} | Bin .../{character_336.png => character.336.png} | Bin .../{character_337.png => character.337.png} | Bin .../{character_338.png => character.338.png} | Bin .../{character_339.png => character.339.png} | Bin .../{character_34.png => character.34.png} | Bin .../{character_340.png => character.340.png} | Bin .../{character_341.png => character.341.png} | Bin .../{character_342.png => character.342.png} | Bin .../{character_344.png => character.344.png} | Bin .../{character_349.png => character.349.png} | Bin .../{character_35.png => character.35.png} | Bin .../{character_352.png => character.352.png} | Bin .../{character_353.png => character.353.png} | Bin .../{character_356.png => character.356.png} | Bin .../{character_357.png => character.357.png} | Bin .../{character_359.png => character.359.png} | Bin .../{character_36.png => character.36.png} | Bin .../{character_361.png => character.361.png} | Bin .../{character_362.png => character.362.png} | Bin .../{character_363.png => character.363.png} | Bin .../{character_364.png => character.364.png} | Bin .../{character_365.png => character.365.png} | Bin .../{character_366.png => character.366.png} | Bin .../{character_367.png => character.367.png} | Bin .../{character_368.png => character.368.png} | Bin .../{character_369.png => character.369.png} | Bin .../{character_37.png => character.37.png} | Bin .../{character_370.png => character.370.png} | Bin .../{character_371.png => character.371.png} | Bin .../{character_372.png => character.372.png} | Bin .../{character_373.png => character.373.png} | Bin .../{character_374.png => character.374.png} | Bin .../{character_375.png => character.375.png} | Bin .../{character_376.png => character.376.png} | Bin .../{character_377.png => character.377.png} | Bin .../{character_378.png => character.378.png} | Bin .../{character_379.png => character.379.png} | Bin .../{character_380.png => character.380.png} | Bin .../{character_381.png => character.381.png} | Bin .../{character_382.png => character.382.png} | Bin .../{character_383.png => character.383.png} | Bin .../{character_384.png => character.384.png} | Bin .../{character_385.png => character.385.png} | Bin .../{character_387.png => character.387.png} | Bin .../{character_389.png => character.389.png} | Bin .../{character_390.png => character.390.png} | Bin .../{character_392.png => character.392.png} | Bin .../{character_393.png => character.393.png} | Bin .../{character_396.png => character.396.png} | Bin .../{character_399.png => character.399.png} | Bin .../{character_4.png => character.4.png} | Bin .../{character_400.png => character.400.png} | Bin .../{character_401.png => character.401.png} | Bin .../{character_402.png => character.402.png} | Bin .../{character_403.png => character.403.png} | Bin .../{character_404.png => character.404.png} | Bin .../{character_405.png => character.405.png} | Bin .../{character_406.png => character.406.png} | Bin .../{character_407.png => character.407.png} | Bin .../{character_408.png => character.408.png} | Bin .../{character_409.png => character.409.png} | Bin .../{character_410.png => character.410.png} | Bin .../{character_411.png => character.411.png} | Bin .../{character_412.png => character.412.png} | Bin .../{character_413.png => character.413.png} | Bin .../{character_414.png => character.414.png} | Bin .../{character_415.png => character.415.png} | Bin .../{character_416.png => character.416.png} | Bin .../{character_417.png => character.417.png} | Bin .../{character_418.png => character.418.png} | Bin .../{character_419.png => character.419.png} | Bin .../{character_420.png => character.420.png} | Bin .../{character_421.png => character.421.png} | Bin .../{character_428.png => character.428.png} | Bin .../{character_429.png => character.429.png} | Bin .../{character_430.png => character.430.png} | Bin .../{character_431.png => character.431.png} | Bin .../{character_432.png => character.432.png} | Bin .../{character_433.png => character.433.png} | Bin .../{character_434.png => character.434.png} | Bin .../{character_435.png => character.435.png} | Bin .../{character_436.png => character.436.png} | Bin .../{character_437.png => character.437.png} | Bin .../{character_438.png => character.438.png} | Bin .../{character_439.png => character.439.png} | Bin .../{character_440.png => character.440.png} | Bin .../{character_441.png => character.441.png} | Bin .../{character_442.png => character.442.png} | Bin .../{character_443.png => character.443.png} | Bin .../{character_444.png => character.444.png} | Bin .../{character_445.png => character.445.png} | Bin .../{character_446.png => character.446.png} | Bin .../{character_447.png => character.447.png} | Bin .../{character_448.png => character.448.png} | Bin .../{character_449.png => character.449.png} | Bin .../{character_450.png => character.450.png} | Bin .../{character_451.png => character.451.png} | Bin .../{character_452.png => character.452.png} | Bin .../{character_453.png => character.453.png} | Bin .../{character_454.png => character.454.png} | Bin .../{character_456.png => character.456.png} | Bin .../{character_457.png => character.457.png} | Bin .../{character_458.png => character.458.png} | Bin .../{character_459.png => character.459.png} | Bin .../{character_460.png => character.460.png} | Bin .../{character_461.png => character.461.png} | Bin .../{character_462.png => character.462.png} | Bin .../{character_463.png => character.463.png} | Bin .../{character_464.png => character.464.png} | Bin .../{character_465.png => character.465.png} | Bin .../{character_466.png => character.466.png} | Bin .../{character_467.png => character.467.png} | Bin .../{character_468.png => character.468.png} | Bin .../{character_469.png => character.469.png} | Bin .../{character_470.png => character.470.png} | Bin .../{character_471.png => character.471.png} | Bin .../{character_473.png => character.473.png} | Bin .../{character_474.png => character.474.png} | Bin .../{character_475.png => character.475.png} | Bin .../{character_476.png => character.476.png} | Bin .../{character_477.png => character.477.png} | Bin .../{character_478.png => character.478.png} | Bin .../{character_479.png => character.479.png} | Bin .../{character_480.png => character.480.png} | Bin .../{character_482.png => character.482.png} | Bin .../{character_483.png => character.483.png} | Bin .../{character_484.png => character.484.png} | Bin .../{character_485.png => character.485.png} | Bin .../{character_486.png => character.486.png} | Bin .../{character_487.png => character.487.png} | Bin .../{character_488.png => character.488.png} | Bin .../{character_489.png => character.489.png} | Bin .../{character_490.png => character.490.png} | Bin .../{character_491.png => character.491.png} | Bin .../{character_492.png => character.492.png} | Bin .../{character_493.png => character.493.png} | Bin .../{character_494.png => character.494.png} | Bin .../{character_495.png => character.495.png} | Bin .../{character_496.png => character.496.png} | Bin .../{character_497.png => character.497.png} | Bin .../{character_498.png => character.498.png} | Bin .../{character_5.png => character.5.png} | Bin .../{character_50.png => character.50.png} | Bin .../{character_500.png => character.500.png} | Bin .../{character_501.png => character.501.png} | Bin .../{character_502.png => character.502.png} | Bin .../{character_503.png => character.503.png} | Bin .../{character_504.png => character.504.png} | Bin .../{character_505.png => character.505.png} | Bin .../{character_507.png => character.507.png} | Bin .../{character_510.png => character.510.png} | Bin .../{character_511.png => character.511.png} | Bin .../{character_512.png => character.512.png} | Bin .../{character_513.png => character.513.png} | Bin .../{character_514.png => character.514.png} | Bin .../{character_515.png => character.515.png} | Bin .../{character_516.png => character.516.png} | Bin .../{character_517.png => character.517.png} | Bin .../{character_518.png => character.518.png} | Bin .../{character_519.png => character.519.png} | Bin .../{character_52.png => character.52.png} | Bin .../{character_520.png => character.520.png} | Bin .../{character_521.png => character.521.png} | Bin .../{character_522.png => character.522.png} | Bin .../{character_523.png => character.523.png} | Bin .../{character_524.png => character.524.png} | Bin .../{character_525.png => character.525.png} | Bin .../{character_526.png => character.526.png} | Bin .../{character_527.png => character.527.png} | Bin .../{character_528.png => character.528.png} | Bin .../{character_529.png => character.529.png} | Bin .../{character_530.png => character.530.png} | Bin .../{character_531.png => character.531.png} | Bin .../{character_532.png => character.532.png} | Bin .../{character_533.png => character.533.png} | Bin .../{character_534.png => character.534.png} | Bin .../{character_535.png => character.535.png} | Bin .../{character_536.png => character.536.png} | Bin .../{character_537.png => character.537.png} | Bin .../{character_539.png => character.539.png} | Bin .../{character_54.png => character.54.png} | Bin .../{character_540.png => character.540.png} | Bin .../{character_541.png => character.541.png} | Bin .../{character_542.png => character.542.png} | Bin .../{character_543.png => character.543.png} | Bin .../{character_544.png => character.544.png} | Bin .../{character_545.png => character.545.png} | Bin .../{character_546.png => character.546.png} | Bin .../{character_547.png => character.547.png} | Bin .../{character_548.png => character.548.png} | Bin .../{character_549.png => character.549.png} | Bin .../{character_55.png => character.55.png} | Bin .../{character_550.png => character.550.png} | Bin .../{character_551.png => character.551.png} | Bin .../{character_552.png => character.552.png} | Bin .../{character_553.png => character.553.png} | Bin .../{character_554.png => character.554.png} | Bin .../{character_555.png => character.555.png} | Bin .../{character_556.png => character.556.png} | Bin .../{character_558.png => character.558.png} | Bin .../{character_559.png => character.559.png} | Bin .../{character_560.png => character.560.png} | Bin .../{character_561.png => character.561.png} | Bin .../{character_562.png => character.562.png} | Bin .../{character_563.png => character.563.png} | Bin .../{character_564.png => character.564.png} | Bin .../{character_565.png => character.565.png} | Bin .../{character_567.png => character.567.png} | Bin .../{character_57.png => character.57.png} | Bin .../{character_570.png => character.570.png} | Bin .../{character_571.png => character.571.png} | Bin .../{character_572.png => character.572.png} | Bin .../{character_573.png => character.573.png} | Bin .../{character_575.png => character.575.png} | Bin .../{character_576.png => character.576.png} | Bin .../{character_577.png => character.577.png} | Bin .../{character_578.png => character.578.png} | Bin .../{character_579.png => character.579.png} | Bin .../{character_580.png => character.580.png} | Bin .../{character_581.png => character.581.png} | Bin .../{character_582.png => character.582.png} | Bin .../{character_583.png => character.583.png} | Bin .../{character_584.png => character.584.png} | Bin .../{character_585.png => character.585.png} | Bin .../{character_586.png => character.586.png} | Bin .../{character_587.png => character.587.png} | Bin .../{character_588.png => character.588.png} | Bin .../{character_589.png => character.589.png} | Bin .../{character_590.png => character.590.png} | Bin .../{character_591.png => character.591.png} | Bin .../{character_592.png => character.592.png} | Bin .../{character_593.png => character.593.png} | Bin .../{character_594.png => character.594.png} | Bin .../{character_595.png => character.595.png} | Bin .../{character_596.png => character.596.png} | Bin .../{character_597.png => character.597.png} | Bin .../{character_598.png => character.598.png} | Bin .../{character_599.png => character.599.png} | Bin .../{character_6.png => character.6.png} | Bin .../{character_600.png => character.600.png} | Bin .../{character_601.png => character.601.png} | Bin .../{character_602.png => character.602.png} | Bin .../{character_603.png => character.603.png} | Bin .../{character_604.png => character.604.png} | Bin .../{character_605.png => character.605.png} | Bin .../{character_606.png => character.606.png} | Bin .../{character_607.png => character.607.png} | Bin .../{character_608.png => character.608.png} | Bin .../{character_609.png => character.609.png} | Bin .../{character_61.png => character.61.png} | Bin .../{character_610.png => character.610.png} | Bin .../{character_611.png => character.611.png} | Bin .../{character_612.png => character.612.png} | Bin .../{character_613.png => character.613.png} | Bin .../{character_614.png => character.614.png} | Bin .../{character_615.png => character.615.png} | Bin .../{character_616.png => character.616.png} | Bin .../{character_618.png => character.618.png} | Bin .../{character_619.png => character.619.png} | Bin .../{character_620.png => character.620.png} | Bin .../{character_621.png => character.621.png} | Bin .../{character_622.png => character.622.png} | Bin .../{character_623.png => character.623.png} | Bin .../{character_624.png => character.624.png} | Bin .../{character_625.png => character.625.png} | Bin .../{character_626.png => character.626.png} | Bin .../{character_627.png => character.627.png} | Bin .../{character_628.png => character.628.png} | Bin .../{character_629.png => character.629.png} | Bin .../{character_630.png => character.630.png} | Bin .../{character_631.png => character.631.png} | Bin .../{character_632.png => character.632.png} | Bin .../{character_633.png => character.633.png} | Bin .../{character_634.png => character.634.png} | Bin .../{character_635.png => character.635.png} | Bin .../{character_636.png => character.636.png} | Bin .../{character_637.png => character.637.png} | Bin .../{character_638.png => character.638.png} | Bin .../{character_639.png => character.639.png} | Bin .../{character_640.png => character.640.png} | Bin .../{character_641.png => character.641.png} | Bin .../{character_642.png => character.642.png} | Bin .../{character_643.png => character.643.png} | Bin .../{character_644.png => character.644.png} | Bin .../{character_645.png => character.645.png} | Bin .../{character_646.png => character.646.png} | Bin .../{character_647.png => character.647.png} | Bin .../{character_648.png => character.648.png} | Bin .../{character_649.png => character.649.png} | Bin .../{character_650.png => character.650.png} | Bin .../{character_651.png => character.651.png} | Bin .../{character_652.png => character.652.png} | Bin .../{character_656.png => character.656.png} | Bin .../{character_657.png => character.657.png} | Bin .../{character_658.png => character.658.png} | Bin .../{character_659.png => character.659.png} | Bin .../{character_660.png => character.660.png} | Bin .../{character_661.png => character.661.png} | Bin .../{character_662.png => character.662.png} | Bin .../{character_663.png => character.663.png} | Bin .../{character_664.png => character.664.png} | Bin .../{character_666.png => character.666.png} | Bin .../{character_667.png => character.667.png} | Bin .../{character_668.png => character.668.png} | Bin .../{character_669.png => character.669.png} | Bin .../{character_670.png => character.670.png} | Bin .../{character_671.png => character.671.png} | Bin .../{character_672.png => character.672.png} | Bin .../{character_673.png => character.673.png} | Bin .../{character_674.png => character.674.png} | Bin .../{character_675.png => character.675.png} | Bin .../{character_676.png => character.676.png} | Bin .../{character_677.png => character.677.png} | Bin .../{character_678.png => character.678.png} | Bin .../{character_679.png => character.679.png} | Bin .../{character_680.png => character.680.png} | Bin .../{character_681.png => character.681.png} | Bin .../{character_682.png => character.682.png} | Bin .../{character_683.png => character.683.png} | Bin .../{character_684.png => character.684.png} | Bin .../{character_685.png => character.685.png} | Bin .../{character_686.png => character.686.png} | Bin .../{character_687.png => character.687.png} | Bin .../{character_688.png => character.688.png} | Bin .../{character_689.png => character.689.png} | Bin .../{character_69.png => character.69.png} | Bin .../{character_690.png => character.690.png} | Bin .../{character_691.png => character.691.png} | Bin .../{character_692.png => character.692.png} | Bin .../{character_693.png => character.693.png} | Bin .../{character_694.png => character.694.png} | Bin .../{character_695.png => character.695.png} | Bin .../{character_696.png => character.696.png} | Bin .../{character_697.png => character.697.png} | Bin .../{character_698.png => character.698.png} | Bin .../{character_699.png => character.699.png} | Bin .../{character_7.png => character.7.png} | Bin .../{character_70.png => character.70.png} | Bin .../{character_700.png => character.700.png} | Bin .../{character_701.png => character.701.png} | Bin .../{character_702.png => character.702.png} | Bin .../{character_703.png => character.703.png} | Bin .../{character_704.png => character.704.png} | Bin .../{character_705.png => character.705.png} | Bin .../{character_706.png => character.706.png} | Bin .../{character_707.png => character.707.png} | Bin .../{character_708.png => character.708.png} | Bin .../{character_709.png => character.709.png} | Bin .../{character_71.png => character.71.png} | Bin .../{character_710.png => character.710.png} | Bin .../{character_711.png => character.711.png} | Bin .../{character_712.png => character.712.png} | Bin .../{character_713.png => character.713.png} | Bin .../{character_714.png => character.714.png} | Bin .../{character_715.png => character.715.png} | Bin .../{character_716.png => character.716.png} | Bin .../{character_717.png => character.717.png} | Bin .../{character_718.png => character.718.png} | Bin .../{character_72.png => character.72.png} | Bin .../{character_720.png => character.720.png} | Bin .../{character_721.png => character.721.png} | Bin .../{character_723.png => character.723.png} | Bin .../{character_724.png => character.724.png} | Bin .../{character_725.png => character.725.png} | Bin .../{character_726.png => character.726.png} | Bin .../{character_727.png => character.727.png} | Bin .../{character_728.png => character.728.png} | Bin .../{character_729.png => character.729.png} | Bin .../{character_73.png => character.73.png} | Bin .../{character_730.png => character.730.png} | Bin .../{character_731.png => character.731.png} | Bin .../{character_732.png => character.732.png} | Bin .../{character_734.png => character.734.png} | Bin .../{character_735.png => character.735.png} | Bin .../{character_736.png => character.736.png} | Bin .../{character_737.png => character.737.png} | Bin .../{character_738.png => character.738.png} | Bin .../{character_739.png => character.739.png} | Bin .../{character_74.png => character.74.png} | Bin .../{character_740.png => character.740.png} | Bin .../{character_741.png => character.741.png} | Bin .../{character_742.png => character.742.png} | Bin .../{character_743.png => character.743.png} | Bin .../{character_744.png => character.744.png} | Bin .../{character_745.png => character.745.png} | Bin .../{character_746.png => character.746.png} | Bin .../{character_747.png => character.747.png} | Bin .../{character_748.png => character.748.png} | Bin .../{character_749.png => character.749.png} | Bin .../{character_75.png => character.75.png} | Bin .../{character_750.png => character.750.png} | Bin .../{character_751.png => character.751.png} | Bin .../{character_752.png => character.752.png} | Bin .../{character_753.png => character.753.png} | Bin .../{character_754.png => character.754.png} | Bin .../{character_755.png => character.755.png} | Bin .../{character_756.png => character.756.png} | Bin .../{character_757.png => character.757.png} | Bin .../{character_758.png => character.758.png} | Bin .../{character_759.png => character.759.png} | Bin .../{character_76.png => character.76.png} | Bin .../{character_760.png => character.760.png} | Bin .../{character_761.png => character.761.png} | Bin .../{character_762.png => character.762.png} | Bin .../{character_763.png => character.763.png} | Bin .../{character_764.png => character.764.png} | Bin .../{character_765.png => character.765.png} | Bin .../{character_766.png => character.766.png} | Bin .../{character_767.png => character.767.png} | Bin .../{character_768.png => character.768.png} | Bin .../{character_769.png => character.769.png} | Bin .../{character_77.png => character.77.png} | Bin .../{character_770.png => character.770.png} | Bin .../{character_771.png => character.771.png} | Bin .../{character_772.png => character.772.png} | Bin .../{character_773.png => character.773.png} | Bin .../{character_774.png => character.774.png} | Bin .../{character_775.png => character.775.png} | Bin .../{character_776.png => character.776.png} | Bin .../{character_777.png => character.777.png} | Bin .../{character_778.png => character.778.png} | Bin .../{character_779.png => character.779.png} | Bin .../{character_78.png => character.78.png} | Bin .../{character_780.png => character.780.png} | Bin .../{character_781.png => character.781.png} | Bin .../{character_782.png => character.782.png} | Bin .../{character_783.png => character.783.png} | Bin .../{character_784.png => character.784.png} | Bin .../{character_785.png => character.785.png} | Bin .../{character_786.png => character.786.png} | Bin .../{character_787.png => character.787.png} | Bin .../{character_788.png => character.788.png} | Bin .../{character_789.png => character.789.png} | Bin .../{character_790.png => character.790.png} | Bin .../{character_791.png => character.791.png} | Bin .../{character_792.png => character.792.png} | Bin .../{character_793.png => character.793.png} | Bin .../{character_794.png => character.794.png} | Bin .../{character_795.png => character.795.png} | Bin .../{character_796.png => character.796.png} | Bin .../{character_797.png => character.797.png} | Bin .../{character_798.png => character.798.png} | Bin .../{character_799.png => character.799.png} | Bin .../{character_8.png => character.8.png} | Bin .../{character_80.png => character.80.png} | Bin .../{character_800.png => character.800.png} | Bin .../{character_801.png => character.801.png} | Bin .../{character_802.png => character.802.png} | Bin .../{character_803.png => character.803.png} | Bin .../{character_804.png => character.804.png} | Bin .../{character_805.png => character.805.png} | Bin .../{character_806.png => character.806.png} | Bin .../{character_807.png => character.807.png} | Bin .../{character_808.png => character.808.png} | Bin .../{character_809.png => character.809.png} | Bin .../{character_81.png => character.81.png} | Bin .../{character_810.png => character.810.png} | Bin .../{character_811.png => character.811.png} | Bin .../{character_812.png => character.812.png} | Bin .../{character_813.png => character.813.png} | Bin .../{character_814.png => character.814.png} | Bin .../{character_815.png => character.815.png} | Bin .../{character_816.png => character.816.png} | Bin .../{character_817.png => character.817.png} | Bin .../{character_818.png => character.818.png} | Bin .../{character_819.png => character.819.png} | Bin .../{character_82.png => character.82.png} | Bin .../{character_821.png => character.821.png} | Bin .../{character_822.png => character.822.png} | Bin .../{character_823.png => character.823.png} | Bin .../{character_824.png => character.824.png} | Bin .../{character_827.png => character.827.png} | Bin .../{character_828.png => character.828.png} | Bin .../{character_829.png => character.829.png} | Bin .../{character_83.png => character.83.png} | Bin .../{character_830.png => character.830.png} | Bin .../{character_831.png => character.831.png} | Bin .../{character_832.png => character.832.png} | Bin .../{character_833.png => character.833.png} | Bin .../{character_834.png => character.834.png} | Bin .../{character_835.png => character.835.png} | Bin .../{character_836.png => character.836.png} | Bin .../{character_837.png => character.837.png} | Bin .../{character_838.png => character.838.png} | Bin .../{character_839.png => character.839.png} | Bin .../{character_84.png => character.84.png} | Bin .../{character_841.png => character.841.png} | Bin .../{character_843.png => character.843.png} | Bin .../{character_844.png => character.844.png} | Bin .../{character_845.png => character.845.png} | Bin .../{character_846.png => character.846.png} | Bin .../{character_847.png => character.847.png} | Bin .../{character_848.png => character.848.png} | Bin .../{character_85.png => character.85.png} | Bin .../{character_850.png => character.850.png} | Bin .../{character_851.png => character.851.png} | Bin .../{character_852.png => character.852.png} | Bin .../{character_853.png => character.853.png} | Bin .../{character_855.png => character.855.png} | Bin .../{character_856.png => character.856.png} | Bin .../{character_857.png => character.857.png} | Bin .../{character_859.png => character.859.png} | Bin .../{character_860.png => character.860.png} | Bin .../{character_861.png => character.861.png} | Bin .../{character_862.png => character.862.png} | Bin .../{character_863.png => character.863.png} | Bin .../{character_864.png => character.864.png} | Bin .../{character_865.png => character.865.png} | Bin .../{character_866.png => character.866.png} | Bin .../{character_869.png => character.869.png} | Bin .../{character_87.png => character.87.png} | Bin .../{character_870.png => character.870.png} | Bin .../{character_871.png => character.871.png} | Bin .../{character_874.png => character.874.png} | Bin .../{character_877.png => character.877.png} | Bin .../{character_878.png => character.878.png} | Bin .../{character_879.png => character.879.png} | Bin .../{character_88.png => character.88.png} | Bin .../{character_880.png => character.880.png} | Bin .../{character_881.png => character.881.png} | Bin .../{character_882.png => character.882.png} | Bin .../{character_883.png => character.883.png} | Bin .../{character_884.png => character.884.png} | Bin .../{character_885.png => character.885.png} | Bin .../{character_886.png => character.886.png} | Bin .../{character_887.png => character.887.png} | Bin .../{character_888.png => character.888.png} | Bin .../{character_889.png => character.889.png} | Bin .../{character_89.png => character.89.png} | Bin .../{character_890.png => character.890.png} | Bin .../{character_891.png => character.891.png} | Bin .../{character_893.png => character.893.png} | Bin .../{character_894.png => character.894.png} | Bin .../{character_895.png => character.895.png} | Bin .../{character_896.png => character.896.png} | Bin .../{character_897.png => character.897.png} | Bin .../{character_898.png => character.898.png} | Bin .../{character_899.png => character.899.png} | Bin .../{character_9.png => character.9.png} | Bin .../{character_900.png => character.900.png} | Bin .../{character_901.png => character.901.png} | Bin .../{character_902.png => character.902.png} | Bin .../{character_903.png => character.903.png} | Bin .../{character_904.png => character.904.png} | Bin .../{character_905.png => character.905.png} | Bin .../{character_906.png => character.906.png} | Bin .../{character_907.png => character.907.png} | Bin .../{character_908.png => character.908.png} | Bin .../{character_909.png => character.909.png} | Bin .../{character_910.png => character.910.png} | Bin .../{character_911.png => character.911.png} | Bin .../{character_912.png => character.912.png} | Bin .../{character_913.png => character.913.png} | Bin .../{character_914.png => character.914.png} | Bin .../{character_915.png => character.915.png} | Bin .../{character_916.png => character.916.png} | Bin .../{character_917.png => character.917.png} | Bin .../{character_918.png => character.918.png} | Bin .../{character_919.png => character.919.png} | Bin .../{character_92.png => character.92.png} | Bin .../{character_920.png => character.920.png} | Bin .../{character_921.png => character.921.png} | Bin .../{character_922.png => character.922.png} | Bin .../{character_923.png => character.923.png} | Bin .../{character_924.png => character.924.png} | Bin .../{character_925.png => character.925.png} | Bin .../{character_926.png => character.926.png} | Bin .../{character_927.png => character.927.png} | Bin .../{character_928.png => character.928.png} | Bin .../{character_929.png => character.929.png} | Bin .../{character_93.png => character.93.png} | Bin .../{character_930.png => character.930.png} | Bin .../{character_931.png => character.931.png} | Bin .../{character_932.png => character.932.png} | Bin .../{character_933.png => character.933.png} | Bin .../{character_934.png => character.934.png} | Bin .../{character_935.png => character.935.png} | Bin .../{character_936.png => character.936.png} | Bin .../{character_937.png => character.937.png} | Bin .../{character_938.png => character.938.png} | Bin .../{character_939.png => character.939.png} | Bin .../{character_940.png => character.940.png} | Bin .../{character_941.png => character.941.png} | Bin .../{character_942.png => character.942.png} | Bin .../{character_943.png => character.943.png} | Bin .../{character_944.png => character.944.png} | Bin .../{character_945.png => character.945.png} | Bin .../{character_946.png => character.946.png} | Bin .../{character_947.png => character.947.png} | Bin .../{character_948.png => character.948.png} | Bin .../{character_949.png => character.949.png} | Bin .../{character_95.png => character.95.png} | Bin .../{character_950.png => character.950.png} | Bin .../{character_951.png => character.951.png} | Bin .../{character_952.png => character.952.png} | Bin .../{character_953.png => character.953.png} | Bin .../{character_954.png => character.954.png} | Bin .../{character_955.png => character.955.png} | Bin .../{character_956.png => character.956.png} | Bin .../{character_957.png => character.957.png} | Bin .../{character_958.png => character.958.png} | Bin .../{character_959.png => character.959.png} | Bin .../{character_96.png => character.96.png} | Bin .../{character_960.png => character.960.png} | Bin .../{character_961.png => character.961.png} | Bin .../{character_962.png => character.962.png} | Bin .../{character_963.png => character.963.png} | Bin .../{character_964.png => character.964.png} | Bin .../{character_965.png => character.965.png} | Bin .../{character_966.png => character.966.png} | Bin .../{character_967.png => character.967.png} | Bin .../{character_968.png => character.968.png} | Bin .../{character_969.png => character.969.png} | Bin .../{character_970.png => character.970.png} | Bin .../{character_971.png => character.971.png} | Bin .../{character_972.png => character.972.png} | Bin .../{character_973.png => character.973.png} | Bin .../{character_974.png => character.974.png} | Bin .../{character_975.png => character.975.png} | Bin .../{character_976.png => character.976.png} | Bin .../{character_977.png => character.977.png} | Bin .../{character_978.png => character.978.png} | Bin .../{character_979.png => character.979.png} | Bin .../{character_98.png => character.98.png} | Bin .../{character_980.png => character.980.png} | Bin .../{character_981.png => character.981.png} | Bin .../{character_982.png => character.982.png} | Bin .../{character_983.png => character.983.png} | Bin .../{character_984.png => character.984.png} | Bin .../{character_985.png => character.985.png} | Bin .../{character_986.png => character.986.png} | Bin .../{character_987.png => character.987.png} | Bin .../{character_988.png => character.988.png} | Bin .../{character_989.png => character.989.png} | Bin .../{character_99.png => character.99.png} | Bin .../{character_990.png => character.990.png} | Bin .../{character_991.png => character.991.png} | Bin .../{character_992.png => character.992.png} | Bin .../{character_993.png => character.993.png} | Bin .../{character_994.png => character.994.png} | Bin .../{character_995.png => character.995.png} | Bin .../{character_996.png => character.996.png} | Bin .../{character_997.png => character.997.png} | Bin .../{character_998.png => character.998.png} | Bin .../{character_999.png => character.999.png} | Bin mods/skinsdb/textures/readme.txt | 38 +- mods/skinsdb/unittest.lua | 51 + mods/skinsdb/updater/update_skins.py | 47 +- mods/smartshop/depends.txt | 1 - mods/smartshop/description.txt | 1 - mods/smartshop/mod.conf | 3 + mods/spectator_mode/.luacheckrc | 24 +- mods/spectator_mode/LICENSE | 60 +- mods/spectator_mode/README.md | 52 +- mods/spectator_mode/init.lua | 634 +- mods/spectator_mode/mod.conf | 9 +- mods/spectator_mode/settingtypes.txt | 36 + .../spectator_mode/spec/fixtures/beerchat.lua | 17 + .../spec/fixtures/mineunit_extensions.lua | 115 + .../spec/fixtures/player_api.lua | 6 + mods/spectator_mode/spec/init_spec.lua | 305 + mods/spectator_mode/spec/mineunit.conf | 7 + mods/stained_glass/init.lua | 4 +- mods/stairs/README.md | 44 + mods/stairs/README.txt | 20 - mods/stairs/api.txt | 7 + mods/stairs/depends.txt | 1 - mods/stairs/description.txt | 1 - mods/stairs/init.lua | 193 +- mods/stairs/license.txt | 31 + mods/stairs/locale/stairs.de.tr | 145 + mods/stairs/locale/stairs.eo.tr | 145 + mods/stairs/locale/stairs.es.tr | 145 + mods/stairs/locale/stairs.fr.tr | 145 + mods/stairs/locale/stairs.id.tr | 145 + mods/stairs/locale/stairs.it.tr | 145 + mods/stairs/locale/stairs.ja.tr | 145 + mods/stairs/locale/stairs.jbo.tr | 145 + mods/stairs/locale/stairs.ms.tr | 145 + mods/stairs/locale/stairs.pl.tr | 145 + mods/stairs/locale/stairs.pt_BR.tr | 145 + mods/stairs/locale/stairs.ru.tr | 145 + mods/stairs/locale/stairs.sk.tr | 145 + mods/stairs/locale/stairs.sv.tr | 145 + mods/stairs/locale/stairs.uk.tr | 145 + mods/stairs/locale/stairs.zh_CN.tr | 153 + mods/stairs/locale/stairs.zh_TW.tr | 153 + mods/stairs/locale/template.txt | 145 + mods/stairs/mod.conf | 3 +- mods/stairs/settingtypes.txt | 1 + mods/stairs/sounds/wool_coat_movement.ogg | Bin 9760 -> 0 bytes mods/stairs/stairs.lua | 980 ++- mods/stairs/textures/stairs_glass_quarter.png | Bin 0 -> 264 bytes .../stairs_obsidian_glass_quarter.png | Bin 0 -> 141 bytes mods/stamina/README.txt | 16 +- mods/stamina/depends.txt | 4 - mods/stamina/description.txt | 1 - mods/stamina/init.lua | 571 +- mods/stamina/license.txt | 31 + mods/stamina/lucky_block.lua | 50 + mods/stamina/mod.conf | 3 +- mods/stamina/settingtypes.txt | 6 + mods/stamina/sounds/stamina_sip.1.ogg | Bin 0 -> 12075 bytes mods/stamina/sounds/stamina_sip.2.ogg | Bin 0 -> 13385 bytes mods/stamina/sounds/stamina_sip.ogg | Bin 17876 -> 0 bytes mods/stamina/textures/stamina_hud_poison.png | Bin 3196 -> 313 bytes mods/techpack/gravelsieve/depends.txt | 6 - mods/techpack/gravelsieve/description.txt | 1 - mods/techpack/gravelsieve/init.lua | 21 +- .../gravelsieve/locale/gravelsieve.de.tr | 12 +- .../gravelsieve/locale/gravelsieve.zh_CN.tr | 6 + .../gravelsieve/locale/gravelsieve.zh_TW.tr | 6 + mods/techpack/gravelsieve/locale/template.txt | 12 +- mods/techpack/gravelsieve/mod.conf | 8 +- mods/techpack/i18n.py | 130 +- mods/techpack/lcdlib/depends.txt | 0 mods/techpack/lcdlib/mod.conf | 2 +- mods/techpack/safer_lua/depends.txt | 0 mods/techpack/safer_lua/description.txt | 4 - mods/techpack/safer_lua/mod.conf | 2 +- mods/techpack/sl_controller/battery.lua | 18 +- mods/techpack/sl_controller/config.lua | 2 +- mods/techpack/sl_controller/controller.lua | 57 +- mods/techpack/sl_controller/depends.txt | 5 - mods/techpack/sl_controller/description.txt | 2 - mods/techpack/sl_controller/mod.conf | 4 +- mods/techpack/sl_controller/server.lua | 23 +- mods/techpack/sl_controller/terminal.lua | 18 +- mods/techpack/smartline/button.lua | 12 +- mods/techpack/smartline/collector.lua | 35 +- mods/techpack/smartline/controller.lua | 138 +- mods/techpack/smartline/depends.txt | 7 - mods/techpack/smartline/description.txt | 2 - mods/techpack/smartline/display.lua | 14 +- mods/techpack/smartline/icta/battery.lua | 18 +- mods/techpack/smartline/icta/controller.lua | 54 +- .../techpack/smartline/locale/smartline.de.tr | 89 +- .../smartline/locale/smartline.zh_CN.tr | 46 + .../smartline/locale/smartline.zh_TW.tr | 46 + mods/techpack/smartline/locale/template.txt | 81 +- mods/techpack/smartline/mod.conf | 5 +- mods/techpack/smartline/playerdetector.lua | 25 +- mods/techpack/smartline/repeater.lua | 13 +- mods/techpack/smartline/sequencer.lua | 27 +- mods/techpack/smartline/signaltower.lua | 18 +- mods/techpack/smartline/timer.lua | 59 +- mods/techpack/techpack_stairway/depends.txt | 2 - .../techpack_stairway/description.txt | 2 - .../locale/techpack_stairway.de.tr | 15 +- .../locale/techpack_stairway.zh_CN.tr | 17 + .../locale/techpack_stairway.zh_TW.tr | 17 + .../techpack_stairway/locale/template.txt | 15 +- mods/techpack/techpack_stairway/mod.conf | 6 +- .../techpack_warehouse/box_copper.lua | 33 +- mods/techpack/techpack_warehouse/box_gold.lua | 33 +- .../techpack/techpack_warehouse/box_steel.lua | 33 +- mods/techpack/techpack_warehouse/depends.txt | 3 - .../techpack_warehouse/description.txt | 2 - .../locale/techpack_warehouse.zh_CN.tr | 8 + .../locale/techpack_warehouse.zh_TW.tr | 8 + .../techpack_warehouse/locale/template.txt | 18 +- mods/techpack/techpack_warehouse/mod.conf | 6 +- mods/techpack/tubelib/blackhole.lua | 13 +- mods/techpack/tubelib/button.lua | 11 +- mods/techpack/tubelib/command.lua | 11 +- mods/techpack/tubelib/defect.lua | 11 +- mods/techpack/tubelib/depends.txt | 4 - mods/techpack/tubelib/description.txt | 2 - mods/techpack/tubelib/distributor.lua | 71 +- mods/techpack/tubelib/forceload.lua | 60 +- mods/techpack/tubelib/init.lua | 6 +- mods/techpack/tubelib/lamp.lua | 15 +- mods/techpack/tubelib/locale/template.txt | 64 +- mods/techpack/tubelib/locale/tubelib.de.tr | 66 +- mods/techpack/tubelib/locale/tubelib.zh_CN.tr | 40 + mods/techpack/tubelib/locale/tubelib.zh_TW.tr | 40 + mods/techpack/tubelib/migrate.lua | 7 +- mods/techpack/tubelib/mod.conf | 6 +- mods/techpack/tubelib/pusher.lua | 21 +- mods/techpack/tubelib_addons1/autocrafter.lua | 47 +- mods/techpack/tubelib_addons1/chest.lua | 13 +- mods/techpack/tubelib_addons1/depends.txt | 10 - mods/techpack/tubelib_addons1/description.txt | 2 - mods/techpack/tubelib_addons1/detector.lua | 25 +- mods/techpack/tubelib_addons1/fermenter.lua | 3 + mods/techpack/tubelib_addons1/funnel.lua | 19 +- mods/techpack/tubelib_addons1/grinder.lua | 21 +- mods/techpack/tubelib_addons1/harvester.lua | 49 +- .../tubelib_addons1/liquidsampler.lua | 17 +- .../tubelib_addons1/locale/template.txt | 69 +- .../locale/tubelib_addons1.de.tr | 69 +- .../locale/tubelib_addons1.zh_CN.tr | 37 + .../locale/tubelib_addons1.zh_TW.tr | 37 + mods/techpack/tubelib_addons1/mod.conf | 8 +- mods/techpack/tubelib_addons1/nodes.lua | 4 + mods/techpack/tubelib_addons1/pusher_fast.lua | 25 +- mods/techpack/tubelib_addons1/quarry.lua | 52 +- mods/techpack/tubelib_addons1/reformer.lua | 3 + .../tubelib_addons2/accesscontrol.lua | 11 +- mods/techpack/tubelib_addons2/ceilinglamp.lua | 16 +- mods/techpack/tubelib_addons2/colorlamp.lua | 43 +- .../techpack/tubelib_addons2/colorlamp_ud.lua | 36 +- mods/techpack/tubelib_addons2/depends.txt | 5 - mods/techpack/tubelib_addons2/description.txt | 2 - mods/techpack/tubelib_addons2/doorblock.lua | 15 +- mods/techpack/tubelib_addons2/gateblock.lua | 15 +- .../tubelib_addons2/industriallamp.lua | 29 +- .../tubelib_addons2/invisiblelamp.lua | 16 +- .../tubelib_addons2/locale/template.txt | 110 +- .../locale/tubelib_addons2.de.tr | 110 +- .../locale/tubelib_addons2.zh_CN.tr | 46 + .../locale/tubelib_addons2.zh_TW.tr | 46 + mods/techpack/tubelib_addons2/logic_not.lua | 11 +- .../tubelib_addons2/mesecons_converter.lua | 17 +- mods/techpack/tubelib_addons2/mod.conf | 8 +- mods/techpack/tubelib_addons2/programmer.lua | 13 +- mods/techpack/tubelib_addons2/repeater.lua | 15 +- mods/techpack/tubelib_addons2/sequencer.lua | 25 +- mods/techpack/tubelib_addons2/streetlamp.lua | 18 +- mods/techpack/tubelib_addons2/timer.lua | 56 +- mods/techpack/tubelib_addons3/chest.lua | 15 +- mods/techpack/tubelib_addons3/chest_cart.lua | 19 +- mods/techpack/tubelib_addons3/depends.txt | 3 - mods/techpack/tubelib_addons3/description.txt | 2 - mods/techpack/tubelib_addons3/distributor.lua | 79 +- mods/techpack/tubelib_addons3/funnel.lua | 19 +- .../tubelib_addons3/locale/template.txt | 23 - .../locale/tubelib_addons3.de.tr | 23 - .../locale/tubelib_addons3.zh_CN.tr | 11 + .../locale/tubelib_addons3.zh_TW.tr | 11 + mods/techpack/tubelib_addons3/mod.conf | 8 +- mods/techpack/tubelib_addons3/pusher.lua | 19 +- .../tubelib_addons3/pushing_chest.lua | 2 + mods/techpack/tubelib_addons3/teleporter.lua | 9 +- mods/throwing/init.lua | 8 +- mods/trash_can/.luacheckrc | 15 + mods/trash_can/init.lua | 41 +- mods/trash_can/locale/template.txt | 5 + mods/trash_can/locale/trash_can.eo.tr | 5 + mods/trash_can/locale/trash_can.fr.tr | 5 + mods/trash_can/locale/trash_can.zh_CN.tr | 5 + mods/trash_can/locale/trash_can.zh_TW.tr | 5 + mods/trash_can/settingtypes.txt | 2 +- mods/ts_doors/init.lua | 2 +- mods/ts_furniture/depends.txt | 3 - mods/ts_furniture/description.txt | 1 - mods/ts_furniture/init.lua | 22 +- mods/ts_furniture/locale/ts_furniture.fr.tr | 116 + mods/ts_furniture/mod.conf | 2 +- mods/ts_workshop/.luacheckrc | 12 + mods/ts_workshop/depends.txt | 0 mods/ts_workshop/description.txt | 1 - mods/ts_workshop/init.lua | 2 +- mods/ts_workshop/mod.conf | 2 + mods/tubelib2/README.md | 4 +- mods/tubelib2/depends.txt | 2 - mods/tubelib2/description.txt | 2 - mods/tubelib2/i18n.py | 476 ++ mods/tubelib2/init.lua | 6 +- mods/tubelib2/internal1.lua | 27 +- mods/tubelib2/internal2.lua | 34 +- mods/tubelib2/intllib.lua | 45 - mods/tubelib2/locale/de.mo | Bin 686 -> 0 bytes mods/tubelib2/locale/de.po | 45 - mods/tubelib2/locale/template.pot | 42 - mods/tubelib2/locale/template.txt | 8 + mods/tubelib2/locale/tubelib2.de.tr | 8 + mods/tubelib2/locale/tubelib2.zh_CN.tr | 8 + mods/tubelib2/locale/tubelib2.zh_TW.tr | 8 + mods/tubelib2/mod.conf | 2 + mods/tubelib2/settingtypes.txt | 4 +- mods/tubelib2/storage.lua | 14 +- mods/tubelib2/tube_api.lua | 27 +- mods/tubelib2/tube_test.lua | 14 +- mods/unified_inventory/.luacheckrc | 1 + mods/unified_inventory/README.md | 16 + mods/unified_inventory/api.lua | 149 +- mods/unified_inventory/bags.lua | 143 +- mods/unified_inventory/callbacks.lua | 115 +- mods/unified_inventory/category.lua | 8 + mods/unified_inventory/default-categories.lua | 142 +- mods/unified_inventory/doc/mod_api.txt | 98 +- mods/unified_inventory/group.lua | 101 +- mods/unified_inventory/init.lua | 51 +- mods/unified_inventory/internal.lua | 158 +- mods/unified_inventory/item_names.lua | 14 +- mods/unified_inventory/legacy.lua | 55 + .../locale/unified_inventory.de.tr | 28 +- .../locale/unified_inventory.pl.tr | 125 +- .../locale/unified_inventory.ru.tr | 49 +- .../locale/unified_inventory.zh_CN.tr | 44 +- .../locale/unified_inventory.zh_TW.tr | 44 +- mods/unified_inventory/match_craft.lua | 19 +- mods/unified_inventory/mod.conf | 2 +- mods/unified_inventory/register.lua | 38 +- mods/unified_inventory/screenshot.png | Bin 137234 -> 225046 bytes mods/unified_inventory/settingtypes.txt | 36 +- mods/unified_inventory/sounds/birds.ogg | Bin 14797 -> 0 bytes mods/unified_inventory/sounds/owl.ogg | Bin 50950 -> 0 bytes mods/unified_inventory/sounds/ui_click.ogg | Bin 0 -> 6125 bytes mods/unified_inventory/sounds/ui_morning.ogg | Bin 0 -> 23446 bytes mods/unified_inventory/sounds/ui_owl.ogg | Bin 0 -> 14621 bytes .../textures/ui_formbg_9_sliced.png | Bin 240 -> 510 bytes .../textures/ui_smallbg_9_sliced.png | Bin 139 -> 551 bytes .../textures/ui_teleport.png | Bin 0 -> 2217 bytes mods/unified_inventory/waypoints.lua | 71 +- mods/unifiedbricks/.luacheckrc | 9 + mods/unifiedbricks/depends.txt | 4 - mods/unifiedbricks/description.txt | 1 - mods/unifiedbricks/init.lua | 47 +- mods/unifiedbricks/mod.conf | 2 + .../textures/unifiedbricks_brickblock.png | Bin 118 -> 110 bytes .../textures/unifiedbricks_clayblock.png | Bin 389 -> 264 bytes .../textures/unifiedbricks_mortar.png | Bin 247 -> 170 bytes .../textures/unifiedbricks_mortar2.png | Bin 247 -> 0 bytes .../textures/unifiedbricks_mortar3.png | Bin 247 -> 0 bytes .../textures/unifiedbricks_mortar4.png | Bin 247 -> 0 bytes mods/unifieddyes/.luacheckrc | 25 + mods/unifieddyes/README.md | 2 +- mods/unifieddyes/airbrush.lua | 61 +- mods/unifieddyes/aliases.lua | 6 +- mods/unifieddyes/api.lua | 183 +- mods/unifieddyes/color-tables.lua | 18 - mods/unifieddyes/dyes-crafting.lua | 30 +- mods/unifieddyes/init.lua | 6 +- mods/unifieddyes/locale/template.txt | 156 +- mods/unifieddyes/locale/unifieddyes.tr.tr | 170 +- mods/unifieddyes/mod.conf | 4 +- mods/vehicle_mash/.luacheckrc | 4 +- mods/vehicle_mash/LICENSE.md | 10 +- mods/vehicle_mash/README.md | 50 +- mods/vehicle_mash/boats/boat.lua | 3 +- mods/vehicle_mash/boats/rowboat.lua | 3 +- mods/vehicle_mash/car01s/black.lua | 3 +- mods/vehicle_mash/car01s/blue.lua | 3 +- mods/vehicle_mash/car01s/brown.lua | 3 +- mods/vehicle_mash/car01s/cyan.lua | 3 +- mods/vehicle_mash/car01s/dark_green.lua | 3 +- mods/vehicle_mash/car01s/dark_grey.lua | 3 +- mods/vehicle_mash/car01s/green.lua | 3 +- mods/vehicle_mash/car01s/grey.lua | 3 +- mods/vehicle_mash/car01s/hot_rod.lua | 3 +- mods/vehicle_mash/car01s/magenta.lua | 3 +- mods/vehicle_mash/car01s/nyan_ride.lua | 3 +- mods/vehicle_mash/car01s/oerkki_bliss.lua | 3 +- mods/vehicle_mash/car01s/orange.lua | 3 +- mods/vehicle_mash/car01s/pink.lua | 3 +- mods/vehicle_mash/car01s/red.lua | 3 +- mods/vehicle_mash/car01s/road_master.lua | 3 +- mods/vehicle_mash/car01s/violet.lua | 3 +- mods/vehicle_mash/car01s/white.lua | 3 +- mods/vehicle_mash/car01s/yellow.lua | 3 +- mods/vehicle_mash/depends.txt | 4 + mods/vehicle_mash/description.txt | 7 +- mods/vehicle_mash/framework.lua | 97 +- mods/vehicle_mash/hovers/hover_blue.lua | 3 +- mods/vehicle_mash/hovers/hover_green.lua | 3 +- mods/vehicle_mash/hovers/hover_red.lua | 3 +- mods/vehicle_mash/hovers/hover_yellow.lua | 3 +- mods/vehicle_mash/init.lua | 117 +- mods/vehicle_mash/locale/template.txt | 35 + mods/vehicle_mash/locale/vehicle_mash.es.tr | 35 + mods/vehicle_mash/mesecars/mese_blue.lua | 3 +- mods/vehicle_mash/mesecars/mese_pink.lua | 2 +- mods/vehicle_mash/mesecars/mese_purple.lua | 2 +- mods/vehicle_mash/mesecars/mese_yellow.lua | 2 +- mods/vehicle_mash/mod.conf | 13 +- mods/vehicle_mash/models/car_126r.x | 6761 ----------------- mods/vehicle_mash/models/car_f1.x | 4657 ------------ mods/vehicle_mash/settingtypes.txt | 2 + mods/vehicle_mash/template.lua | 41 +- mods/vehicle_mash/textures/car_126r.png | Bin 75185 -> 0 bytes .../textures/car_126r_inventory.png | Bin 1388 -> 0 bytes mods/vehicle_mash/textures/car_126r_wield.png | Bin 1388 -> 0 bytes mods/vehicle_mash/textures/car_f1.png | Bin 57973 -> 0 bytes .../textures/car_f1_inventory.png | Bin 1855 -> 0 bytes mods/vehicle_mash/textures/car_f1_wield.png | Bin 1855 -> 0 bytes mods/windmill/README.md | 50 +- mods/windmill/bower.json | 16 + mods/windmill/mod.conf | 4 + mods/wine/README.md | 29 +- mods/wine/agave.lua | 156 + mods/wine/depends.txt | 12 - mods/wine/drinks.lua | 157 + mods/wine/init.lua | 793 +- mods/wine/license.txt | 27 +- mods/wine/locale/template.txt | 24 +- mods/wine/locale/wine.de.tr | 25 +- mods/wine/locale/wine.es.tr | 26 +- mods/wine/locale/wine.fr.tr | 37 +- mods/wine/lucky_block.lua | 48 + mods/wine/mod.conf | 6 +- mods/wine/screenshot.jpg | Bin 29715 -> 0 bytes mods/wine/screenshot.png | Bin 0 -> 116334 bytes mods/wine/textures/wine_barrel.png | Bin 244 -> 237 bytes mods/wine/textures/wine_barrel_fs_bg.png | Bin 0 -> 4730 bytes mods/wine/textures/wine_barrel_icon.png | Bin 0 -> 173 bytes mods/wine/textures/wine_barrel_icon_bg.png | Bin 0 -> 114 bytes mods/wine/textures/wine_barrel_water.png | Bin 0 -> 1942 bytes mods/wine/textures/wine_beer_glass.png | Bin 227 -> 263 bytes mods/wine/textures/wine_bourbon_bottle.png | Bin 214 -> 243 bytes .../textures/wine_champagne_raw_glass.png | Bin 212 -> 0 bytes mods/wine/textures/wine_cointreau_bottle.png | Bin 0 -> 300 bytes mods/wine/textures/wine_cointreau_glass.png | Bin 0 -> 165 bytes mods/wine/textures/wine_drinking_glass.png | Bin 0 -> 610 bytes mods/wine/textures/wine_kefir_bottle.png | Bin 0 -> 893 bytes mods/wine/textures/wine_kefir_glass.png | Bin 0 -> 851 bytes mods/wine/textures/wine_margarita_glass.png | Bin 0 -> 182 bytes .../wine_sparkling_agave_juice_bottle.png | Bin 0 -> 902 bytes .../wine_sparkling_agave_juice_glass.png | Bin 0 -> 853 bytes .../wine_sparkling_apple_juice_bottle.png | Bin 0 -> 902 bytes .../wine_sparkling_apple_juice_glass.png | Bin 0 -> 859 bytes ...wine_sparkling_blackberry_juice_bottle.png | Bin 0 -> 887 bytes .../wine_sparkling_blackberry_juice_glass.png | Bin 0 -> 842 bytes .../wine_sparkling_carrot_juice_bottle.png | Bin 0 -> 884 bytes .../wine_sparkling_carrot_juice_glass.png | Bin 0 -> 832 bytes mods/wine/textures/wine_wheat_beer_glass.png | Bin 279 -> 247 bytes mods/wool/README.md | 26 +- mods/wool/depends.txt | 1 - mods/wool/init.lua | 129 +- mods/wool/license.txt | 25 + mods/wool/locale/template.txt | 16 + mods/wool/locale/wool.de.tr | 16 + mods/wool/locale/wool.eo.tr | 16 + mods/wool/locale/wool.es.tr | 16 + mods/wool/locale/wool.fr.tr | 16 + mods/wool/locale/wool.id.tr | 16 + mods/wool/locale/wool.it.tr | 16 + mods/wool/locale/wool.ja.tr | 16 + mods/wool/locale/wool.jbo.tr | 16 + mods/wool/locale/wool.ms.tr | 16 + mods/wool/locale/wool.pl.tr | 16 + mods/wool/locale/wool.pt_BR.tr | 16 + mods/wool/locale/wool.ru.tr | 16 + mods/wool/locale/wool.sk.tr | 16 + mods/wool/locale/wool.sv.tr | 16 + mods/wool/locale/wool.uk.tr | 16 + mods/wool/locale/wool.zh_CN.tr | 16 + mods/wool/locale/wool.zh_TW.tr | 16 + mods/wool/mod.conf | 4 +- mods/xban2/LICENSE | 24 + mods/xban2/init.lua | 17 +- mods/xban2/serialize.lua | 39 + mods/xcompat/.luacheckrc | 21 + mods/xcompat/LICENSE | 19 + mods/xcompat/README.md | 34 + mods/xcompat/doc/functions.md | 13 + mods/xcompat/doc/gameid.md | 12 + mods/xcompat/doc/materials.md | 3 + mods/xcompat/doc/player.md | 13 + mods/xcompat/doc/sounds.md | 35 + mods/xcompat/doc/textures.md | 3 + mods/xcompat/gitattributes | 2 + mods/xcompat/init.lua | 51 + mods/xcompat/mod.conf | 3 + mods/xcompat/mtt.lua | 10 + mods/xcompat/src/commands.lua | 76 + mods/xcompat/src/functions.lua | 55 + mods/xcompat/src/gameid.lua | 33 + mods/xcompat/src/materials.lua | 8 + .../src/materials/farlands_reloaded.lua | 93 + .../xcompat/src/materials/hades_revisited.lua | 107 + mods/xcompat/src/materials/mineclonia.lua | 96 + mods/xcompat/src/materials/minetest.lua | 106 + mods/xcompat/src/player.lua | 8 + mods/xcompat/src/player/farlands_reloaded.lua | 51 + mods/xcompat/src/player/mineclonia.lua | 40 + mods/xcompat/src/player/minetest.lua | 41 + mods/xcompat/src/player/xcompat_agnostic.lua | 41 + mods/xcompat/src/sounds.lua | 8 + mods/xcompat/src/sounds/exile.lua | 67 + mods/xcompat/src/sounds/farlands_reloaded.lua | 65 + mods/xcompat/src/sounds/forgotten_lands.lua | 63 + mods/xcompat/src/sounds/hades_revisited.lua | 66 + mods/xcompat/src/sounds/ksurvive2.lua | 107 + mods/xcompat/src/sounds/mineclonia.lua | 67 + mods/xcompat/src/sounds/minetest.lua | 67 + mods/xcompat/src/sounds/xcompat_agnostic.lua | 63 + mods/xcompat/src/textures.lua | 8 + .../src/textures/farlands_reloaded.lua | 57 + mods/xcompat/src/textures/minetest.lua | 57 + .../xcompat/src/textures/xcompat_agnostic.lua | 65 + mods/xcompat/src/utilities.lua | 8 + .../test/nodelist/farlands_reloaded.txt | 356 + .../xcompat/test/nodelist/hades_revisited.txt | 2966 ++++++++ mods/xcompat/test/nodelist/mineclonia.txt | 3517 +++++++++ mods/xcompat/test/nodelist/minetest.txt | 1494 ++++ mods/xcompat/test/nodelist/voxelibre.txt | 2530 ++++++ mods/xdecor/src/chess.lua | 2 + mods/xdecor/src/enchanting.lua | 29 +- mods/xdecor/src/mechanisms.lua | 7 +- mods/xdecor/src/nodes.lua | 7 + mods/xdecor/src/workbench.lua | 1 + ...t-all-world.mt-regenerate-from-config-file | 9 +- reset-map-and-players | 2 - setup-mt | 8 +- 7941 files changed, 89381 insertions(+), 63052 deletions(-) create mode 100644 mods/3d_armor/.ldoc/crafting.luadoc delete mode 100755 mods/3d_armor/.ldoc/parse_crafts.py delete mode 100644 mods/3d_armor/3d_armor/LICENSE.txt delete mode 100644 mods/3d_armor/3d_armor/armor.lua delete mode 100644 mods/3d_armor/3d_armor/depends.txt delete mode 100644 mods/3d_armor/3d_armor/description.txt create mode 100644 mods/3d_armor/3d_armor/locale/3d_armor.eo.tr create mode 100644 mods/3d_armor/3d_armor/locale/3d_armor.pl.tr create mode 100644 mods/3d_armor/3d_armor/locale/3d_armor.sv.tr delete mode 100644 mods/3d_armor/3d_armor/textures/3d_armor_trans.png delete mode 100644 mods/3d_armor/3d_armor/textures/preview_index.txt delete mode 100644 mods/3d_armor/3d_armor_ip/LICENSE.txt delete mode 100644 mods/3d_armor/3d_armor_ip/depends.txt delete mode 100644 mods/3d_armor/3d_armor_ip/description.txt create mode 100644 mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr create mode 100644 mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr create mode 100644 mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr create mode 100644 mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr delete mode 100644 mods/3d_armor/3d_armor_sfinv/LICENSE.txt delete mode 100644 mods/3d_armor/3d_armor_sfinv/depends.txt delete mode 100644 mods/3d_armor/3d_armor_sfinv/description.txt create mode 100644 mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr create mode 100644 mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr create mode 100644 mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr create mode 100644 mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr delete mode 100644 mods/3d_armor/3d_armor_stand/LICENSE.txt delete mode 100644 mods/3d_armor/3d_armor_stand/depends.txt create mode 100644 mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr create mode 100644 mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr create mode 100644 mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr create mode 100644 mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr create mode 100755 mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr create mode 100644 mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr create mode 100644 mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png delete mode 100644 mods/3d_armor/3d_armor_ui/LICENSE.txt delete mode 100644 mods/3d_armor/3d_armor_ui/description.txt create mode 100644 mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr create mode 100644 mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr create mode 100644 mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr create mode 100644 mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr create mode 100644 mods/3d_armor/armor_admin/init.lua create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.de.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.eo.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.es.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.fr.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.it.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.ms.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.pt.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.ru.tr create mode 100644 mods/3d_armor/armor_admin/locale/armor_admin.sv.tr create mode 100644 mods/3d_armor/armor_admin/locale/template.txt create mode 100644 mods/3d_armor/armor_admin/mod.conf rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_boots_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_boots_admin_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_chestplate_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_chestplate_admin_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_helmet_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_helmet_admin_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_inv_boots_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_inv_chestplate_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_inv_helmet_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_inv_leggings_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_leggings_admin.png (100%) rename mods/3d_armor/{3d_armor => armor_admin}/textures/3d_armor_leggings_admin_preview.png (100%) create mode 100644 mods/3d_armor/armor_bronze/init.lua create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr create mode 100644 mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr create mode 100644 mods/3d_armor/armor_bronze/locale/template.txt create mode 100644 mods/3d_armor/armor_bronze/mod.conf rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_boots_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_boots_bronze_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_chestplate_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_chestplate_bronze_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_helmet_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_helmet_bronze_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_inv_boots_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_inv_chestplate_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_inv_helmet_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_inv_leggings_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_leggings_bronze.png (100%) rename mods/3d_armor/{3d_armor => armor_bronze}/textures/3d_armor_leggings_bronze_preview.png (100%) create mode 100644 mods/3d_armor/armor_cactus/init.lua create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr create mode 100644 mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr create mode 100644 mods/3d_armor/armor_cactus/locale/template.txt create mode 100644 mods/3d_armor/armor_cactus/mod.conf rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_boots_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_boots_cactus_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_chestplate_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_chestplate_cactus_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_helmet_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_helmet_cactus_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_inv_boots_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_inv_chestplate_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_inv_helmet_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_inv_leggings_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_leggings_cactus.png (100%) rename mods/3d_armor/{3d_armor => armor_cactus}/textures/3d_armor_leggings_cactus_preview.png (100%) create mode 100644 mods/3d_armor/armor_crystal/init.lua create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr create mode 100644 mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr create mode 100644 mods/3d_armor/armor_crystal/locale/template.txt create mode 100644 mods/3d_armor/armor_crystal/mod.conf rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_boots_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_boots_crystal_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_chestplate_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_chestplate_crystal_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_helmet_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_helmet_crystal_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_inv_boots_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_inv_chestplate_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_inv_helmet_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_inv_leggings_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_leggings_crystal.png (100%) rename mods/3d_armor/{3d_armor => armor_crystal}/textures/3d_armor_leggings_crystal_preview.png (100%) create mode 100644 mods/3d_armor/armor_diamond/init.lua create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr create mode 100644 mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr create mode 100644 mods/3d_armor/armor_diamond/locale/template.txt create mode 100644 mods/3d_armor/armor_diamond/mod.conf rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_boots_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_boots_diamond_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_chestplate_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_chestplate_diamond_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_helmet_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_helmet_diamond_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_inv_boots_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_inv_chestplate_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_inv_helmet_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_inv_leggings_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_leggings_diamond.png (100%) rename mods/3d_armor/{3d_armor => armor_diamond}/textures/3d_armor_leggings_diamond_preview.png (100%) create mode 100644 mods/3d_armor/armor_gold/init.lua create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.de.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.eo.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.es.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.fr.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.it.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.ms.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.pt.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.ru.tr create mode 100644 mods/3d_armor/armor_gold/locale/armor_gold.sv.tr create mode 100644 mods/3d_armor/armor_gold/locale/template.txt create mode 100644 mods/3d_armor/armor_gold/mod.conf rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_boots_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_boots_gold_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_chestplate_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_chestplate_gold_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_helmet_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_helmet_gold_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_inv_boots_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_inv_chestplate_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_inv_helmet_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_inv_leggings_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_leggings_gold.png (100%) rename mods/3d_armor/{3d_armor => armor_gold}/textures/3d_armor_leggings_gold_preview.png (100%) create mode 100644 mods/3d_armor/armor_mithril/init.lua create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr create mode 100644 mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr create mode 100644 mods/3d_armor/armor_mithril/locale/template.txt create mode 100644 mods/3d_armor/armor_mithril/mod.conf rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_boots_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_boots_mithril_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_chestplate_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_chestplate_mithril_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_helmet_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_helmet_mithril_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_inv_boots_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_inv_chestplate_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_inv_helmet_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_inv_leggings_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_leggings_mithril.png (100%) rename mods/3d_armor/{3d_armor => armor_mithril}/textures/3d_armor_leggings_mithril_preview.png (100%) create mode 100644 mods/3d_armor/armor_nether/init.lua create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.de.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.eo.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.es.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.fr.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.it.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.ms.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.pt.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.ru.tr create mode 100644 mods/3d_armor/armor_nether/locale/armor_nether.sv.tr create mode 100644 mods/3d_armor/armor_nether/locale/template.txt create mode 100644 mods/3d_armor/armor_nether/mod.conf rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_boots_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_boots_nether_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_chestplate_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_chestplate_nether_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_helmet_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_helmet_nether_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_inv_boots_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_inv_chestplate_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_inv_helmet_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_inv_leggings_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_leggings_nether.png (100%) rename mods/3d_armor/{3d_armor => armor_nether}/textures/3d_armor_leggings_nether_preview.png (100%) create mode 100644 mods/3d_armor/armor_steel/init.lua create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.de.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.eo.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.es.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.fr.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.it.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.ms.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.pt.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.ru.tr create mode 100644 mods/3d_armor/armor_steel/locale/armor_steel.sv.tr create mode 100644 mods/3d_armor/armor_steel/locale/template.txt create mode 100644 mods/3d_armor/armor_steel/mod.conf rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_boots_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_boots_steel_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_chestplate_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_chestplate_steel_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_helmet_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_helmet_steel_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_inv_boots_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_inv_chestplate_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_inv_helmet_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_inv_leggings_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_leggings_steel.png (100%) rename mods/3d_armor/{3d_armor => armor_steel}/textures/3d_armor_leggings_steel_preview.png (100%) create mode 100644 mods/3d_armor/armor_wood/init.lua create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.de.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.eo.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.es.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.fr.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.it.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.ms.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.pt.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.ru.tr create mode 100644 mods/3d_armor/armor_wood/locale/armor_wood.sv.tr create mode 100644 mods/3d_armor/armor_wood/locale/template.txt create mode 100644 mods/3d_armor/armor_wood/mod.conf rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_boots_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_boots_wood_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_chestplate_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_chestplate_wood_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_helmet_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_helmet_wood_preview.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_inv_boots_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_inv_chestplate_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_inv_helmet_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_inv_leggings_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_leggings_wood.png (100%) rename mods/3d_armor/{3d_armor => armor_wood}/textures/3d_armor_leggings_wood_preview.png (100%) create mode 100644 mods/3d_armor/cc-by-sa-3.0.txt delete mode 100644 mods/3d_armor/description.txt create mode 100644 mods/3d_armor/lgpl-2.1.md delete mode 100644 mods/3d_armor/shields/LICENSE.txt delete mode 100644 mods/3d_armor/shields/depends.txt delete mode 100644 mods/3d_armor/shields/description.txt create mode 100644 mods/3d_armor/shields/locale/shields.eo.tr create mode 100644 mods/3d_armor/shields/locale/shields.es.tr create mode 100644 mods/3d_armor/shields/locale/shields.pt_BR.tr create mode 100755 mods/3d_armor/shields/locale/shields.ru.tr create mode 100644 mods/3d_armor/shields/locale/shields.sv.tr delete mode 100644 mods/3d_armor/wieldview/LICENSE.txt delete mode 100644 mods/3d_armor/wieldview/depends.txt delete mode 100644 mods/3d_armor/wieldview/description.txt create mode 100644 mods/3d_armor/wieldview/get_texture.lua create mode 100644 mods/Minetest-WorldEdit/.luacheckrc create mode 100644 mods/Minetest-WorldEdit/settingtypes.txt rename mods/Minetest-WorldEdit/worldedit/{test.lua => test/init.lua} (70%) create mode 100644 mods/Minetest-WorldEdit/worldedit/test/manipulations.lua create mode 100644 mods/Minetest-WorldEdit/worldedit/test/primitives.lua create mode 100644 mods/Minetest-WorldEdit/worldedit/test/schematic.lua delete mode 100644 mods/Minetest-WorldEdit/worldedit/textures/worldedit_wand.png create mode 100644 mods/Minetest-WorldEdit/worldedit/transformations.lua create mode 100644 mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt create mode 100644 mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/code.lua create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua rename mods/Minetest-WorldEdit/worldedit_commands/{mark.lua => marker.lua} (87%) create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/nodename.lua create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/primitives.lua create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/region.lua create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/schematics.lua create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_wand.png create mode 100644 mods/Minetest-WorldEdit/worldedit_commands/transform.lua create mode 120000 mods/advtrains/advtrains/locale/README.md delete mode 100644 mods/advtrains/advtrains/locale/advtrains.de.tr delete mode 100644 mods/advtrains/advtrains/locale/advtrains.zh_CN.tr create mode 100644 mods/advtrains/advtrains/po/README.md create mode 100644 mods/advtrains/advtrains/po/advtrains.pot create mode 100644 mods/advtrains/advtrains/po/de.po create mode 100644 mods/advtrains/advtrains/po/fr.po create mode 100755 mods/advtrains/advtrains/po/update-translations.sh create mode 100644 mods/advtrains/advtrains/po/zh_CN.po create mode 100644 mods/advtrains/advtrains/po/zh_TW.po create mode 100644 mods/advtrains/advtrains/poconvert.lua create mode 100644 mods/advtrains/advtrains/spec/poconvert_spec.lua create mode 100644 mods/advtrains/advtrains/spec/texture_spec.lua create mode 100644 mods/advtrains/advtrains/spec/wagons_spec.lua create mode 100644 mods/advtrains/advtrains/texture.lua create mode 100644 mods/advtrains/advtrains/textures/advtrains_wagon_prop_tool.png create mode 100644 mods/advtrains/advtrains/wagonprop_tool.lua mode change 100755 => 100644 mods/advtrains/advtrains_luaautomation/README.md mode change 100755 => 100644 mods/advtrains/advtrains_luaautomation/environment.lua mode change 100755 => 100644 mods/advtrains/advtrains_train_track/init.lua create mode 100644 mods/advtrains/advtrains_train_track/settingtypes.txt delete mode 100644 mods/ambience/depends.txt delete mode 100644 mods/ambience/description.txt rename mods/ambience/{sounds/SoundLicenses.txt => license.txt} (57%) create mode 100644 mods/ambience/locale/ambience.eo.tr create mode 100644 mods/ambience/locale/ambience.es.tr create mode 100644 mods/ambience/locale/ambience.pl.tr create mode 100644 mods/ambience/locale/template.txt create mode 100644 mods/ambience/screenshot.jpg delete mode 100644 mods/ambience/screenshot.png create mode 100644 mods/ambience/sounds/bats.ogg delete mode 100644 mods/ambience/sounds/swim_splashing.ogg delete mode 100644 mods/anvils/depends.txt create mode 100644 mods/anvils/mod.conf delete mode 100644 mods/bakedclay/depends.txt delete mode 100644 mods/bakedclay/description.txt create mode 100644 mods/bakedclay/flowers.lua create mode 100644 mods/bakedclay/locale/bakedclay.es.tr create mode 100644 mods/bakedclay/locale/template.txt create mode 100644 mods/bakedclay/lucky_block.lua create mode 100644 mods/basic_materials/README.md create mode 100644 mods/basic_materials/aliases.lua create mode 100644 mods/basic_materials/craftitems.lua create mode 100644 mods/basic_materials/crafts.lua delete mode 100644 mods/basic_materials/electrical-electronic.lua delete mode 100644 mods/basic_materials/metals.lua delete mode 100644 mods/basic_materials/misc.lua create mode 100644 mods/basic_materials/nodes.lua delete mode 100644 mods/basic_materials/plastics.lua create mode 100644 mods/basic_materials/textures/basic_materials_aluminum_bar.png create mode 100644 mods/basic_materials/textures/basic_materials_aluminum_strip.png create mode 100644 mods/basic_materials/textures/basic_materials_aluminum_wire.png create mode 100644 mods/basic_materials/textures/basic_materials_carbon_steel_bar.png create mode 100644 mods/basic_materials/textures/basic_materials_gold_strip.png create mode 100644 mods/basic_materials/textures/basic_materials_lead_strip.png create mode 100644 mods/basic_materials/textures/basic_materials_stainless_steel_bar.png create mode 100644 mods/basic_materials/textures/basic_materials_stainless_steel_strip.png create mode 100644 mods/basic_materials/textures/basic_materials_stainless_steel_wire.png create mode 100644 mods/basic_signs/.luacheckrc delete mode 100644 mods/basic_signs/depends.txt delete mode 100644 mods/basic_signs/intllib.lua create mode 100644 mods/basic_signs/locale/basic_signs.de.tr create mode 100644 mods/basic_signs/locale/basic_signs.es.tr create mode 100644 mods/basic_signs/locale/basic_signs.fr.tr create mode 100644 mods/basic_signs/locale/basic_signs.id.tr create mode 100644 mods/basic_signs/locale/basic_signs.ms.tr create mode 100644 mods/basic_signs/locale/basic_signs.ru.tr delete mode 100644 mods/basic_signs/locale/de.po delete mode 100644 mods/basic_signs/locale/es.po delete mode 100644 mods/basic_signs/locale/fr.po delete mode 100644 mods/basic_signs/locale/ms.po delete mode 100644 mods/basic_signs/locale/ru.po delete mode 100644 mods/basic_signs/locale/template.pot create mode 100644 mods/basic_signs/locale/template.txt create mode 100644 mods/basic_trains/advtrains_train_japan/textures/advtrains_engine_japan_livery.png create mode 100644 mods/basic_trains/advtrains_train_japan/textures/advtrains_wagon_japan_livery.png delete mode 100644 mods/bees/depends.txt delete mode 100644 mods/bees/description.txt create mode 100644 mods/bees/locale/bees.es.tr create mode 100644 mods/bees/locale/bees.fr.tr create mode 100644 mods/bees/screenshot.jpg delete mode 100644 mods/bees/screenshot.png delete mode 100644 mods/biome_lib/description.txt rename mods/blox/{LICENSE.txt => LICENSE} (100%) delete mode 100644 mods/blox/depends.txt delete mode 100644 mods/blox/description.txt delete mode 100644 mods/bonemeal/depends.txt delete mode 100644 mods/bonemeal/description.txt delete mode 100644 mods/bonemeal/intllib.lua delete mode 100644 mods/bonemeal/locale/es.txt delete mode 100644 mods/bonemeal/locale/fr.txt delete mode 100644 mods/bonemeal/locale/it.txt delete mode 100644 mods/bonemeal/locale/ru.txt delete mode 100644 mods/bonemeal/locale/template.txt create mode 100644 mods/bonemeal/screenshot.jpg delete mode 100644 mods/bonemeal/screenshot.png create mode 100644 mods/bonemeal/settingtypes.txt delete mode 100644 mods/bows/depends.txt delete mode 100644 mods/bows/description.txt create mode 100644 mods/bows/license.txt create mode 100644 mods/bows/sounds/bows_arrow_hit.ogg delete mode 100644 mods/builtin_item/depends.txt create mode 100644 mods/builtin_item/license.txt create mode 100644 mods/carpets/locale/carpets.de.tr create mode 100644 mods/carpets/locale/carpets.eo.tr create mode 100644 mods/carpets/locale/carpets.es.tr create mode 100644 mods/carpets/locale/carpets.hu.tr create mode 100644 mods/carpets/locale/carpets.it.tr create mode 100644 mods/carpets/locale/carpets.pl.tr create mode 100644 mods/carts/README.md delete mode 100644 mods/carts/README.txt create mode 100644 mods/carts/screenshot.png delete mode 100644 mods/castle/depends.txt create mode 100644 mods/castle/mod.conf create mode 100644 mods/cloud_items/screenshot.1.png create mode 100644 mods/cloud_items/screenshot.2.png create mode 100644 mods/cloud_items/screenshot.3.png create mode 100644 mods/cloud_items/screenshot.4.png create mode 100644 mods/cloud_items/screenshot.5.png create mode 100644 mods/cloud_items/screenshot.6.png create mode 100644 mods/cloud_items/screenshot.7.png create mode 100644 mods/cloud_items/screenshot.8.png create mode 100644 mods/cloud_items/screenshot.9.png create mode 100644 mods/coloredwood/.luacheckrc delete mode 100644 mods/coloredwood/depends.txt delete mode 100644 mods/coloredwood/description.txt create mode 100644 mods/cottages/mod.conf create mode 100644 mods/cottages/models/feldweg_45.b3d create mode 100644 mods/cottages/models/feldweg_d_45.b3d create mode 100644 mods/cottages/models/feldweg_l_45_curve.b3d create mode 100644 mods/cottages/models/feldweg_r_45_curve.b3d create mode 100644 mods/cottages/models/feldweg_s_45.b3d create mode 100644 mods/currency/.luacheckrc create mode 100644 mods/currency/locale/currency.id.tr create mode 100644 mods/death_compass/locale/death_compass.ru.tr create mode 100644 mods/digilines/.luacheckrc create mode 100644 mods/digilines/LICENSE.txt create mode 100644 mods/digilines/README.md create mode 100644 mods/digilines/characters create mode 100644 mods/digilines/docs/chest.md create mode 100644 mods/digilines/init.lua create mode 100644 mods/digilines/internal.lua create mode 100644 mods/digilines/inventory.lua create mode 100644 mods/digilines/lcd.lua create mode 100644 mods/digilines/lightsensor.lua create mode 100644 mods/digilines/locale/digilines.es.tr create mode 100644 mods/digilines/locale/digilines.zh_TW.tr create mode 100644 mods/digilines/locale/diglines.fr.tr create mode 100644 mods/digilines/locale/template.txt create mode 100644 mods/digilines/mod.conf create mode 100644 mods/digilines/presetrules.lua create mode 100644 mods/digilines/rtc.lua create mode 100644 mods/digilines/screenshot.png create mode 100644 mods/digilines/settingtypes.txt create mode 100644 mods/digilines/textures/_0.png create mode 100644 mods/digilines/textures/_1.png create mode 100644 mods/digilines/textures/_2.png create mode 100644 mods/digilines/textures/_3.png create mode 100644 mods/digilines/textures/_4.png create mode 100644 mods/digilines/textures/_5.png create mode 100644 mods/digilines/textures/_6.png create mode 100644 mods/digilines/textures/_7.png create mode 100644 mods/digilines/textures/_8.png create mode 100644 mods/digilines/textures/_9.png create mode 100644 mods/digilines/textures/_a.png create mode 100644 mods/digilines/textures/_a_.png create mode 100644 mods/digilines/textures/_am.png create mode 100644 mods/digilines/textures/_ap.png create mode 100644 mods/digilines/textures/_as.png create mode 100644 mods/digilines/textures/_at.png create mode 100644 mods/digilines/textures/_b.png create mode 100644 mods/digilines/textures/_b_.png create mode 100644 mods/digilines/textures/_bl.png create mode 100644 mods/digilines/textures/_br.png create mode 100644 mods/digilines/textures/_c.png create mode 100644 mods/digilines/textures/_c_.png create mode 100644 mods/digilines/textures/_ca.png create mode 100644 mods/digilines/textures/_cl.png create mode 100644 mods/digilines/textures/_cm.png create mode 100644 mods/digilines/textures/_co.png create mode 100644 mods/digilines/textures/_cr.png create mode 100644 mods/digilines/textures/_d.png create mode 100644 mods/digilines/textures/_d_.png create mode 100644 mods/digilines/textures/_dl.png create mode 100644 mods/digilines/textures/_dt.png create mode 100644 mods/digilines/textures/_dv.png create mode 100644 mods/digilines/textures/_e.png create mode 100644 mods/digilines/textures/_e_.png create mode 100644 mods/digilines/textures/_eq.png create mode 100644 mods/digilines/textures/_ex.png create mode 100644 mods/digilines/textures/_f.png create mode 100644 mods/digilines/textures/_f_.png create mode 100644 mods/digilines/textures/_g.png create mode 100644 mods/digilines/textures/_g_.png create mode 100644 mods/digilines/textures/_gt.png create mode 100644 mods/digilines/textures/_h.png create mode 100644 mods/digilines/textures/_h_.png create mode 100644 mods/digilines/textures/_ha.png create mode 100644 mods/digilines/textures/_hs.png create mode 100644 mods/digilines/textures/_i.png create mode 100644 mods/digilines/textures/_i_.png create mode 100644 mods/digilines/textures/_j.png create mode 100644 mods/digilines/textures/_j_.png create mode 100644 mods/digilines/textures/_k.png create mode 100644 mods/digilines/textures/_k_.png create mode 100644 mods/digilines/textures/_l.png create mode 100644 mods/digilines/textures/_l_.png create mode 100644 mods/digilines/textures/_lt.png create mode 100644 mods/digilines/textures/_m.png create mode 100644 mods/digilines/textures/_m_.png create mode 100644 mods/digilines/textures/_mn.png create mode 100644 mods/digilines/textures/_n.png create mode 100644 mods/digilines/textures/_n_.png create mode 100644 mods/digilines/textures/_o.png create mode 100644 mods/digilines/textures/_o_.png create mode 100644 mods/digilines/textures/_p.png create mode 100644 mods/digilines/textures/_p_.png create mode 100644 mods/digilines/textures/_pr.png create mode 100644 mods/digilines/textures/_ps.png create mode 100644 mods/digilines/textures/_q.png create mode 100644 mods/digilines/textures/_q_.png create mode 100644 mods/digilines/textures/_qo.png create mode 100644 mods/digilines/textures/_qu.png create mode 100644 mods/digilines/textures/_r.png create mode 100644 mods/digilines/textures/_r_.png create mode 100644 mods/digilines/textures/_re.png create mode 100644 mods/digilines/textures/_s.png create mode 100644 mods/digilines/textures/_s_.png create mode 100644 mods/digilines/textures/_sl.png create mode 100644 mods/digilines/textures/_sm.png create mode 100644 mods/digilines/textures/_sp.png create mode 100644 mods/digilines/textures/_sr.png create mode 100644 mods/digilines/textures/_t.png create mode 100644 mods/digilines/textures/_t_.png create mode 100644 mods/digilines/textures/_tl.png create mode 100644 mods/digilines/textures/_u.png create mode 100644 mods/digilines/textures/_u_.png create mode 100644 mods/digilines/textures/_un.png create mode 100644 mods/digilines/textures/_v.png create mode 100644 mods/digilines/textures/_v_.png create mode 100644 mods/digilines/textures/_vb.png create mode 100644 mods/digilines/textures/_w.png create mode 100644 mods/digilines/textures/_w_.png create mode 100644 mods/digilines/textures/_x.png create mode 100644 mods/digilines/textures/_x_.png create mode 100644 mods/digilines/textures/_y.png create mode 100644 mods/digilines/textures/_y_.png create mode 100644 mods/digilines/textures/_z.png create mode 100644 mods/digilines/textures/_z_.png create mode 100644 mods/digilines/textures/digiline_std.png create mode 100644 mods/digilines/textures/digiline_std_bump.png create mode 100644 mods/digilines/textures/digiline_std_inv.png create mode 100644 mods/digilines/textures/digiline_std_vertical.png create mode 100644 mods/digilines/textures/digilines_lightsensor.png create mode 100644 mods/digilines/textures/digilines_rtc.png create mode 100644 mods/digilines/textures/digilines_rtc_bottom.png create mode 100644 mods/digilines/textures/lcd_anyside.png create mode 100644 mods/digilines/textures/lcd_lcd.png create mode 100644 mods/digilines/util.lua create mode 100644 mods/digilines/wire_std.lua create mode 100644 mods/digilines/wires_common.lua delete mode 100644 mods/display_modpack/boards/depends.txt delete mode 100644 mods/display_modpack/font_api/depends.txt delete mode 100644 mods/display_modpack/font_metro/depends.txt delete mode 100644 mods/display_modpack/ontime_clocks/depends.txt delete mode 100644 mods/display_modpack/signs/depends.txt delete mode 100644 mods/display_modpack/signs_api/depends.txt delete mode 100644 mods/display_modpack/signs_road/depends.txt delete mode 100644 mods/display_modpack/steles/depends.txt rename mods/doors/{README.txt => README.md} (51%) delete mode 100644 mods/doors/depends.txt create mode 100644 mods/doors/locale/doors.de.tr create mode 100644 mods/doors/locale/doors.eo.tr create mode 100644 mods/doors/locale/doors.es.tr create mode 100644 mods/doors/locale/doors.fr.tr create mode 100644 mods/doors/locale/doors.id.tr create mode 100644 mods/doors/locale/doors.it.tr create mode 100644 mods/doors/locale/doors.ja.tr create mode 100644 mods/doors/locale/doors.jbo.tr create mode 100644 mods/doors/locale/doors.ms.tr create mode 100644 mods/doors/locale/doors.pl.tr create mode 100644 mods/doors/locale/doors.pt_BR.tr create mode 100644 mods/doors/locale/doors.ru.tr create mode 100644 mods/doors/locale/doors.sk.tr create mode 100644 mods/doors/locale/doors.sv.tr create mode 100644 mods/doors/locale/doors.uk.tr create mode 100644 mods/doors/locale/doors.zh_CN.tr create mode 100644 mods/doors/locale/doors.zh_TW.tr create mode 100644 mods/doors/locale/template.txt delete mode 100644 mods/doors/textures/doors_key.png create mode 100644 mods/doors/textures/doors_lock_tool.png create mode 100644 mods/doors/textures/doors_trapdoor_oak.png create mode 100644 mods/doors/textures/doors_trapdoor_oak_side.png rename mods/farming/{textures/farming_banana_leaf.png => alt_textures/ethereal_banana_leaf_32px.png} (100%) create mode 100644 mods/farming/alt_textures/ethereal_strawberry.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_1.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_2.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_3.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_4.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_5.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_6.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_7.png create mode 100644 mods/farming/alt_textures/ethereal_strawberry_8.png create mode 100644 mods/farming/alt_textures/farming_burger_32px.png create mode 100644 mods/farming/alt_textures/farming_mayo_32px.png create mode 100644 mods/farming/alt_textures/farming_paella_32px.png create mode 100644 mods/farming/alt_textures/farming_popcorn_32px.png create mode 100644 mods/farming/alt_textures/farming_potato_omelet_32px.png create mode 100644 mods/farming/alt_textures/farming_potato_salad_32px.png create mode 100644 mods/farming/alt_textures/farming_spaghetti_24px.png create mode 100644 mods/farming/alt_textures/farming_spanish_potatoes_32px.png create mode 100644 mods/farming/alt_textures/farming_sunflower_32px.png create mode 100644 mods/farming/alt_textures/farming_sunflower_bread_32px.png create mode 100644 mods/farming/alt_textures/farming_vanilla_flan_32px.png create mode 100644 mods/farming/crops/asparagus.lua create mode 100644 mods/farming/crops/eggplant.lua create mode 100644 mods/farming/crops/ginger.lua create mode 100644 mods/farming/crops/rye_oat.lua delete mode 100644 mods/farming/crops/ryeoatrice.lua create mode 100644 mods/farming/crops/spinach.lua create mode 100644 mods/farming/crops/strawberry.lua delete mode 100644 mods/farming/depends.txt delete mode 100644 mods/farming/description.txt delete mode 100644 mods/farming/food.lua delete mode 100644 mods/farming/intllib.lua create mode 100644 mods/farming/item_food.lua create mode 100644 mods/farming/item_list.lua create mode 100644 mods/farming/item_non_food.lua create mode 100644 mods/farming/item_recipes.lua create mode 100644 mods/farming/item_stairs.lua delete mode 100644 mods/farming/locale/de.txt create mode 100644 mods/farming/locale/farming.eo.tr create mode 100644 mods/farming/locale/farming.es.tr create mode 100644 mods/farming/locale/farming.hu.tr delete mode 100644 mods/farming/locale/fr.txt delete mode 100644 mods/farming/locale/it.txt delete mode 100644 mods/farming/locale/pt.txt delete mode 100644 mods/farming/locale/ru.txt delete mode 100644 mods/farming/locale/template.txt delete mode 100644 mods/farming/locale/zh_CN.txt delete mode 100644 mods/farming/locale/zh_TW.txt delete mode 100644 mods/farming/mapgen.lua create mode 100644 mods/farming/screenshot.jpg delete mode 100644 mods/farming/screenshot.png create mode 100644 mods/farming/textures/crops_garlic_braid_top.png create mode 100644 mods/farming/textures/ethereal_banana_leaf.png create mode 100644 mods/farming/textures/ethereal_strawberry.png create mode 100644 mods/farming/textures/ethereal_strawberry_1.png create mode 100644 mods/farming/textures/ethereal_strawberry_2.png create mode 100644 mods/farming/textures/ethereal_strawberry_3.png create mode 100644 mods/farming/textures/ethereal_strawberry_4.png create mode 100644 mods/farming/textures/ethereal_strawberry_5.png create mode 100644 mods/farming/textures/ethereal_strawberry_6.png create mode 100644 mods/farming/textures/ethereal_strawberry_7.png create mode 100644 mods/farming/textures/ethereal_strawberry_8.png create mode 100644 mods/farming/textures/farming_asparagus.png create mode 100644 mods/farming/textures/farming_asparagus_1.png create mode 100644 mods/farming/textures/farming_asparagus_2.png create mode 100644 mods/farming/textures/farming_asparagus_3.png create mode 100644 mods/farming/textures/farming_asparagus_4.png create mode 100644 mods/farming/textures/farming_asparagus_5.png create mode 100644 mods/farming/textures/farming_barley_8.png create mode 100644 mods/farming/textures/farming_chili_powder.png create mode 100644 mods/farming/textures/farming_eggplant.png create mode 100644 mods/farming/textures/farming_eggplant_1.png create mode 100644 mods/farming/textures/farming_eggplant_2.png create mode 100644 mods/farming/textures/farming_eggplant_3.png create mode 100644 mods/farming/textures/farming_eggplant_4.png create mode 100644 mods/farming/textures/farming_ginger.png create mode 100644 mods/farming/textures/farming_ginger_1.png create mode 100644 mods/farming/textures/farming_ginger_2.png create mode 100644 mods/farming/textures/farming_ginger_3.png create mode 100644 mods/farming/textures/farming_ginger_4.png create mode 100644 mods/farming/textures/farming_gingerbread_man.png create mode 100644 mods/farming/textures/farming_jerusalem_artichokes.png create mode 100644 mods/farming/textures/farming_mac_and_cheese.png create mode 100644 mods/farming/textures/farming_mayo.png create mode 100644 mods/farming/textures/farming_rhubarb_4.png create mode 100644 mods/farming/textures/farming_rice_seed.png create mode 100644 mods/farming/textures/farming_spinach.png create mode 100644 mods/farming/textures/farming_spinach_1.png create mode 100644 mods/farming/textures/farming_spinach_2.png create mode 100644 mods/farming/textures/farming_spinach_3.png create mode 100644 mods/farming/textures/farming_spinach_4.png create mode 100644 mods/farming/textures/farming_sugar_cube.png create mode 100644 mods/farming/textures/farming_vegan_butter.png delete mode 100644 mods/farming/utensils.lua create mode 100644 mods/flowerpot/locale/flowerpot.eo.tr create mode 100644 mods/flowerpot/locale/flowerpot.es.tr delete mode 100644 mods/gloopblocks/intllib.lua delete mode 100644 mods/gloopblocks/locale/de.po delete mode 100644 mods/gloopblocks/locale/fr.po create mode 100644 mods/gloopblocks/locale/gloopblocks.de.tr create mode 100644 mods/gloopblocks/locale/gloopblocks.fr.tr create mode 100644 mods/gloopblocks/locale/gloopblocks.id.tr create mode 100644 mods/gloopblocks/locale/gloopblocks.ru.tr delete mode 100644 mods/gloopblocks/locale/ru.po delete mode 100644 mods/gloopblocks/locale/template.pot create mode 100644 mods/gloopblocks/locale/template.txt create mode 100644 mods/home_workshop_modpack/home_vending_machines/crafts.lua create mode 100644 mods/homedecor_modpack/.luacheckrc delete mode 100644 mods/homedecor_modpack/README create mode 100644 mods/homedecor_modpack/README.md delete mode 100644 mods/homedecor_modpack/bower.json delete mode 100644 mods/homedecor_modpack/building_blocks/.luacheckrc delete mode 100644 mods/homedecor_modpack/fake_fire/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_3d_extras/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_bathroom/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_bedroom/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_books/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_climate_control/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_clocks/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_cobweb/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_common/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_common/sit.lua delete mode 100644 mods/homedecor_modpack/homedecor_common/textures/homedecor_blanktile.png create mode 100644 mods/homedecor_modpack/homedecor_common/xcompat.lua delete mode 100644 mods/homedecor_modpack/homedecor_doors_and_gates/.luacheckrc rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_closet_a.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_closet_b.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_fancy_a.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_fancy_b.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_french_a.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_french_b.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_wood_glass_3_a.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_wood_glass_3_b.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_wrought_iron_a.obj (100%) rename mods/homedecor_modpack/{homedecor_3d_extras => homedecor_doors_and_gates}/models/homedecor_door_wrought_iron_b.obj (100%) delete mode 100644 mods/homedecor_modpack/homedecor_electrical/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_electronics/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_exterior/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_fences/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_foyer/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_furniture/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_furniture_medieval/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_gastronomy/.luacheckrc rename mods/homedecor_modpack/{inbox => homedecor_inbox}/init.lua (86%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.de.tr (56%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.es.tr (50%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.fr.tr (61%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.ms.tr (53%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.pt.tr (51%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.pt_BR.tr (51%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.ru.tr (65%) rename mods/homedecor_modpack/{inbox => homedecor_inbox}/locale/inbox.zh_CN.tr (50%) create mode 100644 mods/homedecor_modpack/homedecor_inbox/locale/template.txt create mode 100644 mods/homedecor_modpack/homedecor_inbox/mod.conf rename mods/homedecor_modpack/{inbox/models/inbox_mailbox.obj => homedecor_inbox/models/homedecor_inbox_mailbox.obj} (100%) rename mods/homedecor_modpack/{inbox/textures/inbox_grey_metal.png => homedecor_inbox/textures/homedecor_inbox_grey_metal.png} (100%) rename mods/homedecor_modpack/{inbox/textures/inbox_red_metal.png => homedecor_inbox/textures/homedecor_inbox_red_metal.png} (100%) rename mods/homedecor_modpack/{inbox/textures/inbox_white_metal.png => homedecor_inbox/textures/homedecor_inbox_white_metal.png} (100%) rename mods/homedecor_modpack/{inbox/textures/mailbox_inv.png => homedecor_inbox/textures/homedecor_mailbox_inv.png} (100%) delete mode 100644 mods/homedecor_modpack/homedecor_kitchen/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_laundry/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_lighting/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_office/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_pictures_and_paintings/.luacheckrc rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/init.lua (71%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.de.tr (72%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.es.tr (75%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.fr.tr (70%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.ms.tr (66%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.pt.tr (70%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.pt_BR.tr (70%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.ru.tr (82%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/plasmascreen.zh_CN.tr (68%) rename mods/homedecor_modpack/{plasmascreen => homedecor_plasmascreen}/locale/template.txt (52%) create mode 100644 mods/homedecor_modpack/homedecor_plasmascreen/mod.conf rename mods/homedecor_modpack/{plasmascreen/models/plasmascreen_tv.obj => homedecor_plasmascreen/models/homedecor_plasmascreen_tv.obj} (100%) rename mods/homedecor_modpack/{plasmascreen/textures/plasmascreen_back.png => homedecor_plasmascreen/textures/homedecor_plasmascreen_back.png} (100%) rename mods/homedecor_modpack/{plasmascreen/textures/plasmascreen_case.png => homedecor_plasmascreen/textures/homedecor_plasmascreen_case.png} (100%) rename mods/homedecor_modpack/{plasmascreen/textures/plasmascreen_case_off.png => homedecor_plasmascreen/textures/homedecor_plasmascreen_case_off.png} (100%) rename mods/homedecor_modpack/{plasmascreen/textures/plasmascreen_screen_off.png => homedecor_plasmascreen/textures/homedecor_plasmascreen_screen_off.png} (100%) rename mods/homedecor_modpack/{plasmascreen/textures/plasmascreen_tv_inv.png => homedecor_plasmascreen/textures/homedecor_plasmascreen_tv_inv.png} (100%) rename mods/homedecor_modpack/{plasmascreen/textures/plasmascreen_video.png => homedecor_plasmascreen/textures/homedecor_plasmascreen_video.png} (100%) delete mode 100644 mods/homedecor_modpack/homedecor_roofing/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_seating/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_seating/README.txt delete mode 100644 mods/homedecor_modpack/homedecor_tables/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_trash_cans/.luacheckrc delete mode 100644 mods/homedecor_modpack/homedecor_windows_and_treatments/.luacheckrc delete mode 100644 mods/homedecor_modpack/inbox/.luacheckrc delete mode 100644 mods/homedecor_modpack/inbox/locale/template.txt delete mode 100644 mods/homedecor_modpack/inbox/mod.conf delete mode 100644 mods/homedecor_modpack/itemframes/.luacheckrc delete mode 100644 mods/homedecor_modpack/lavalamp/.luacheckrc delete mode 100644 mods/homedecor_modpack/listnodes.sh delete mode 100644 mods/homedecor_modpack/modpack.txt delete mode 100644 mods/homedecor_modpack/plasmascreen/.luacheckrc delete mode 100644 mods/homedecor_modpack/plasmascreen/README.md delete mode 100644 mods/homedecor_modpack/plasmascreen/mod.conf delete mode 100644 mods/ilights/depends.txt delete mode 100644 mods/ilights/description.txt create mode 100644 mods/letters/.luacheckrc create mode 100644 mods/letters/api.lua delete mode 100644 mods/letters/depends.txt create mode 100644 mods/letters/letter_cutter.lua create mode 100644 mods/letters/textures/letters_0d_overlay.png create mode 100644 mods/letters/textures/letters_1d_overlay.png create mode 100644 mods/letters/textures/letters_2d_overlay.png create mode 100644 mods/letters/textures/letters_3d_overlay.png create mode 100644 mods/letters/textures/letters_4d_overlay.png create mode 100644 mods/letters/textures/letters_5d_overlay.png create mode 100644 mods/letters/textures/letters_6d_overlay.png create mode 100644 mods/letters/textures/letters_7d_overlay.png create mode 100644 mods/letters/textures/letters_8d_overlay.png create mode 100644 mods/letters/textures/letters_9d_overlay.png create mode 100644 mods/letters/textures/letters_letter_cutter_digit_top.png create mode 100644 mods/lib_mount/settingtypes.txt create mode 100644 mods/mesecons/.luacheckrc create mode 100644 mods/mesecons/.test/minetest.conf create mode 100755 mods/mesecons/.test/run.sh create mode 100644 mods/mesecons/.test_fixtures/mesecons.lua create mode 100644 mods/mesecons/.test_fixtures/mesecons_fpga.lua create mode 100644 mods/mesecons/.test_fixtures/mesecons_gamecompat.lua create mode 100644 mods/mesecons/.test_fixtures/mesecons_luacontroller.lua create mode 100644 mods/mesecons/.test_fixtures/mesecons_mvps.lua create mode 100644 mods/mesecons/.test_fixtures/screwdriver.lua create mode 100644 mods/mesecons/COPYING.txt create mode 100644 mods/mesecons/LICENSE.txt create mode 100644 mods/mesecons/README.md create mode 100644 mods/mesecons/bower.json create mode 100644 mods/mesecons/documentation.json create mode 100644 mods/mesecons/mesecons/actionqueue.lua create mode 100644 mods/mesecons/mesecons/fifo_queue.lua create mode 100644 mods/mesecons/mesecons/init.lua create mode 100644 mods/mesecons/mesecons/internal.lua create mode 100644 mods/mesecons/mesecons/legacy.lua create mode 100644 mods/mesecons/mesecons/locale/mesecons.de.tr create mode 100644 mods/mesecons/mesecons/locale/mesecons.eo.tr create mode 100644 mods/mesecons/mesecons/locale/mesecons.fr.tr create mode 100644 mods/mesecons/mesecons/locale/template.txt create mode 100644 mods/mesecons/mesecons/mod.conf create mode 100644 mods/mesecons/mesecons/oldwires.lua create mode 100644 mods/mesecons/mesecons/presets.lua create mode 100644 mods/mesecons/mesecons/services.lua create mode 100644 mods/mesecons/mesecons/settings.lua create mode 100644 mods/mesecons/mesecons/spec/action_spec.lua create mode 100644 mods/mesecons/mesecons/spec/mineunit.conf create mode 100644 mods/mesecons/mesecons/spec/service_spec.lua create mode 100644 mods/mesecons/mesecons/spec/state_spec.lua create mode 100644 mods/mesecons/mesecons/textures/jeija_close_window.png create mode 100644 mods/mesecons/mesecons/textures/jeija_luacontroller_LED_A.png create mode 100644 mods/mesecons/mesecons/textures/jeija_luacontroller_LED_B.png create mode 100644 mods/mesecons/mesecons/textures/jeija_luacontroller_LED_C.png create mode 100644 mods/mesecons/mesecons/textures/jeija_luacontroller_LED_D.png create mode 100644 mods/mesecons/mesecons/textures/jeija_microcontroller_bottom.png create mode 100644 mods/mesecons/mesecons/textures/jeija_microcontroller_sides.png create mode 100644 mods/mesecons/mesecons/textures/mesecons_wire_inv.png create mode 100644 mods/mesecons/mesecons/textures/mesecons_wire_off.png create mode 100644 mods/mesecons/mesecons/textures/mesecons_wire_on.png create mode 100644 mods/mesecons/mesecons/util.lua create mode 100644 mods/mesecons/mesecons_alias/init.lua create mode 100644 mods/mesecons/mesecons_alias/mod.conf create mode 100644 mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/description.html create mode 100644 mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/preview.png create mode 100644 mods/mesecons/mesecons_blinkyplant/doc/blinkyplant/recipe.png create mode 100644 mods/mesecons/mesecons_blinkyplant/init.lua create mode 100644 mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.de.tr create mode 100644 mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.eo.tr create mode 100644 mods/mesecons/mesecons_blinkyplant/locale/mesecons_blinkyplant.fr.tr create mode 100644 mods/mesecons/mesecons_blinkyplant/locale/template.txt create mode 100644 mods/mesecons/mesecons_blinkyplant/mod.conf create mode 100644 mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png create mode 100644 mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png create mode 100644 mods/mesecons/mesecons_button/doc/button/description.html create mode 100644 mods/mesecons/mesecons_button/doc/button/preview.png create mode 100644 mods/mesecons/mesecons_button/doc/button/recipe.png create mode 100644 mods/mesecons/mesecons_button/init.lua create mode 100644 mods/mesecons/mesecons_button/locale/mesecons_button.de.tr create mode 100644 mods/mesecons/mesecons_button/locale/mesecons_button.eo.tr create mode 100644 mods/mesecons/mesecons_button/locale/mesecons_button.fr.tr create mode 100644 mods/mesecons/mesecons_button/locale/template.txt create mode 100644 mods/mesecons/mesecons_button/mod.conf create mode 100644 mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg create mode 100644 mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg create mode 100644 mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png create mode 100644 mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png create mode 100644 mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png create mode 100644 mods/mesecons/mesecons_commandblock/doc/commandblock/description.html create mode 100644 mods/mesecons/mesecons_commandblock/doc/commandblock/preview.png create mode 100644 mods/mesecons/mesecons_commandblock/init.lua create mode 100644 mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.de.tr create mode 100644 mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.eo.tr create mode 100644 mods/mesecons/mesecons_commandblock/locale/mesecons_commandblock.fr.tr create mode 100644 mods/mesecons/mesecons_commandblock/locale/template.txt create mode 100644 mods/mesecons/mesecons_commandblock/mod.conf create mode 100644 mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png create mode 100644 mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png create mode 100644 mods/mesecons/mesecons_delayer/doc/delayer/description.html create mode 100644 mods/mesecons/mesecons_delayer/doc/delayer/preview.png create mode 100644 mods/mesecons/mesecons_delayer/doc/delayer/recipe.png create mode 100644 mods/mesecons/mesecons_delayer/init.lua create mode 100644 mods/mesecons/mesecons_delayer/locale/mesecons_delayer.de.tr create mode 100644 mods/mesecons/mesecons_delayer/locale/mesecons_delayer.eo.tr create mode 100644 mods/mesecons/mesecons_delayer/locale/mesecons_delayer.fr.tr create mode 100644 mods/mesecons/mesecons_delayer/locale/template.txt create mode 100644 mods/mesecons/mesecons_delayer/mod.conf create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_delayer.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_off.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_on.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_output_off.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_output_on.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_side.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_off.png create mode 100644 mods/mesecons/mesecons_delayer/textures/jeija_gate_side_output_on.png create mode 100644 mods/mesecons/mesecons_delayer/textures/mesecons_delayer_1.png create mode 100644 mods/mesecons/mesecons_delayer/textures/mesecons_delayer_2.png create mode 100644 mods/mesecons/mesecons_delayer/textures/mesecons_delayer_3.png create mode 100644 mods/mesecons/mesecons_delayer/textures/mesecons_delayer_4.png create mode 100644 mods/mesecons/mesecons_detector/doc/nodedetector/description.html create mode 100644 mods/mesecons/mesecons_detector/doc/nodedetector/preview.png create mode 100644 mods/mesecons/mesecons_detector/doc/nodedetector/recipe.png create mode 100644 mods/mesecons/mesecons_detector/doc/objectdetector/description.html create mode 100644 mods/mesecons/mesecons_detector/doc/objectdetector/preview.png create mode 100644 mods/mesecons/mesecons_detector/doc/objectdetector/recipe.png create mode 100644 mods/mesecons/mesecons_detector/init.lua create mode 100644 mods/mesecons/mesecons_detector/locale/mesecons_detector.de.tr create mode 100644 mods/mesecons/mesecons_detector/locale/mesecons_detector.eo.tr create mode 100644 mods/mesecons/mesecons_detector/locale/mesecons_detector.fr.tr create mode 100644 mods/mesecons/mesecons_detector/locale/template.txt create mode 100644 mods/mesecons/mesecons_detector/mod.conf create mode 100644 mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png create mode 100644 mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png create mode 100644 mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png create mode 100644 mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png create mode 100644 mods/mesecons/mesecons_detector/textures/mesecons_detector_side.png create mode 100644 mods/mesecons/mesecons_doors/init.lua create mode 100644 mods/mesecons/mesecons_doors/mod.conf create mode 100644 mods/mesecons/mesecons_extrawires/corner.lua create mode 100644 mods/mesecons/mesecons_extrawires/crossover.lua create mode 100644 mods/mesecons/mesecons_extrawires/doc/corner/description.html create mode 100644 mods/mesecons/mesecons_extrawires/doc/corner/preview.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/corner/recipe.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/crossing/description.html create mode 100644 mods/mesecons/mesecons_extrawires/doc/crossing/preview.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/crossing/recipe.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/mese/description.html create mode 100644 mods/mesecons/mesecons_extrawires/doc/mese/preview.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/mese/recipe.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/tjunction/description.html create mode 100644 mods/mesecons/mesecons_extrawires/doc/tjunction/preview.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/tjunction/recipe.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/vertical/description.html create mode 100644 mods/mesecons/mesecons_extrawires/doc/vertical/preview.png create mode 100644 mods/mesecons/mesecons_extrawires/doc/vertical/recipe.png create mode 100644 mods/mesecons/mesecons_extrawires/doublecorner.lua create mode 100644 mods/mesecons/mesecons_extrawires/init.lua create mode 100644 mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.de.tr create mode 100644 mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.eo.tr create mode 100644 mods/mesecons/mesecons_extrawires/locale/mesecons_extrawires.fr.tr create mode 100644 mods/mesecons/mesecons_extrawires/locale/template.txt create mode 100644 mods/mesecons/mesecons_extrawires/mesewire.lua create mode 100644 mods/mesecons/mesecons_extrawires/mod.conf create mode 100644 mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_corner.obj create mode 100644 mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_crossover.b3d create mode 100644 mods/mesecons/mesecons_extrawires/models/mesecons_extrawires_doublecorner.obj create mode 100644 mods/mesecons/mesecons_extrawires/src/mesecons_extrawires_crossover.blend create mode 100644 mods/mesecons/mesecons_extrawires/tjunction.lua create mode 100644 mods/mesecons/mesecons_extrawires/vertical.lua create mode 100644 mods/mesecons/mesecons_fpga/doc/fpga/description.html create mode 100644 mods/mesecons/mesecons_fpga/doc/fpga/preview.png create mode 100644 mods/mesecons/mesecons_fpga/doc/fpga/recipe.png create mode 100644 mods/mesecons/mesecons_fpga/doc/programmer/description.html create mode 100644 mods/mesecons/mesecons_fpga/doc/programmer/preview.png create mode 100644 mods/mesecons/mesecons_fpga/doc/programmer/recipe.png create mode 100644 mods/mesecons/mesecons_fpga/init.lua create mode 100644 mods/mesecons/mesecons_fpga/locale/mesecons_fpga.de.tr create mode 100644 mods/mesecons/mesecons_fpga/locale/mesecons_fpga.eo.tr create mode 100644 mods/mesecons/mesecons_fpga/locale/mesecons_fpga.fr.tr create mode 100644 mods/mesecons/mesecons_fpga/locale/template.txt create mode 100644 mods/mesecons/mesecons_fpga/logic.lua create mode 100644 mods/mesecons/mesecons_fpga/mod.conf create mode 100644 mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_copy.ogg create mode 100644 mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_fail.ogg create mode 100644 mods/mesecons/mesecons_fpga/sounds/mesecons_fpga_write.ogg create mode 100644 mods/mesecons/mesecons_fpga/spec/helper_spec.lua create mode 100644 mods/mesecons/mesecons_fpga/spec/logic_spec.lua create mode 100644 mods/mesecons/mesecons_fpga/spec/mineunit.conf create mode 100644 mods/mesecons/mesecons_fpga/textures/jeija_fpga_programmer.png create mode 100644 mods/mesecons/mesecons_fpga/textures/jeija_fpga_sides.png create mode 100644 mods/mesecons/mesecons_fpga/textures/jeija_fpga_top.png create mode 100644 mods/mesecons/mesecons_fpga/tool.lua create mode 100644 mods/mesecons/mesecons_gamecompat/compat_mcl.lua create mode 100644 mods/mesecons/mesecons_gamecompat/compat_mtg.lua create mode 100644 mods/mesecons/mesecons_gamecompat/init.lua create mode 100644 mods/mesecons/mesecons_gamecompat/mod.conf create mode 100644 mods/mesecons/mesecons_gates/doc/and/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/and/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/and/recipe.png create mode 100644 mods/mesecons/mesecons_gates/doc/diode/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/diode/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/diode/recipe.png create mode 100644 mods/mesecons/mesecons_gates/doc/nand/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/nand/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/nand/recipe.png create mode 100644 mods/mesecons/mesecons_gates/doc/nor/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/nor/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/nor/recipe.png create mode 100644 mods/mesecons/mesecons_gates/doc/not/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/not/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/not/recipe.png create mode 100644 mods/mesecons/mesecons_gates/doc/or/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/or/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/or/recipe.png create mode 100644 mods/mesecons/mesecons_gates/doc/xor/description.html create mode 100644 mods/mesecons/mesecons_gates/doc/xor/preview.png create mode 100644 mods/mesecons/mesecons_gates/doc/xor/recipe.png create mode 100644 mods/mesecons/mesecons_gates/init.lua create mode 100644 mods/mesecons/mesecons_gates/mod.conf create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_and.png create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_nor.png create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_not.png create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_or.png create mode 100644 mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png create mode 100644 mods/mesecons/mesecons_hydroturbine/doc/waterturbine/description.html create mode 100644 mods/mesecons/mesecons_hydroturbine/doc/waterturbine/preview.png create mode 100644 mods/mesecons/mesecons_hydroturbine/doc/waterturbine/recipe.png create mode 100644 mods/mesecons/mesecons_hydroturbine/init.lua create mode 100644 mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.de.tr create mode 100644 mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.eo.tr create mode 100644 mods/mesecons/mesecons_hydroturbine/locale/mesecons_hydroturbine.fr.tr create mode 100644 mods/mesecons/mesecons_hydroturbine/locale/template.txt create mode 100644 mods/mesecons/mesecons_hydroturbine/mod.conf create mode 100644 mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_off.obj create mode 100644 mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine_on.obj create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_off.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc_on.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_off.png create mode 100644 mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom_on.png create mode 100644 mods/mesecons/mesecons_insulated/doc/insulated/description.html create mode 100644 mods/mesecons/mesecons_insulated/doc/insulated/preview.png create mode 100644 mods/mesecons/mesecons_insulated/doc/insulated/recipe.png create mode 100644 mods/mesecons/mesecons_insulated/init.lua create mode 100644 mods/mesecons/mesecons_insulated/locale/mesecons_insulated.de.tr create mode 100644 mods/mesecons/mesecons_insulated/locale/mesecons_insulated.eo.tr create mode 100644 mods/mesecons/mesecons_insulated/locale/mesecons_insulated.fr.tr create mode 100644 mods/mesecons/mesecons_insulated/locale/template.txt create mode 100644 mods/mesecons/mesecons_insulated/mod.conf create mode 100644 mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png create mode 100644 mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png create mode 100644 mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png create mode 100644 mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png create mode 100644 mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png create mode 100644 mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png create mode 100644 mods/mesecons/mesecons_lamp/doc/lamp/description.html create mode 100644 mods/mesecons/mesecons_lamp/doc/lamp/preview.png create mode 100644 mods/mesecons/mesecons_lamp/doc/lamp/recipe.png create mode 100644 mods/mesecons/mesecons_lamp/init.lua create mode 100644 mods/mesecons/mesecons_lamp/locale/mesecons_lamp.de.tr create mode 100644 mods/mesecons/mesecons_lamp/locale/mesecons_lamp.eo.tr create mode 100644 mods/mesecons/mesecons_lamp/locale/mesecons_lamp.fr.tr create mode 100644 mods/mesecons/mesecons_lamp/locale/template.txt create mode 100644 mods/mesecons/mesecons_lamp/mod.conf create mode 100644 mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png create mode 100644 mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png create mode 100644 mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_blue/description.html create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_blue/preview.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_blue/recipe.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/description.html create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/preview.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_darkgrey/recipe.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_green/description.html create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_green/preview.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_green/recipe.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/description.html create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/preview.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_lightgrey/recipe.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_red/description.html create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_red/preview.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_red/recipe.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/description.html create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/preview.png create mode 100644 mods/mesecons/mesecons_lightstone/doc/lightstone_yellow/recipe.png create mode 100644 mods/mesecons/mesecons_lightstone/init.lua create mode 100644 mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.de.tr create mode 100644 mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.eo.tr create mode 100644 mods/mesecons/mesecons_lightstone/locale/mesecons_lightstone.fr.tr create mode 100644 mods/mesecons/mesecons_lightstone/locale/template.txt create mode 100644 mods/mesecons/mesecons_lightstone/mod.conf create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_cyan_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_magenta_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_orange_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_pink_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_violet_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_white_on.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png create mode 100644 mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png create mode 100644 mods/mesecons/mesecons_luacontroller/doc/luacontroller/description.html create mode 100644 mods/mesecons/mesecons_luacontroller/doc/luacontroller/preview.png create mode 100644 mods/mesecons/mesecons_luacontroller/doc/luacontroller/recipe.png create mode 100644 mods/mesecons/mesecons_luacontroller/init.lua create mode 100644 mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.de.tr create mode 100644 mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.eo.tr create mode 100644 mods/mesecons/mesecons_luacontroller/locale/mesecons_luacontroller.fr.tr create mode 100644 mods/mesecons/mesecons_luacontroller/locale/template.txt create mode 100644 mods/mesecons/mesecons_luacontroller/mod.conf create mode 100644 mods/mesecons/mesecons_luacontroller/spec/lightweight_interrupt_spec.lua create mode 100644 mods/mesecons/mesecons_luacontroller/spec/luac_spec.lua create mode 100644 mods/mesecons/mesecons_luacontroller/spec/mineunit.conf create mode 100644 mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png create mode 100644 mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png create mode 100644 mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png create mode 100644 mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png create mode 100644 mods/mesecons/mesecons_materials/doc/fiber/description.html create mode 100644 mods/mesecons/mesecons_materials/doc/fiber/preview.png create mode 100644 mods/mesecons/mesecons_materials/doc/fiber/recipe.png create mode 100644 mods/mesecons/mesecons_materials/doc/glue/description.html create mode 100644 mods/mesecons/mesecons_materials/doc/glue/preview.png create mode 100644 mods/mesecons/mesecons_materials/doc/glue/recipe.png create mode 100644 mods/mesecons/mesecons_materials/doc/silicon/description.html create mode 100644 mods/mesecons/mesecons_materials/doc/silicon/preview.png create mode 100644 mods/mesecons/mesecons_materials/doc/silicon/recipe.png create mode 100644 mods/mesecons/mesecons_materials/init.lua create mode 100644 mods/mesecons/mesecons_materials/locale/mesecons_materials.de.tr create mode 100644 mods/mesecons/mesecons_materials/locale/mesecons_materials.eo.tr create mode 100644 mods/mesecons/mesecons_materials/locale/mesecons_materials.fr.tr create mode 100644 mods/mesecons/mesecons_materials/locale/template.txt create mode 100644 mods/mesecons/mesecons_materials/mod.conf create mode 100644 mods/mesecons/mesecons_materials/textures/mesecons_fiber.png create mode 100644 mods/mesecons/mesecons_materials/textures/mesecons_glue.png create mode 100644 mods/mesecons/mesecons_materials/textures/mesecons_silicon.png create mode 100644 mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.html create mode 100644 mods/mesecons/mesecons_microcontroller/doc/microcontroller/description.md create mode 100644 mods/mesecons/mesecons_microcontroller/doc/microcontroller/preview.png create mode 100644 mods/mesecons/mesecons_microcontroller/doc/microcontroller/recipe.png create mode 100644 mods/mesecons/mesecons_microcontroller/init.lua create mode 100644 mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.de.tr create mode 100644 mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.eo.tr create mode 100644 mods/mesecons/mesecons_microcontroller/locale/mesecons_microcontroller.fr.tr create mode 100644 mods/mesecons/mesecons_microcontroller/locale/template.txt create mode 100644 mods/mesecons/mesecons_microcontroller/mod.conf create mode 100644 mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png create mode 100644 mods/mesecons/mesecons_movestones/doc/movestone/description.html create mode 100644 mods/mesecons/mesecons_movestones/doc/movestone/preview.png create mode 100644 mods/mesecons/mesecons_movestones/doc/movestone/recipe.png create mode 100644 mods/mesecons/mesecons_movestones/doc/movestone_sticky/description.html create mode 100644 mods/mesecons/mesecons_movestones/doc/movestone_sticky/preview.png create mode 100644 mods/mesecons/mesecons_movestones/doc/movestone_sticky/recipe.png create mode 100644 mods/mesecons/mesecons_movestones/init.lua create mode 100644 mods/mesecons/mesecons_movestones/locale/mesecons_movestone.fr.tr create mode 100644 mods/mesecons/mesecons_movestones/locale/mesecons_movestones.de.tr create mode 100644 mods/mesecons/mesecons_movestones/locale/mesecons_movestones.eo.tr create mode 100644 mods/mesecons/mesecons_movestones/locale/template.txt create mode 100644 mods/mesecons/mesecons_movestones/mod.conf create mode 100644 mods/mesecons/mesecons_movestones/sounds/movestone.ogg create mode 100644 mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png create mode 100644 mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png create mode 100644 mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png create mode 100644 mods/mesecons/mesecons_mvps/init.lua create mode 100644 mods/mesecons/mesecons_mvps/mod.conf create mode 100644 mods/mesecons/mesecons_mvps/spec/mineunit.conf create mode 100644 mods/mesecons/mesecons_mvps/spec/node_spec.lua create mode 100644 mods/mesecons/mesecons_mvps/spec/object_spec.lua create mode 100644 mods/mesecons/mesecons_noteblock/README.txt create mode 100644 mods/mesecons/mesecons_noteblock/doc/noteblock/description.html create mode 100644 mods/mesecons/mesecons_noteblock/doc/noteblock/preview.png create mode 100644 mods/mesecons/mesecons_noteblock/doc/noteblock/recipe.png create mode 100644 mods/mesecons/mesecons_noteblock/init.lua create mode 100644 mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.de.tr create mode 100644 mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.eo.tr create mode 100644 mods/mesecons/mesecons_noteblock/locale/mesecons_noteblock.fr.tr create mode 100644 mods/mesecons/mesecons_noteblock/locale/template.txt create mode 100644 mods/mesecons/mesecons_noteblock/mod.conf create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg create mode 100644 mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg create mode 100644 mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png create mode 100644 mods/mesecons/mesecons_pistons/doc/piston/description.html create mode 100644 mods/mesecons/mesecons_pistons/doc/piston/preview.png create mode 100644 mods/mesecons/mesecons_pistons/doc/piston/recipe.png create mode 100644 mods/mesecons/mesecons_pistons/doc/piston_sticky/description.html create mode 100644 mods/mesecons/mesecons_pistons/doc/piston_sticky/preview.png create mode 100644 mods/mesecons/mesecons_pistons/doc/piston_sticky/recipe.png create mode 100644 mods/mesecons/mesecons_pistons/init.lua create mode 100644 mods/mesecons/mesecons_pistons/legacy.lua create mode 100644 mods/mesecons/mesecons_pistons/locale/mesecons_pistons.de.tr create mode 100644 mods/mesecons/mesecons_pistons/locale/mesecons_pistons.eo.tr create mode 100644 mods/mesecons/mesecons_pistons/locale/mesecons_pistons.fr.tr create mode 100644 mods/mesecons/mesecons_pistons/locale/template.txt create mode 100644 mods/mesecons/mesecons_pistons/mod.conf create mode 100644 mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg create mode 100644 mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png create mode 100644 mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png create mode 100644 mods/mesecons/mesecons_powerplant/doc/powerplant/description.html create mode 100644 mods/mesecons/mesecons_powerplant/doc/powerplant/preview.png create mode 100644 mods/mesecons/mesecons_powerplant/doc/powerplant/recipe.png create mode 100644 mods/mesecons/mesecons_powerplant/init.lua create mode 100644 mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.de.tr create mode 100644 mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.eo.tr create mode 100644 mods/mesecons/mesecons_powerplant/locale/mesecons_powerplant.fr.tr create mode 100644 mods/mesecons/mesecons_powerplant/locale/template.txt create mode 100644 mods/mesecons/mesecons_powerplant/mod.conf create mode 100644 mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png create mode 100644 mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/description.html create mode 100644 mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/preview.png create mode 100644 mods/mesecons/mesecons_pressureplates/doc/pressureplate_stone/recipe.png create mode 100644 mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/description.html create mode 100644 mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/preview.png create mode 100644 mods/mesecons/mesecons_pressureplates/doc/pressureplate_wood/recipe.png create mode 100644 mods/mesecons/mesecons_pressureplates/init.lua create mode 100644 mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.de.tr create mode 100644 mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.eo.tr create mode 100644 mods/mesecons/mesecons_pressureplates/locale/mesecons_pressureplates.fr.tr create mode 100644 mods/mesecons/mesecons_pressureplates/locale/template.txt create mode 100644 mods/mesecons/mesecons_pressureplates/mod.conf create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png create mode 100644 mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png create mode 100644 mods/mesecons/mesecons_random/doc/ghoststone/description.html create mode 100644 mods/mesecons/mesecons_random/doc/ghoststone/preview.png create mode 100644 mods/mesecons/mesecons_random/doc/ghoststone/recipe.png create mode 100644 mods/mesecons/mesecons_random/doc/removestone/description.html create mode 100644 mods/mesecons/mesecons_random/doc/removestone/preview.png create mode 100644 mods/mesecons/mesecons_random/doc/removestone/recipe.png create mode 100644 mods/mesecons/mesecons_random/init.lua create mode 100644 mods/mesecons/mesecons_random/locale/mesecons_random.de.tr create mode 100644 mods/mesecons/mesecons_random/locale/mesecons_random.eo.tr create mode 100644 mods/mesecons/mesecons_random/locale/mesecons_random.fr.tr create mode 100644 mods/mesecons/mesecons_random/locale/template.txt create mode 100644 mods/mesecons/mesecons_random/mod.conf create mode 100644 mods/mesecons/mesecons_random/textures/jeija_ghoststone.png create mode 100644 mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png create mode 100644 mods/mesecons/mesecons_random/textures/jeija_removestone.png create mode 100644 mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png create mode 100644 mods/mesecons/mesecons_receiver/init.lua create mode 100644 mods/mesecons/mesecons_receiver/mod.conf create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_top_off.png create mode 100644 mods/mesecons/mesecons_receiver/textures/receiver_top_on.png create mode 100644 mods/mesecons/mesecons_solarpanel/doc/solarpanel/description.html create mode 100644 mods/mesecons/mesecons_solarpanel/doc/solarpanel/preview.png create mode 100644 mods/mesecons/mesecons_solarpanel/doc/solarpanel/recipe.png create mode 100644 mods/mesecons/mesecons_solarpanel/init.lua create mode 100644 mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.de.tr create mode 100644 mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.eo.tr create mode 100644 mods/mesecons/mesecons_solarpanel/locale/mesecons_solarpanel.fr.tr create mode 100644 mods/mesecons/mesecons_solarpanel/locale/template.txt create mode 100644 mods/mesecons/mesecons_solarpanel/mod.conf create mode 100644 mods/mesecons/mesecons_solarpanel/textures/mesecons_solarpanel.png create mode 100644 mods/mesecons/mesecons_stickyblocks/init.lua create mode 100644 mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.de.tr create mode 100644 mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.eo.tr create mode 100644 mods/mesecons/mesecons_stickyblocks/locale/mesecons_stickyblocks.fr.tr create mode 100644 mods/mesecons/mesecons_stickyblocks/locale/template.txt create mode 100644 mods/mesecons/mesecons_stickyblocks/mod.conf create mode 100644 mods/mesecons/mesecons_stickyblocks/textures/mesecons_stickyblocks_sticky.png create mode 100644 mods/mesecons/mesecons_switch/doc/switch/description.html create mode 100644 mods/mesecons/mesecons_switch/doc/switch/preview.png create mode 100644 mods/mesecons/mesecons_switch/doc/switch/recipe.png create mode 100644 mods/mesecons/mesecons_switch/init.lua create mode 100644 mods/mesecons/mesecons_switch/locale/mesecons_switch.de.tr create mode 100644 mods/mesecons/mesecons_switch/locale/mesecons_switch.eo.tr create mode 100644 mods/mesecons/mesecons_switch/locale/mesecons_switch.fr.tr create mode 100644 mods/mesecons/mesecons_switch/locale/template.txt create mode 100644 mods/mesecons/mesecons_switch/mod.conf create mode 100644 mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg create mode 100644 mods/mesecons/mesecons_switch/textures/mesecons_switch_off.png create mode 100644 mods/mesecons/mesecons_switch/textures/mesecons_switch_on.png create mode 100644 mods/mesecons/mesecons_switch/textures/mesecons_switch_side.png create mode 100644 mods/mesecons/mesecons_torch/doc/torch/description.html create mode 100644 mods/mesecons/mesecons_torch/doc/torch/preview.png create mode 100644 mods/mesecons/mesecons_torch/doc/torch/recipe.png create mode 100644 mods/mesecons/mesecons_torch/init.lua create mode 100644 mods/mesecons/mesecons_torch/locale/mesecons_torch.de.tr create mode 100644 mods/mesecons/mesecons_torch/locale/mesecons_torch.eo.tr create mode 100644 mods/mesecons/mesecons_torch/locale/mesecons_torch.fr.tr create mode 100644 mods/mesecons/mesecons_torch/locale/template.txt create mode 100644 mods/mesecons/mesecons_torch/mod.conf create mode 100644 mods/mesecons/mesecons_torch/textures/jeija_torches_off.png create mode 100644 mods/mesecons/mesecons_torch/textures/jeija_torches_on.png create mode 100644 mods/mesecons/mesecons_walllever/doc/walllever/description.html create mode 100644 mods/mesecons/mesecons_walllever/doc/walllever/preview.png create mode 100644 mods/mesecons/mesecons_walllever/doc/walllever/recipe.png create mode 100644 mods/mesecons/mesecons_walllever/init.lua create mode 100644 mods/mesecons/mesecons_walllever/locale/mesecons_walllever.de.tr create mode 100644 mods/mesecons/mesecons_walllever/locale/mesecons_walllever.eo.tr create mode 100644 mods/mesecons/mesecons_walllever/locale/mesecons_walllever.fr.tr create mode 100644 mods/mesecons/mesecons_walllever/locale/template.txt create mode 100644 mods/mesecons/mesecons_walllever/mod.conf create mode 100644 mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj create mode 100644 mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj create mode 100644 mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg create mode 100644 mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png create mode 100644 mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png create mode 100644 mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png create mode 100644 mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png create mode 100644 mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png create mode 100644 mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png create mode 100644 mods/mesecons/mesecons_wires/doc/mesecon/description.html create mode 100644 mods/mesecons/mesecons_wires/doc/mesecon/preview.png create mode 100644 mods/mesecons/mesecons_wires/doc/mesecon/recipe.png create mode 100644 mods/mesecons/mesecons_wires/init.lua create mode 100644 mods/mesecons/mesecons_wires/locale/mesecons_wires.de.tr create mode 100644 mods/mesecons/mesecons_wires/locale/mesecons_wires.eo.tr create mode 100644 mods/mesecons/mesecons_wires/locale/mesecons_wires.fr.tr create mode 100644 mods/mesecons/mesecons_wires/locale/template.txt create mode 100644 mods/mesecons/mesecons_wires/mod.conf create mode 100644 mods/mesecons/modpack.conf create mode 100644 mods/mesecons/screenshot.png create mode 100644 mods/mesecons/settingtypes.txt create mode 100644 mods/minetest_mtg_plus/locale/mtg_plus.fr.tr delete mode 100644 mods/mob_horse/depends.txt delete mode 100644 mods/mob_horse/intllib.lua delete mode 100644 mods/mob_horse/locale/it_IT.po delete mode 100644 mods/mob_horse/locale/ms.po delete mode 100644 mods/mob_horse/locale/template.pot delete mode 100644 mods/mob_horse/locale/zh_CN.pot delete mode 100644 mods/mob_horse/locale/zh_CN.txt delete mode 100644 mods/mob_horse/locale/zh_TW.txt create mode 100644 mods/mobs_animal/alt_textures/mobs_cheeseblock_32px.png delete mode 100644 mods/mobs_animal/depends.txt delete mode 100644 mods/mobs_animal/description.txt delete mode 100644 mods/mobs_animal/intllib.lua delete mode 100644 mods/mobs_animal/locale/README.md delete mode 100644 mods/mobs_animal/locale/de.po delete mode 100644 mods/mobs_animal/locale/fr.po delete mode 100644 mods/mobs_animal/locale/it.po create mode 100644 mods/mobs_animal/locale/mobs_animal.eo.tr create mode 100644 mods/mobs_animal/locale/mobs_animal.es.tr delete mode 100644 mods/mobs_animal/locale/ms.po delete mode 100644 mods/mobs_animal/locale/po2tr.lua delete mode 100644 mods/mobs_animal/locale/pt.po delete mode 100644 mods/mobs_animal/locale/pt.txt delete mode 100644 mods/mobs_animal/locale/pt_BR.po delete mode 100644 mods/mobs_animal/locale/pt_BR.txt delete mode 100644 mods/mobs_animal/locale/ru.po delete mode 100644 mods/mobs_animal/locale/template.pot delete mode 100644 mods/mobs_animal/locale/tr.po delete mode 100644 mods/mobs_animal/locale/zh_CN.pot delete mode 100644 mods/mobs_animal/locale/zh_CN.txt delete mode 100644 mods/mobs_animal/locale/zh_TW.txt delete mode 100644 mods/mobs_animal/models/mobs_sheep_shaved.b3d create mode 100644 mods/mobs_animal/settingtypes.txt create mode 100755 mods/mobs_animal/textures/mobs_kitten_black.png create mode 100644 mods/mobs_animal/textures/mobs_rat3.png create mode 100644 mods/mobs_animal/textures/mobs_sheep_horns.png create mode 100644 mods/mobs_animal/textures/mobs_wooden_bucket_milk.png delete mode 100644 mods/mobs_monster/depends.txt delete mode 100644 mods/mobs_monster/description.txt delete mode 100644 mods/mobs_monster/intllib.lua delete mode 100644 mods/mobs_monster/locale/de.txt delete mode 100644 mods/mobs_monster/locale/fr.txt delete mode 100644 mods/mobs_monster/locale/it.txt create mode 100644 mods/mobs_monster/locale/mobs_monster.es.tr create mode 100644 mods/mobs_monster/locale/mobs_monster.pt_BR.tr create mode 100644 mods/mobs_monster/locale/mobs_monster.ru.tr delete mode 100644 mods/mobs_monster/locale/ms.txt delete mode 100644 mods/mobs_monster/locale/template.txt delete mode 100644 mods/mobs_monster/locale/tr.txt delete mode 100644 mods/mobs_monster/locale/zh_CN.txt delete mode 100644 mods/mobs_monster/locale/zh_TW.txt create mode 100644 mods/mobs_monster/models/mobs_mese_monster.b3d create mode 100644 mods/mobs_monster/models/zmobs_lava_flan.b3d delete mode 100644 mods/mobs_monster/models/zmobs_lava_flan.x delete mode 100644 mods/mobs_monster/models/zmobs_mese_monster.x create mode 100644 mods/mobs_monster/screenshot.jpg create mode 100644 mods/mobs_monster/settingtypes.txt create mode 100644 mods/mobs_monster/textures/mobs_mese_arrow.png create mode 100644 mods/mobs_monster/textures/mobs_mese_monster_blue.png create mode 100644 mods/mobs_monster/textures/mobs_mese_monster_green.png create mode 100644 mods/mobs_monster/textures/mobs_mese_monster_purple.png create mode 100644 mods/mobs_monster/textures/mobs_mese_monster_red.png create mode 100644 mods/mobs_monster/textures/mobs_stone_monster4.png create mode 100644 mods/mobs_monster/textures/mobs_tree_monster_template.png delete mode 100644 mods/mobs_monster/textures/zmobs_mese_monster.png delete mode 100644 mods/mobs_monster/textures/zmobs_mese_monster_old.png delete mode 100644 mods/mobs_npc/depends.txt create mode 100644 mods/mobs_npc/functions.lua delete mode 100644 mods/mobs_npc/intllib.lua delete mode 100644 mods/mobs_npc/locale/de.txt delete mode 100644 mods/mobs_npc/locale/it_IT.txt create mode 100644 mods/mobs_npc/locale/mobs_npc.es.tr create mode 100644 mods/mobs_npc/locale/mobs_npc.ru.tr delete mode 100644 mods/mobs_npc/locale/ms.txt delete mode 100644 mods/mobs_npc/locale/template.txt delete mode 100644 mods/mobs_npc/locale/zh_CN.txt delete mode 100644 mods/mobs_npc/locale/zh_TW.txt create mode 100644 mods/mobs_npc/textures/mobs_npc5.png create mode 100644 mods/mobs_npc/textures/mobs_npc6.png create mode 100644 mods/mobs_npc/textures/mobs_npc_shop_icon.png create mode 100644 mods/mobs_npc/textures/mobs_trader4.png create mode 100644 mods/mobs_redo/.luacheckrc delete mode 100644 mods/mobs_redo/depends.txt delete mode 100644 mods/mobs_redo/description.txt delete mode 100644 mods/mobs_redo/intllib.lua delete mode 100644 mods/mobs_redo/locale/de_DE.po delete mode 100644 mods/mobs_redo/locale/es.po delete mode 100644 mods/mobs_redo/locale/fr.po delete mode 100644 mods/mobs_redo/locale/it.po create mode 100644 mods/mobs_redo/locale/mobs.pt_BR.tr delete mode 100644 mods/mobs_redo/locale/ms.po delete mode 100644 mods/mobs_redo/locale/pt.po delete mode 100644 mods/mobs_redo/locale/ru.po delete mode 100644 mods/mobs_redo/locale/template.pot create mode 100644 mods/mobs_redo/locale/template.txt delete mode 100644 mods/mobs_redo/locale/tr.po delete mode 100644 mods/mobs_redo/locale/zh_CN.po delete mode 100644 mods/mobs_redo/locale/zh_TW.po delete mode 100644 mods/mobs_redo/sounds/default_punch.ogg delete mode 100644 mods/mobs_redo/sounds/license.txt create mode 100644 mods/mobs_redo/sounds/mobs_punch.ogg create mode 100644 mods/mobs_redo/textures/mobs_fallback.png create mode 100644 mods/mobs_redo/textures/mobs_hearing_vines.png create mode 100644 mods/mobs_redo/textures/mobs_hearing_vines_active.png create mode 100644 mods/mobs_redo/textures/mobs_meat_raw_bottom.png create mode 100644 mods/mobs_redo/textures/mobs_meat_raw_side.png create mode 100644 mods/mobs_redo/textures/mobs_meat_raw_top.png create mode 100644 mods/mobs_redo/textures/mobs_pint_sized_rune.png delete mode 100644 mods/mobs_sky/mobs_bat/depends.txt create mode 100644 mods/mobs_sky/mobs_bat/spawn_example.lua delete mode 100644 mods/mobs_sky/mobs_bat/textures/Thumbs.db delete mode 100644 mods/mobs_sky/mobs_birds/SETTINGS.txt delete mode 100644 mods/mobs_sky/mobs_birds/depends.txt create mode 100755 mods/mobs_sky/mobs_birds/settingtypes.txt create mode 100644 mods/mobs_sky/mobs_birds/spawn_example.lua delete mode 100644 mods/mobs_sky/mobs_butterfly/depends.txt create mode 100644 mods/mobs_sky/screenshot.png delete mode 100644 mods/mobs_water/mobs_crocs/depends.txt create mode 100644 mods/mobs_water/mobs_crocs/spawn_example.lua delete mode 100644 mods/mobs_water/mobs_fish/depends.txt create mode 100644 mods/mobs_water/mobs_fish/spawn_example.lua delete mode 100644 mods/mobs_water/mobs_jellyfish/depends.txt create mode 100644 mods/mobs_water/mobs_jellyfish/spawn_example.lua delete mode 100644 mods/mobs_water/mobs_sharks/SETTINGS.txt delete mode 100644 mods/mobs_water/mobs_sharks/depends.txt create mode 100755 mods/mobs_water/mobs_sharks/settingtypes.txt create mode 100644 mods/mobs_water/mobs_sharks/spawn_example.lua delete mode 100644 mods/mobs_water/mobs_turtles/depends.txt create mode 100644 mods/mobs_water/mobs_turtles/spawn_example.lua create mode 100644 mods/mobs_water/screenshot.png create mode 100644 mods/moreblocks/locale/moreblocks.pt_BR.tr delete mode 100644 mods/moreores/.travis.yml delete mode 100644 mods/moreores/locale/moreores.en.tr create mode 100755 mods/moreores/locale/moreores.ru.tr create mode 100644 mods/moreores/locale/template.txt delete mode 100644 mods/moretrees/default_settings.txt create mode 100644 mods/moretrees/locale/moretrees.ru.tr create mode 100644 mods/moretrees/settings.lua delete mode 100644 mods/mydeck/depends.txt delete mode 100644 mods/mydeck/description.txt delete mode 100644 mods/mydoors/description.txt create mode 100644 mods/mydoors/modpack.conf delete mode 100644 mods/mydoors/modpack.txt delete mode 100644 mods/mydoors/my_castle_doors/depends.txt delete mode 100644 mods/mydoors/my_castle_doors/description.txt delete mode 100644 mods/mydoors/my_cottage_doors/depends.txt delete mode 100644 mods/mydoors/my_cottage_doors/description.txt delete mode 100644 mods/mydoors/my_default_doors/depends.txt delete mode 100644 mods/mydoors/my_default_doors/description.txt delete mode 100644 mods/mydoors/my_door_wood/depends.txt delete mode 100644 mods/mydoors/my_door_wood/description.txt delete mode 100644 mods/mydoors/my_fancy_doors/depends.txt delete mode 100644 mods/mydoors/my_fancy_doors/description.txt delete mode 100644 mods/mydoors/my_future_doors/depends.txt delete mode 100644 mods/mydoors/my_future_doors/description.txt delete mode 100644 mods/mydoors/my_garage_door/description.txt delete mode 100644 mods/mydoors/my_hidden_doors/depends.txt delete mode 100644 mods/mydoors/my_hidden_doors/description.txt delete mode 100644 mods/mydoors/my_misc_doors/depends.txt delete mode 100644 mods/mydoors/my_misc_doors/description.txt delete mode 100644 mods/mydoors/my_old_doors/depends.txt delete mode 100644 mods/mydoors/my_old_doors/description.txt delete mode 100644 mods/mydoors/my_saloon_doors/depends.txt delete mode 100644 mods/mydoors/my_saloon_doors/description.txt delete mode 100644 mods/mydoors/my_sliding_doors/description.txt create mode 100644 mods/mywalls/.cdb.json create mode 100644 mods/mywalls/.luacheckrc delete mode 100644 mods/mywalls/depends.txt delete mode 100644 mods/mywalls/description.txt create mode 100644 mods/mywalls/locale/mywalls.ru.tr create mode 100644 mods/mywalls/locale/mywalls.sv.tr create mode 100644 mods/mywalls/locale/mywalls.uk.tr create mode 100644 mods/mywalls/locale/template.txt create mode 100644 mods/new_campfire/locale/new_campfire.id.tr delete mode 100644 mods/pie/depends.txt delete mode 100644 mods/pie/description.txt create mode 100644 mods/pie/screenshot.jpg delete mode 100644 mods/pie/screenshot.png create mode 100644 mods/pie/settingtypes.txt create mode 100644 mods/pie/textures/bana_side_inside.png create mode 100644 mods/pie/textures/brpd_side_inside.png create mode 100644 mods/pie/textures/choc_side_inside.png create mode 100644 mods/pie/textures/coff_side_inside.png create mode 100644 mods/pie/textures/meat_side_inside.png create mode 100644 mods/pie/textures/orange_side_inside.png create mode 100644 mods/pie/textures/pie_side_inside.png create mode 100644 mods/pie/textures/rvel_side_inside.png create mode 100644 mods/pie/textures/scsk_side_inside.png create mode 100644 mods/plantlife_modpack/bushes/locale/bushes.de.tr create mode 100644 mods/plantlife_modpack/bushes/locale/bushes.eo.tr delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1L.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1R.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm2.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm3.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm4.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesCenter.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide1.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide2.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/blank.png delete mode 100644 mods/plantlife_modpack/bushes/textures/old & unused/moretrees_pine_leaves3.png create mode 100644 mods/plantlife_modpack/bushes_classic/locale/bushes_classic.eo.tr create mode 100644 mods/plantlife_modpack/cavestuff/locale/cavestuff.de.tr create mode 100644 mods/plantlife_modpack/cavestuff/locale/cavestuff.eo.tr create mode 100644 mods/plantlife_modpack/dryplants/locale/dryplants.de.tr create mode 100644 mods/plantlife_modpack/dryplants/locale/dryplants.eo.tr delete mode 100644 mods/plantlife_modpack/dryplants/settings.txt delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_8.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/big_pic_9.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_cattailsG_m2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_left.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_right.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_02_whole2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_left.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_right.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_juncus_03_whole2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_01.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_02.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_03.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_04.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_left.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_bottom_right.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_left.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_right.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_left.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/dryplants_reedmace_top_right.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace3.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/reedmace4.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/reedtest.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/not_in_use/texturing.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old3.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_grass_short_old4.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_left_old.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_02_right_old.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_left_old.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_juncus_03_right_old.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_left_old2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_old4.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_bottom_right_old2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_left_old2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_old8.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_right_old2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_spikes_old3.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_left_old2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_old3.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_top_right_old2.png delete mode 100644 mods/plantlife_modpack/dryplants/textures/old/dryplants_reedmace_water_old2.png create mode 100644 mods/plantlife_modpack/ferns/locale/ferns.de.tr create mode 100644 mods/plantlife_modpack/ferns/locale/ferns.eo.tr delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/archaeplantae_horsetails.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/big picture 3.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_left.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_big_right.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_left.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_mid_right.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_bl.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_tree_br.png delete mode 100644 mods/plantlife_modpack/ferns/textures/not_in_use/ferns_fern_trunk_big_crown.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/archaeplantae_fern_old4.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/comb.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_5_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_6_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_7_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_big_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_mid_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_tree_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_old2.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_big_top_old2.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_fern_trunk_top_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_01_old2.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_02_old2.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_03_old2.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_horsetail_04_old2.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_cross_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_end_old.png delete mode 100644 mods/plantlife_modpack/ferns/textures/old/ferns_tree_fern_leave_big_old.png delete mode 100644 mods/plantlife_modpack/junglegrass/init.lua delete mode 100644 mods/plantlife_modpack/junglegrass/mod.conf delete mode 100644 mods/plantlife_modpack/modpack.txt create mode 100644 mods/plantlife_modpack/molehills/locale/molehills.de.tr create mode 100644 mods/plantlife_modpack/molehills/locale/molehills.eo.tr delete mode 100644 mods/plantlife_modpack/molehills/textures/old & unused/molehill_side.png delete mode 100644 mods/plantlife_modpack/molehills/textures/old & unused/molehill_top.png create mode 100644 mods/plantlife_modpack/nature_classic/locale/nature_classic.de.tr create mode 100644 mods/plantlife_modpack/nature_classic/locale/nature_classic.txt create mode 100644 mods/plantlife_modpack/pl_seaweed/locale/pl_seawood.eo.tr create mode 100644 mods/plantlife_modpack/pl_sunflowers/locale/pl_sunflowers.eo.tr create mode 100644 mods/plantlife_modpack/pl_waterlilies/locale/pl_waterlilies.eo.tr create mode 100644 mods/plantlife_modpack/poisonivy/locale/poisonivy.eo.tr create mode 100644 mods/plantlife_modpack/poisonivy/locale/template.txt create mode 100644 mods/plantlife_modpack/trunks/locale/trunks.de.tr create mode 100644 mods/plantlife_modpack/trunks/locale/trunks.eo.tr delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/comboSticks.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/comboSticks_2.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_root_mask_old.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1e.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_1n.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_2n.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_3n.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_4n.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_5-8.png delete mode 100644 mods/plantlife_modpack/trunks/textures/old & unused/trunks_twig_9-12.png delete mode 100644 mods/plantlife_modpack/trunks/trunks_settings.txt create mode 100644 mods/plantlife_modpack/vines/locale/vines.de.tr create mode 100644 mods/plantlife_modpack/vines/locale/vines.eo.tr rename mods/{display_modpack/display_api/depends.txt => plantlife_modpack/vines/mapgen.lua} (100%) create mode 100644 mods/plantlife_modpack/woodsoils/locale/woodsoils.de.tr create mode 100644 mods/plantlife_modpack/woodsoils/locale/woodsoils.eo.tr delete mode 100644 mods/plantlife_modpack/woodsoils/textures/not in use/woodsoils.png create mode 100644 mods/plantlife_modpack/youngtrees/locale/youngtrees.de.tr create mode 100644 mods/plantlife_modpack/youngtrees/locale/youngtrees.eo.tr delete mode 100644 mods/plantlife_modpack/youngtrees/textures/unused/sapling.png delete mode 100644 mods/plantlife_modpack/youngtrees/textures/unused/sapling16x.png delete mode 100644 mods/playerplus/depends.txt delete mode 100644 mods/playerplus/description.txt create mode 100644 mods/playerplus/lucky_block.lua create mode 100644 mods/playerplus/textures/playerplus_sword_boing.png create mode 100644 mods/prefab_redo/.luacheckrc delete mode 100644 mods/prefab_redo/depends.txt delete mode 100644 mods/protector/depends.txt delete mode 100644 mods/protector/description.txt delete mode 100644 mods/protector/intllib.lua delete mode 100644 mods/protector/locale/de.po delete mode 100644 mods/protector/locale/es.po delete mode 100644 mods/protector/locale/fr.po delete mode 100644 mods/protector/locale/it.po delete mode 100644 mods/protector/locale/ru.po delete mode 100644 mods/protector/locale/template.pot delete mode 100644 mods/protector/locale/tr.po create mode 100644 mods/protector/screenshot.jpg delete mode 100644 mods/protector/screenshot.png create mode 100644 mods/protector/textures/protector_tool.png delete mode 100644 mods/regrow/description.txt create mode 100644 mods/regrow/settingtypes.txt create mode 100644 mods/roads/streetsmod/libs/smartfs/README.md create mode 100644 mods/roads/streetsmod/libs/smartfs/api.md rename mods/{3d_armor/3d_armor_ui => roads/streetsmod/libs/smartfs}/depends.txt (54%) create mode 100644 mods/roads/streetsmod/libs/smartfs/example.lua create mode 100644 mods/roads/streetsmod/libs/smartfs/example.smartfs create mode 100644 mods/roads/streetsmod/libs/smartfs/init.lua create mode 100644 mods/roads/streetsmod/libs/smartfs/smartfs.lua delete mode 100644 mods/signs_lib/intllib.lua delete mode 100644 mods/signs_lib/locale/de.po delete mode 100644 mods/signs_lib/locale/es.po delete mode 100644 mods/signs_lib/locale/fr.po delete mode 100644 mods/signs_lib/locale/ms.po delete mode 100644 mods/signs_lib/locale/ru.po create mode 100644 mods/signs_lib/locale/signs_lib.de.tr create mode 100644 mods/signs_lib/locale/signs_lib.es.tr create mode 100644 mods/signs_lib/locale/signs_lib.fr.tr create mode 100644 mods/signs_lib/locale/signs_lib.ms.tr create mode 100644 mods/signs_lib/locale/signs_lib.ru.tr delete mode 100644 mods/signs_lib/locale/template.pot create mode 100644 mods/signs_lib/locale/template.txt create mode 100644 mods/signs_lib/nonascii-ua.lua create mode 100644 mods/signs_lib/settingstypes.txt create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0404.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0406.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0407.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0454.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0456.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0457.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0490.png create mode 100644 mods/signs_lib/textures/signs_lib_font_16px_0491.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0404.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0406.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0407.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0454.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0456.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0457.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0490.png create mode 100644 mods/signs_lib/textures/signs_lib_font_32px_0491.png rename mods/signs_lib/{models => util/blender}/basic_signs wooden yard sign two sticks.blend (100%) rename mods/signs_lib/{models => util/blender}/slim pole mount already positioned.blend (100%) rename mods/signs_lib/{models => util/blender}/standard pole mount already positioned.blend (100%) rename mods/signs_lib/{models => util/blender}/standard pole mount already positioned.blend1 (100%) rename mods/signs_lib/{models => util/blender}/standard wooden sign.blend (100%) rename mods/signs_lib/{models => util/blender}/standard wooden sign.blend1 (100%) rename mods/signs_lib/{models => util/blender}/standard wooden yard sign.blend (100%) create mode 100644 mods/signs_lib/util/nonascii-ua create mode 100644 mods/skinsdb/.luacheckrc create mode 100644 mods/skinsdb/locale/skinsdb.eo.tr create mode 100644 mods/skinsdb/locale/skinsdb.pt_BR.tr create mode 100644 mods/skinsdb/locale/skinsdb.ru.tr create mode 100644 mods/skinsdb/locale/skinsdb.uk.tr rename mods/skinsdb/meta/{character_1.txt => character.1.txt} (100%) rename mods/skinsdb/meta/{character_10.txt => character.10.txt} (100%) rename mods/skinsdb/meta/{character_1000.txt => character.1000.txt} (100%) rename mods/skinsdb/meta/{character_1001.txt => character.1001.txt} (100%) rename mods/skinsdb/meta/{character_1002.txt => character.1002.txt} (100%) rename mods/skinsdb/meta/{character_1003.txt => character.1003.txt} (100%) rename mods/skinsdb/meta/{character_1004.txt => character.1004.txt} (100%) rename mods/skinsdb/meta/{character_1005.txt => character.1005.txt} (100%) rename mods/skinsdb/meta/{character_1006.txt => character.1006.txt} (100%) rename mods/skinsdb/meta/{character_1007.txt => character.1007.txt} (100%) rename mods/skinsdb/meta/{character_1008.txt => character.1008.txt} (100%) rename mods/skinsdb/meta/{character_1009.txt => character.1009.txt} (100%) rename mods/skinsdb/meta/{character_101.txt => character.101.txt} (100%) rename mods/skinsdb/meta/{character_1010.txt => character.1010.txt} (100%) rename mods/skinsdb/meta/{character_1011.txt => character.1011.txt} (100%) rename mods/skinsdb/meta/{character_1012.txt => character.1012.txt} (100%) rename mods/skinsdb/meta/{character_1013.txt => character.1013.txt} (100%) rename mods/skinsdb/meta/{character_1014.txt => character.1014.txt} (100%) rename mods/skinsdb/meta/{character_1015.txt => character.1015.txt} (100%) rename mods/skinsdb/meta/{character_1016.txt => character.1016.txt} (100%) rename mods/skinsdb/meta/{character_1017.txt => character.1017.txt} (100%) rename mods/skinsdb/meta/{character_1018.txt => character.1018.txt} (100%) rename mods/skinsdb/meta/{character_1019.txt => character.1019.txt} (100%) rename mods/skinsdb/meta/{character_1020.txt => character.1020.txt} (100%) rename mods/skinsdb/meta/{character_1021.txt => character.1021.txt} (100%) rename mods/skinsdb/meta/{character_1022.txt => character.1022.txt} (100%) rename mods/skinsdb/meta/{character_1023.txt => character.1023.txt} (100%) rename mods/skinsdb/meta/{character_1024.txt => character.1024.txt} (100%) rename mods/skinsdb/meta/{character_1025.txt => character.1025.txt} (100%) rename mods/skinsdb/meta/{character_1026.txt => character.1026.txt} (100%) rename mods/skinsdb/meta/{character_1027.txt => character.1027.txt} (100%) rename mods/skinsdb/meta/{character_1028.txt => character.1028.txt} (100%) rename mods/skinsdb/meta/{character_1029.txt => character.1029.txt} (100%) rename mods/skinsdb/meta/{character_1030.txt => character.1030.txt} (100%) rename mods/skinsdb/meta/{character_1031.txt => character.1031.txt} (100%) rename mods/skinsdb/meta/{character_1032.txt => character.1032.txt} (100%) rename mods/skinsdb/meta/{character_1033.txt => character.1033.txt} (100%) rename mods/skinsdb/meta/{character_1034.txt => character.1034.txt} (100%) rename mods/skinsdb/meta/{character_1035.txt => character.1035.txt} (100%) rename mods/skinsdb/meta/{character_1036.txt => character.1036.txt} (100%) rename mods/skinsdb/meta/{character_1037.txt => character.1037.txt} (100%) rename mods/skinsdb/meta/{character_1038.txt => character.1038.txt} (100%) rename mods/skinsdb/meta/{character_1039.txt => character.1039.txt} (100%) rename mods/skinsdb/meta/{character_1040.txt => character.1040.txt} (100%) rename mods/skinsdb/meta/{character_1041.txt => character.1041.txt} (100%) rename mods/skinsdb/meta/{character_1042.txt => character.1042.txt} (100%) rename mods/skinsdb/meta/{character_1043.txt => character.1043.txt} (62%) rename mods/skinsdb/meta/{character_1044.txt => character.1044.txt} (100%) rename mods/skinsdb/meta/{character_1045.txt => character.1045.txt} (100%) rename mods/skinsdb/meta/{character_1046.txt => character.1046.txt} (100%) rename mods/skinsdb/meta/{character_1047.txt => character.1047.txt} (100%) rename mods/skinsdb/meta/{character_1048.txt => character.1048.txt} (100%) rename mods/skinsdb/meta/{character_1049.txt => character.1049.txt} (100%) rename mods/skinsdb/meta/{character_1050.txt => character.1050.txt} (100%) rename mods/skinsdb/meta/{character_1051.txt => character.1051.txt} (100%) rename mods/skinsdb/meta/{character_1052.txt => character.1052.txt} (100%) rename mods/skinsdb/meta/{character_1053.txt => character.1053.txt} (100%) rename mods/skinsdb/meta/{character_1054.txt => character.1054.txt} (100%) rename mods/skinsdb/meta/{character_1055.txt => character.1055.txt} (100%) rename mods/skinsdb/meta/{character_1056.txt => character.1056.txt} (100%) rename mods/skinsdb/meta/{character_1057.txt => character.1057.txt} (100%) rename mods/skinsdb/meta/{character_1058.txt => character.1058.txt} (100%) rename mods/skinsdb/meta/{character_1059.txt => character.1059.txt} (100%) rename mods/skinsdb/meta/{character_1060.txt => character.1060.txt} (100%) rename mods/skinsdb/meta/{character_1061.txt => character.1061.txt} (100%) rename mods/skinsdb/meta/{character_1062.txt => character.1062.txt} (100%) rename mods/skinsdb/meta/{character_1063.txt => character.1063.txt} (100%) rename mods/skinsdb/meta/{character_1064.txt => character.1064.txt} (100%) rename mods/skinsdb/meta/{character_1065.txt => character.1065.txt} (100%) rename mods/skinsdb/meta/{character_1066.txt => character.1066.txt} (100%) rename mods/skinsdb/meta/{character_1067.txt => character.1067.txt} (100%) rename mods/skinsdb/meta/{character_1068.txt => character.1068.txt} (100%) rename mods/skinsdb/meta/{character_1069.txt => character.1069.txt} (100%) rename mods/skinsdb/meta/{character_1070.txt => character.1070.txt} (100%) rename mods/skinsdb/meta/{character_1071.txt => character.1071.txt} (100%) rename mods/skinsdb/meta/{character_1072.txt => character.1072.txt} (100%) rename mods/skinsdb/meta/{character_1073.txt => character.1073.txt} (100%) rename mods/skinsdb/meta/{character_1075.txt => character.1075.txt} (100%) rename mods/skinsdb/meta/{character_1076.txt => character.1076.txt} (100%) rename mods/skinsdb/meta/{character_1077.txt => character.1077.txt} (100%) rename mods/skinsdb/meta/{character_1078.txt => character.1078.txt} (100%) rename mods/skinsdb/meta/{character_1079.txt => character.1079.txt} (100%) rename mods/skinsdb/meta/{character_108.txt => character.108.txt} (100%) rename mods/skinsdb/meta/{character_1080.txt => character.1080.txt} (100%) rename mods/skinsdb/meta/{character_1081.txt => character.1081.txt} (100%) rename mods/skinsdb/meta/{character_1082.txt => character.1082.txt} (100%) rename mods/skinsdb/meta/{character_1083.txt => character.1083.txt} (100%) rename mods/skinsdb/meta/{character_1084.txt => character.1084.txt} (100%) rename mods/skinsdb/meta/{character_1085.txt => character.1085.txt} (100%) rename mods/skinsdb/meta/{character_1086.txt => character.1086.txt} (100%) rename mods/skinsdb/meta/{character_1087.txt => character.1087.txt} (100%) rename mods/skinsdb/meta/{character_1088.txt => character.1088.txt} (100%) rename mods/skinsdb/meta/{character_1089.txt => character.1089.txt} (100%) rename mods/skinsdb/meta/{character_109.txt => character.109.txt} (100%) rename mods/skinsdb/meta/{character_1090.txt => character.1090.txt} (100%) rename mods/skinsdb/meta/{character_1091.txt => character.1091.txt} (100%) rename mods/skinsdb/meta/{character_1092.txt => character.1092.txt} (100%) rename mods/skinsdb/meta/{character_1093.txt => character.1093.txt} (100%) rename mods/skinsdb/meta/{character_1094.txt => character.1094.txt} (100%) rename mods/skinsdb/meta/{character_1095.txt => character.1095.txt} (100%) rename mods/skinsdb/meta/{character_1096.txt => character.1096.txt} (100%) rename mods/skinsdb/meta/{character_1097.txt => character.1097.txt} (100%) rename mods/skinsdb/meta/{character_1098.txt => character.1098.txt} (100%) rename mods/skinsdb/meta/{character_1099.txt => character.1099.txt} (100%) rename mods/skinsdb/meta/{character_110.txt => character.110.txt} (100%) rename mods/skinsdb/meta/{character_1100.txt => character.1100.txt} (100%) rename mods/skinsdb/meta/{character_1101.txt => character.1101.txt} (100%) rename mods/skinsdb/meta/{character_1102.txt => character.1102.txt} (100%) rename mods/skinsdb/meta/{character_1103.txt => character.1103.txt} (100%) rename mods/skinsdb/meta/{character_1104.txt => character.1104.txt} (100%) rename mods/skinsdb/meta/{character_1105.txt => character.1105.txt} (100%) rename mods/skinsdb/meta/{character_1106.txt => character.1106.txt} (100%) rename mods/skinsdb/meta/{character_1107.txt => character.1107.txt} (100%) rename mods/skinsdb/meta/{character_1108.txt => character.1108.txt} (100%) rename mods/skinsdb/meta/{character_1109.txt => character.1109.txt} (100%) rename mods/skinsdb/meta/{character_111.txt => character.111.txt} (100%) rename mods/skinsdb/meta/{character_1110.txt => character.1110.txt} (100%) rename mods/skinsdb/meta/{character_1111.txt => character.1111.txt} (100%) rename mods/skinsdb/meta/{character_1112.txt => character.1112.txt} (100%) rename mods/skinsdb/meta/{character_1113.txt => character.1113.txt} (100%) rename mods/skinsdb/meta/{character_1114.txt => character.1114.txt} (100%) rename mods/skinsdb/meta/{character_1115.txt => character.1115.txt} (100%) rename mods/skinsdb/meta/{character_1116.txt => character.1116.txt} (100%) rename mods/skinsdb/meta/{character_1117.txt => character.1117.txt} (100%) rename mods/skinsdb/meta/{character_1118.txt => character.1118.txt} (100%) rename mods/skinsdb/meta/{character_1119.txt => character.1119.txt} (100%) rename mods/skinsdb/meta/{character_112.txt => character.112.txt} (100%) rename mods/skinsdb/meta/{character_1120.txt => character.1120.txt} (100%) rename mods/skinsdb/meta/{character_1121.txt => character.1121.txt} (100%) rename mods/skinsdb/meta/{character_1122.txt => character.1122.txt} (100%) rename mods/skinsdb/meta/{character_1123.txt => character.1123.txt} (100%) rename mods/skinsdb/meta/{character_1124.txt => character.1124.txt} (100%) rename mods/skinsdb/meta/{character_1126.txt => character.1126.txt} (100%) rename mods/skinsdb/meta/{character_1127.txt => character.1127.txt} (100%) rename mods/skinsdb/meta/{character_113.txt => character.113.txt} (100%) rename mods/skinsdb/meta/{character_1133.txt => character.1133.txt} (100%) rename mods/skinsdb/meta/{character_1134.txt => character.1134.txt} (100%) create mode 100644 mods/skinsdb/meta/character.1135.txt rename mods/skinsdb/meta/{character_1136.txt => character.1136.txt} (100%) rename mods/skinsdb/meta/{character_1137.txt => character.1137.txt} (100%) rename mods/skinsdb/meta/{character_1138.txt => character.1138.txt} (61%) rename mods/skinsdb/meta/{character_1139.txt => character.1139.txt} (100%) rename mods/skinsdb/meta/{character_114.txt => character.114.txt} (100%) rename mods/skinsdb/meta/{character_1140.txt => character.1140.txt} (100%) rename mods/skinsdb/meta/{character_1141.txt => character.1141.txt} (100%) rename mods/skinsdb/meta/{character_1142.txt => character.1142.txt} (100%) rename mods/skinsdb/meta/{character_1143.txt => character.1143.txt} (100%) rename mods/skinsdb/meta/{character_1144.txt => character.1144.txt} (100%) rename mods/skinsdb/meta/{character_1145.txt => character.1145.txt} (100%) rename mods/skinsdb/meta/{character_1146.txt => character.1146.txt} (100%) rename mods/skinsdb/meta/{character_1147.txt => character.1147.txt} (100%) rename mods/skinsdb/meta/{character_1148.txt => character.1148.txt} (100%) rename mods/skinsdb/meta/{character_1149.txt => character.1149.txt} (100%) rename mods/skinsdb/meta/{character_1150.txt => character.1150.txt} (100%) rename mods/skinsdb/meta/{character_1151.txt => character.1151.txt} (100%) rename mods/skinsdb/meta/{character_1153.txt => character.1153.txt} (100%) rename mods/skinsdb/meta/{character_1154.txt => character.1154.txt} (100%) rename mods/skinsdb/meta/{character_1155.txt => character.1155.txt} (100%) rename mods/skinsdb/meta/{character_1156.txt => character.1156.txt} (100%) rename mods/skinsdb/meta/{character_1157.txt => character.1157.txt} (100%) rename mods/skinsdb/meta/{character_1158.txt => character.1158.txt} (100%) rename mods/skinsdb/meta/{character_1159.txt => character.1159.txt} (100%) rename mods/skinsdb/meta/{character_1160.txt => character.1160.txt} (100%) rename mods/skinsdb/meta/{character_1161.txt => character.1161.txt} (100%) rename mods/skinsdb/meta/{character_1162.txt => character.1162.txt} (100%) rename mods/skinsdb/meta/{character_1163.txt => character.1163.txt} (100%) rename mods/skinsdb/meta/{character_1164.txt => character.1164.txt} (100%) rename mods/skinsdb/meta/{character_1165.txt => character.1165.txt} (100%) rename mods/skinsdb/meta/{character_1166.txt => character.1166.txt} (100%) rename mods/skinsdb/meta/{character_1167.txt => character.1167.txt} (100%) rename mods/skinsdb/meta/{character_1168.txt => character.1168.txt} (100%) rename mods/skinsdb/meta/{character_1169.txt => character.1169.txt} (100%) rename mods/skinsdb/meta/{character_117.txt => character.117.txt} (100%) rename mods/skinsdb/meta/{character_1170.txt => character.1170.txt} (100%) rename mods/skinsdb/meta/{character_1171.txt => character.1171.txt} (100%) rename mods/skinsdb/meta/{character_1172.txt => character.1172.txt} (100%) rename mods/skinsdb/meta/{character_1173.txt => character.1173.txt} (100%) rename mods/skinsdb/meta/{character_1174.txt => character.1174.txt} (100%) rename mods/skinsdb/meta/{character_1175.txt => character.1175.txt} (100%) rename mods/skinsdb/meta/{character_1176.txt => character.1176.txt} (100%) rename mods/skinsdb/meta/{character_1177.txt => character.1177.txt} (100%) rename mods/skinsdb/meta/{character_1178.txt => character.1178.txt} (100%) rename mods/skinsdb/meta/{character_1179.txt => character.1179.txt} (100%) rename mods/skinsdb/meta/{character_118.txt => character.118.txt} (100%) rename mods/skinsdb/meta/{character_1180.txt => character.1180.txt} (100%) rename mods/skinsdb/meta/{character_1181.txt => character.1181.txt} (100%) rename mods/skinsdb/meta/{character_1182.txt => character.1182.txt} (100%) rename mods/skinsdb/meta/{character_1183.txt => character.1183.txt} (100%) rename mods/skinsdb/meta/{character_1184.txt => character.1184.txt} (100%) rename mods/skinsdb/meta/{character_1185.txt => character.1185.txt} (100%) rename mods/skinsdb/meta/{character_1186.txt => character.1186.txt} (100%) rename mods/skinsdb/meta/{character_1191.txt => character.1191.txt} (100%) rename mods/skinsdb/meta/{character_1192.txt => character.1192.txt} (100%) rename mods/skinsdb/meta/{character_1193.txt => character.1193.txt} (100%) rename mods/skinsdb/meta/{character_1194.txt => character.1194.txt} (100%) rename mods/skinsdb/meta/{character_1195.txt => character.1195.txt} (100%) rename mods/skinsdb/meta/{character_1196.txt => character.1196.txt} (100%) rename mods/skinsdb/meta/{character_1197.txt => character.1197.txt} (100%) rename mods/skinsdb/meta/{character_1198.txt => character.1198.txt} (100%) rename mods/skinsdb/meta/{character_1199.txt => character.1199.txt} (100%) rename mods/skinsdb/meta/{character_12.txt => character.12.txt} (100%) rename mods/skinsdb/meta/{character_1200.txt => character.1200.txt} (100%) rename mods/skinsdb/meta/{character_1201.txt => character.1201.txt} (100%) rename mods/skinsdb/meta/{character_1202.txt => character.1202.txt} (100%) rename mods/skinsdb/meta/{character_1203.txt => character.1203.txt} (100%) rename mods/skinsdb/meta/{character_1204.txt => character.1204.txt} (100%) rename mods/skinsdb/meta/{character_1205.txt => character.1205.txt} (100%) rename mods/skinsdb/meta/{character_1206.txt => character.1206.txt} (100%) rename mods/skinsdb/meta/{character_1207.txt => character.1207.txt} (100%) rename mods/skinsdb/meta/{character_1208.txt => character.1208.txt} (100%) rename mods/skinsdb/meta/{character_1209.txt => character.1209.txt} (100%) rename mods/skinsdb/meta/{character_121.txt => character.121.txt} (100%) rename mods/skinsdb/meta/{character_1210.txt => character.1210.txt} (100%) rename mods/skinsdb/meta/{character_1211.txt => character.1211.txt} (100%) rename mods/skinsdb/meta/{character_1212.txt => character.1212.txt} (100%) rename mods/skinsdb/meta/{character_1213.txt => character.1213.txt} (100%) rename mods/skinsdb/meta/{character_1214.txt => character.1214.txt} (100%) rename mods/skinsdb/meta/{character_1215.txt => character.1215.txt} (100%) rename mods/skinsdb/meta/{character_1216.txt => character.1216.txt} (100%) rename mods/skinsdb/meta/{character_1217.txt => character.1217.txt} (100%) rename mods/skinsdb/meta/{character_1218.txt => character.1218.txt} (100%) rename mods/skinsdb/meta/{character_1219.txt => character.1219.txt} (100%) rename mods/skinsdb/meta/{character_1220.txt => character.1220.txt} (100%) rename mods/skinsdb/meta/{character_1221.txt => character.1221.txt} (100%) rename mods/skinsdb/meta/{character_1222.txt => character.1222.txt} (100%) rename mods/skinsdb/meta/{character_1223.txt => character.1223.txt} (100%) rename mods/skinsdb/meta/{character_1224.txt => character.1224.txt} (100%) rename mods/skinsdb/meta/{character_1225.txt => character.1225.txt} (100%) rename mods/skinsdb/meta/{character_1226.txt => character.1226.txt} (100%) rename mods/skinsdb/meta/{character_1227.txt => character.1227.txt} (100%) rename mods/skinsdb/meta/{character_1228.txt => character.1228.txt} (100%) rename mods/skinsdb/meta/{character_1229.txt => character.1229.txt} (100%) rename mods/skinsdb/meta/{character_1230.txt => character.1230.txt} (100%) rename mods/skinsdb/meta/{character_1231.txt => character.1231.txt} (100%) rename mods/skinsdb/meta/{character_1232.txt => character.1232.txt} (100%) rename mods/skinsdb/meta/{character_1233.txt => character.1233.txt} (100%) rename mods/skinsdb/meta/{character_1234.txt => character.1234.txt} (100%) rename mods/skinsdb/meta/{character_1235.txt => character.1235.txt} (100%) rename mods/skinsdb/meta/{character_1236.txt => character.1236.txt} (100%) rename mods/skinsdb/meta/{character_1237.txt => character.1237.txt} (100%) rename mods/skinsdb/meta/{character_1238.txt => character.1238.txt} (100%) rename mods/skinsdb/meta/{character_1239.txt => character.1239.txt} (100%) rename mods/skinsdb/meta/{character_124.txt => character.124.txt} (100%) rename mods/skinsdb/meta/{character_1240.txt => character.1240.txt} (100%) rename mods/skinsdb/meta/{character_1241.txt => character.1241.txt} (100%) rename mods/skinsdb/meta/{character_1242.txt => character.1242.txt} (100%) rename mods/skinsdb/meta/{character_1243.txt => character.1243.txt} (100%) rename mods/skinsdb/meta/{character_1244.txt => character.1244.txt} (100%) rename mods/skinsdb/meta/{character_1245.txt => character.1245.txt} (100%) rename mods/skinsdb/meta/{character_1246.txt => character.1246.txt} (100%) rename mods/skinsdb/meta/{character_1247.txt => character.1247.txt} (100%) rename mods/skinsdb/meta/{character_1248.txt => character.1248.txt} (100%) rename mods/skinsdb/meta/{character_1249.txt => character.1249.txt} (100%) rename mods/skinsdb/meta/{character_1250.txt => character.1250.txt} (100%) rename mods/skinsdb/meta/{character_1251.txt => character.1251.txt} (100%) rename mods/skinsdb/meta/{character_1252.txt => character.1252.txt} (100%) rename mods/skinsdb/meta/{character_1253.txt => character.1253.txt} (100%) rename mods/skinsdb/meta/{character_1254.txt => character.1254.txt} (100%) rename mods/skinsdb/meta/{character_1255.txt => character.1255.txt} (100%) rename mods/skinsdb/meta/{character_1256.txt => character.1256.txt} (100%) rename mods/skinsdb/meta/{character_1257.txt => character.1257.txt} (100%) rename mods/skinsdb/meta/{character_1258.txt => character.1258.txt} (100%) rename mods/skinsdb/meta/{character_1259.txt => character.1259.txt} (100%) rename mods/skinsdb/meta/{character_126.txt => character.126.txt} (100%) rename mods/skinsdb/meta/{character_1260.txt => character.1260.txt} (100%) rename mods/skinsdb/meta/{character_1261.txt => character.1261.txt} (100%) rename mods/skinsdb/meta/{character_1262.txt => character.1262.txt} (100%) rename mods/skinsdb/meta/{character_1263.txt => character.1263.txt} (100%) rename mods/skinsdb/meta/{character_1264.txt => character.1264.txt} (100%) rename mods/skinsdb/meta/{character_1265.txt => character.1265.txt} (100%) rename mods/skinsdb/meta/{character_1266.txt => character.1266.txt} (100%) rename mods/skinsdb/meta/{character_1267.txt => character.1267.txt} (100%) rename mods/skinsdb/meta/{character_1268.txt => character.1268.txt} (100%) rename mods/skinsdb/meta/{character_1269.txt => character.1269.txt} (100%) rename mods/skinsdb/meta/{character_1270.txt => character.1270.txt} (100%) rename mods/skinsdb/meta/{character_1271.txt => character.1271.txt} (100%) rename mods/skinsdb/meta/{character_1272.txt => character.1272.txt} (100%) rename mods/skinsdb/meta/{character_1273.txt => character.1273.txt} (100%) rename mods/skinsdb/meta/{character_1274.txt => character.1274.txt} (100%) rename mods/skinsdb/meta/{character_1275.txt => character.1275.txt} (100%) rename mods/skinsdb/meta/{character_1276.txt => character.1276.txt} (100%) rename mods/skinsdb/meta/{character_1277.txt => character.1277.txt} (100%) rename mods/skinsdb/meta/{character_1278.txt => character.1278.txt} (100%) rename mods/skinsdb/meta/{character_1279.txt => character.1279.txt} (100%) rename mods/skinsdb/meta/{character_128.txt => character.128.txt} (100%) rename mods/skinsdb/meta/{character_1280.txt => character.1280.txt} (100%) rename mods/skinsdb/meta/{character_1281.txt => character.1281.txt} (100%) rename mods/skinsdb/meta/{character_1282.txt => character.1282.txt} (100%) rename mods/skinsdb/meta/{character_1283.txt => character.1283.txt} (100%) rename mods/skinsdb/meta/{character_1284.txt => character.1284.txt} (100%) rename mods/skinsdb/meta/{character_1285.txt => character.1285.txt} (100%) rename mods/skinsdb/meta/{character_1286.txt => character.1286.txt} (100%) rename mods/skinsdb/meta/{character_1287.txt => character.1287.txt} (100%) rename mods/skinsdb/meta/{character_1288.txt => character.1288.txt} (100%) rename mods/skinsdb/meta/{character_1289.txt => character.1289.txt} (100%) rename mods/skinsdb/meta/{character_129.txt => character.129.txt} (100%) rename mods/skinsdb/meta/{character_1290.txt => character.1290.txt} (100%) rename mods/skinsdb/meta/{character_1291.txt => character.1291.txt} (100%) rename mods/skinsdb/meta/{character_1292.txt => character.1292.txt} (100%) rename mods/skinsdb/meta/{character_1293.txt => character.1293.txt} (100%) rename mods/skinsdb/meta/{character_1294.txt => character.1294.txt} (100%) rename mods/skinsdb/meta/{character_1295.txt => character.1295.txt} (100%) rename mods/skinsdb/meta/{character_1296.txt => character.1296.txt} (100%) rename mods/skinsdb/meta/{character_1297.txt => character.1297.txt} (100%) rename mods/skinsdb/meta/{character_1298.txt => character.1298.txt} (100%) rename mods/skinsdb/meta/{character_1299.txt => character.1299.txt} (100%) rename mods/skinsdb/meta/{character_1300.txt => character.1300.txt} (100%) rename mods/skinsdb/meta/{character_1301.txt => character.1301.txt} (100%) rename mods/skinsdb/meta/{character_1302.txt => character.1302.txt} (100%) rename mods/skinsdb/meta/{character_1303.txt => character.1303.txt} (100%) rename mods/skinsdb/meta/{character_1304.txt => character.1304.txt} (100%) rename mods/skinsdb/meta/{character_1305.txt => character.1305.txt} (100%) rename mods/skinsdb/meta/{character_1306.txt => character.1306.txt} (100%) rename mods/skinsdb/meta/{character_1307.txt => character.1307.txt} (100%) rename mods/skinsdb/meta/{character_1308.txt => character.1308.txt} (100%) rename mods/skinsdb/meta/{character_1309.txt => character.1309.txt} (100%) rename mods/skinsdb/meta/{character_1310.txt => character.1310.txt} (100%) rename mods/skinsdb/meta/{character_1311.txt => character.1311.txt} (100%) rename mods/skinsdb/meta/{character_1312.txt => character.1312.txt} (100%) rename mods/skinsdb/meta/{character_1313.txt => character.1313.txt} (100%) rename mods/skinsdb/meta/{character_1314.txt => character.1314.txt} (100%) rename mods/skinsdb/meta/{character_1315.txt => character.1315.txt} (100%) rename mods/skinsdb/meta/{character_1316.txt => character.1316.txt} (100%) rename mods/skinsdb/meta/{character_1317.txt => character.1317.txt} (100%) rename mods/skinsdb/meta/{character_1318.txt => character.1318.txt} (100%) rename mods/skinsdb/meta/{character_1319.txt => character.1319.txt} (100%) rename mods/skinsdb/meta/{character_1320.txt => character.1320.txt} (100%) rename mods/skinsdb/meta/{character_1321.txt => character.1321.txt} (100%) rename mods/skinsdb/meta/{character_1322.txt => character.1322.txt} (100%) rename mods/skinsdb/meta/{character_1323.txt => character.1323.txt} (100%) rename mods/skinsdb/meta/{character_1324.txt => character.1324.txt} (100%) rename mods/skinsdb/meta/{character_1325.txt => character.1325.txt} (100%) rename mods/skinsdb/meta/{character_1326.txt => character.1326.txt} (100%) rename mods/skinsdb/meta/{character_1327.txt => character.1327.txt} (100%) rename mods/skinsdb/meta/{character_1328.txt => character.1328.txt} (100%) rename mods/skinsdb/meta/{character_1329.txt => character.1329.txt} (100%) rename mods/skinsdb/meta/{character_1330.txt => character.1330.txt} (100%) rename mods/skinsdb/meta/{character_1331.txt => character.1331.txt} (100%) rename mods/skinsdb/meta/{character_1332.txt => character.1332.txt} (100%) rename mods/skinsdb/meta/{character_1333.txt => character.1333.txt} (100%) rename mods/skinsdb/meta/{character_1334.txt => character.1334.txt} (100%) rename mods/skinsdb/meta/{character_1335.txt => character.1335.txt} (100%) rename mods/skinsdb/meta/{character_1336.txt => character.1336.txt} (100%) rename mods/skinsdb/meta/{character_1337.txt => character.1337.txt} (100%) rename mods/skinsdb/meta/{character_1338.txt => character.1338.txt} (100%) rename mods/skinsdb/meta/{character_134.txt => character.134.txt} (100%) rename mods/skinsdb/meta/{character_1340.txt => character.1340.txt} (100%) rename mods/skinsdb/meta/{character_1341.txt => character.1341.txt} (100%) rename mods/skinsdb/meta/{character_1342.txt => character.1342.txt} (100%) rename mods/skinsdb/meta/{character_1343.txt => character.1343.txt} (100%) rename mods/skinsdb/meta/{character_1344.txt => character.1344.txt} (100%) rename mods/skinsdb/meta/{character_1345.txt => character.1345.txt} (100%) rename mods/skinsdb/meta/{character_1346.txt => character.1346.txt} (100%) rename mods/skinsdb/meta/{character_1347.txt => character.1347.txt} (100%) rename mods/skinsdb/meta/{character_1348.txt => character.1348.txt} (100%) rename mods/skinsdb/meta/{character_1349.txt => character.1349.txt} (100%) rename mods/skinsdb/meta/{character_135.txt => character.135.txt} (100%) rename mods/skinsdb/meta/{character_1350.txt => character.1350.txt} (100%) rename mods/skinsdb/meta/{character_1351.txt => character.1351.txt} (100%) rename mods/skinsdb/meta/{character_1352.txt => character.1352.txt} (100%) rename mods/skinsdb/meta/{character_1353.txt => character.1353.txt} (100%) rename mods/skinsdb/meta/{character_1354.txt => character.1354.txt} (100%) rename mods/skinsdb/meta/{character_1355.txt => character.1355.txt} (100%) rename mods/skinsdb/meta/{character_1356.txt => character.1356.txt} (100%) rename mods/skinsdb/meta/{character_1357.txt => character.1357.txt} (100%) rename mods/skinsdb/meta/{character_1358.txt => character.1358.txt} (100%) rename mods/skinsdb/meta/{character_1359.txt => character.1359.txt} (100%) rename mods/skinsdb/meta/{character_136.txt => character.136.txt} (100%) rename mods/skinsdb/meta/{character_1360.txt => character.1360.txt} (100%) rename mods/skinsdb/meta/{character_1361.txt => character.1361.txt} (100%) rename mods/skinsdb/meta/{character_1362.txt => character.1362.txt} (100%) rename mods/skinsdb/meta/{character_1363.txt => character.1363.txt} (100%) rename mods/skinsdb/meta/{character_1364.txt => character.1364.txt} (100%) rename mods/skinsdb/meta/{character_1365.txt => character.1365.txt} (100%) rename mods/skinsdb/meta/{character_1366.txt => character.1366.txt} (100%) rename mods/skinsdb/meta/{character_1367.txt => character.1367.txt} (100%) rename mods/skinsdb/meta/{character_1368.txt => character.1368.txt} (100%) rename mods/skinsdb/meta/{character_1369.txt => character.1369.txt} (100%) rename mods/skinsdb/meta/{character_1370.txt => character.1370.txt} (100%) rename mods/skinsdb/meta/{character_1371.txt => character.1371.txt} (100%) rename mods/skinsdb/meta/{character_1372.txt => character.1372.txt} (100%) rename mods/skinsdb/meta/{character_1373.txt => character.1373.txt} (100%) rename mods/skinsdb/meta/{character_1374.txt => character.1374.txt} (100%) rename mods/skinsdb/meta/{character_1375.txt => character.1375.txt} (100%) rename mods/skinsdb/meta/{character_1376.txt => character.1376.txt} (100%) rename mods/skinsdb/meta/{character_1377.txt => character.1377.txt} (100%) rename mods/skinsdb/meta/{character_1378.txt => character.1378.txt} (100%) rename mods/skinsdb/meta/{character_1379.txt => character.1379.txt} (100%) rename mods/skinsdb/meta/{character_1380.txt => character.1380.txt} (100%) rename mods/skinsdb/meta/{character_1381.txt => character.1381.txt} (100%) rename mods/skinsdb/meta/{character_1382.txt => character.1382.txt} (100%) rename mods/skinsdb/meta/{character_1383.txt => character.1383.txt} (100%) rename mods/skinsdb/meta/{character_1384.txt => character.1384.txt} (100%) rename mods/skinsdb/meta/{character_1385.txt => character.1385.txt} (100%) rename mods/skinsdb/meta/{character_1386.txt => character.1386.txt} (100%) rename mods/skinsdb/meta/{character_1387.txt => character.1387.txt} (100%) rename mods/skinsdb/meta/{character_1388.txt => character.1388.txt} (100%) rename mods/skinsdb/meta/{character_1389.txt => character.1389.txt} (100%) rename mods/skinsdb/meta/{character_1390.txt => character.1390.txt} (100%) rename mods/skinsdb/meta/{character_1391.txt => character.1391.txt} (100%) rename mods/skinsdb/meta/{character_1392.txt => character.1392.txt} (100%) rename mods/skinsdb/meta/{character_1393.txt => character.1393.txt} (100%) rename mods/skinsdb/meta/{character_1394.txt => character.1394.txt} (100%) rename mods/skinsdb/meta/{character_1395.txt => character.1395.txt} (100%) rename mods/skinsdb/meta/{character_1396.txt => character.1396.txt} (100%) rename mods/skinsdb/meta/{character_1397.txt => character.1397.txt} (100%) rename mods/skinsdb/meta/{character_1398.txt => character.1398.txt} (100%) rename mods/skinsdb/meta/{character_1399.txt => character.1399.txt} (100%) rename mods/skinsdb/meta/{character_140.txt => character.140.txt} (100%) rename mods/skinsdb/meta/{character_1400.txt => character.1400.txt} (100%) rename mods/skinsdb/meta/{character_1401.txt => character.1401.txt} (100%) rename mods/skinsdb/meta/{character_1402.txt => character.1402.txt} (100%) rename mods/skinsdb/meta/{character_1403.txt => character.1403.txt} (100%) rename mods/skinsdb/meta/{character_1404.txt => character.1404.txt} (100%) rename mods/skinsdb/meta/{character_1405.txt => character.1405.txt} (100%) rename mods/skinsdb/meta/{character_1406.txt => character.1406.txt} (100%) rename mods/skinsdb/meta/{character_1407.txt => character.1407.txt} (100%) rename mods/skinsdb/meta/{character_1408.txt => character.1408.txt} (100%) rename mods/skinsdb/meta/{character_1409.txt => character.1409.txt} (100%) rename mods/skinsdb/meta/{character_141.txt => character.141.txt} (100%) rename mods/skinsdb/meta/{character_1410.txt => character.1410.txt} (100%) rename mods/skinsdb/meta/{character_1411.txt => character.1411.txt} (100%) rename mods/skinsdb/meta/{character_1414.txt => character.1414.txt} (100%) rename mods/skinsdb/meta/{character_1415.txt => character.1415.txt} (100%) rename mods/skinsdb/meta/{character_1416.txt => character.1416.txt} (100%) rename mods/skinsdb/meta/{character_1417.txt => character.1417.txt} (100%) rename mods/skinsdb/meta/{character_1418.txt => character.1418.txt} (100%) rename mods/skinsdb/meta/{character_1419.txt => character.1419.txt} (100%) rename mods/skinsdb/meta/{character_142.txt => character.142.txt} (100%) rename mods/skinsdb/meta/{character_1420.txt => character.1420.txt} (100%) rename mods/skinsdb/meta/{character_1421.txt => character.1421.txt} (100%) rename mods/skinsdb/meta/{character_1422.txt => character.1422.txt} (100%) rename mods/skinsdb/meta/{character_1423.txt => character.1423.txt} (100%) rename mods/skinsdb/meta/{character_1424.txt => character.1424.txt} (100%) rename mods/skinsdb/meta/{character_1425.txt => character.1425.txt} (100%) rename mods/skinsdb/meta/{character_1426.txt => character.1426.txt} (100%) rename mods/skinsdb/meta/{character_1427.txt => character.1427.txt} (100%) rename mods/skinsdb/meta/{character_1428.txt => character.1428.txt} (100%) rename mods/skinsdb/meta/{character_1429.txt => character.1429.txt} (100%) rename mods/skinsdb/meta/{character_143.txt => character.143.txt} (100%) rename mods/skinsdb/meta/{character_1430.txt => character.1430.txt} (100%) rename mods/skinsdb/meta/{character_1431.txt => character.1431.txt} (100%) rename mods/skinsdb/meta/{character_1432.txt => character.1432.txt} (100%) rename mods/skinsdb/meta/{character_1433.txt => character.1433.txt} (100%) rename mods/skinsdb/meta/{character_1434.txt => character.1434.txt} (100%) rename mods/skinsdb/meta/{character_1435.txt => character.1435.txt} (100%) rename mods/skinsdb/meta/{character_1436.txt => character.1436.txt} (100%) rename mods/skinsdb/meta/{character_1437.txt => character.1437.txt} (100%) rename mods/skinsdb/meta/{character_1438.txt => character.1438.txt} (100%) rename mods/skinsdb/meta/{character_1439.txt => character.1439.txt} (100%) rename mods/skinsdb/meta/{character_144.txt => character.144.txt} (100%) rename mods/skinsdb/meta/{character_1440.txt => character.1440.txt} (100%) rename mods/skinsdb/meta/{character_1441.txt => character.1441.txt} (100%) rename mods/skinsdb/meta/{character_1442.txt => character.1442.txt} (100%) rename mods/skinsdb/meta/{character_1443.txt => character.1443.txt} (100%) rename mods/skinsdb/meta/{character_1444.txt => character.1444.txt} (100%) rename mods/skinsdb/meta/{character_1445.txt => character.1445.txt} (100%) rename mods/skinsdb/meta/{character_145.txt => character.145.txt} (100%) rename mods/skinsdb/meta/{character_1455.txt => character.1455.txt} (100%) rename mods/skinsdb/meta/{character_1456.txt => character.1456.txt} (100%) rename mods/skinsdb/meta/{character_1457.txt => character.1457.txt} (100%) rename mods/skinsdb/meta/{character_1458.txt => character.1458.txt} (100%) rename mods/skinsdb/meta/{character_1459.txt => character.1459.txt} (100%) rename mods/skinsdb/meta/{character_146.txt => character.146.txt} (100%) rename mods/skinsdb/meta/{character_1460.txt => character.1460.txt} (100%) rename mods/skinsdb/meta/{character_1461.txt => character.1461.txt} (100%) rename mods/skinsdb/meta/{character_1462.txt => character.1462.txt} (100%) rename mods/skinsdb/meta/{character_1463.txt => character.1463.txt} (100%) rename mods/skinsdb/meta/{character_1464.txt => character.1464.txt} (100%) rename mods/skinsdb/meta/{character_1465.txt => character.1465.txt} (100%) rename mods/skinsdb/meta/{character_1466.txt => character.1466.txt} (100%) rename mods/skinsdb/meta/{character_1467.txt => character.1467.txt} (100%) rename mods/skinsdb/meta/{character_1468.txt => character.1468.txt} (100%) rename mods/skinsdb/meta/{character_1469.txt => character.1469.txt} (100%) rename mods/skinsdb/meta/{character_147.txt => character.147.txt} (100%) rename mods/skinsdb/meta/{character_1470.txt => character.1470.txt} (100%) rename mods/skinsdb/meta/{character_1471.txt => character.1471.txt} (100%) rename mods/skinsdb/meta/{character_1472.txt => character.1472.txt} (100%) rename mods/skinsdb/meta/{character_1473.txt => character.1473.txt} (100%) rename mods/skinsdb/meta/{character_1474.txt => character.1474.txt} (100%) rename mods/skinsdb/meta/{character_1475.txt => character.1475.txt} (100%) rename mods/skinsdb/meta/{character_1476.txt => character.1476.txt} (100%) rename mods/skinsdb/meta/{character_1477.txt => character.1477.txt} (60%) rename mods/skinsdb/meta/{character_1478.txt => character.1478.txt} (100%) rename mods/skinsdb/meta/{character_1479.txt => character.1479.txt} (100%) rename mods/skinsdb/meta/{character_148.txt => character.148.txt} (100%) rename mods/skinsdb/meta/{character_1480.txt => character.1480.txt} (100%) rename mods/skinsdb/meta/{character_1481.txt => character.1481.txt} (100%) rename mods/skinsdb/meta/{character_1482.txt => character.1482.txt} (100%) rename mods/skinsdb/meta/{character_1483.txt => character.1483.txt} (100%) rename mods/skinsdb/meta/{character_1484.txt => character.1484.txt} (100%) rename mods/skinsdb/meta/{character_1485.txt => character.1485.txt} (100%) rename mods/skinsdb/meta/{character_1486.txt => character.1486.txt} (100%) rename mods/skinsdb/meta/{character_1487.txt => character.1487.txt} (100%) rename mods/skinsdb/meta/{character_1488.txt => character.1488.txt} (100%) rename mods/skinsdb/meta/{character_1489.txt => character.1489.txt} (100%) rename mods/skinsdb/meta/{character_1490.txt => character.1490.txt} (100%) rename mods/skinsdb/meta/{character_1491.txt => character.1491.txt} (100%) rename mods/skinsdb/meta/{character_1492.txt => character.1492.txt} (100%) rename mods/skinsdb/meta/{character_1493.txt => character.1493.txt} (100%) rename mods/skinsdb/meta/{character_1494.txt => character.1494.txt} (100%) rename mods/skinsdb/meta/{character_1495.txt => character.1495.txt} (100%) rename mods/skinsdb/meta/{character_1496.txt => character.1496.txt} (100%) rename mods/skinsdb/meta/{character_1497.txt => character.1497.txt} (100%) rename mods/skinsdb/meta/{character_1498.txt => character.1498.txt} (100%) rename mods/skinsdb/meta/{character_1499.txt => character.1499.txt} (100%) rename mods/skinsdb/meta/{character_1500.txt => character.1500.txt} (100%) rename mods/skinsdb/meta/{character_1501.txt => character.1501.txt} (100%) rename mods/skinsdb/meta/{character_1502.txt => character.1502.txt} (100%) rename mods/skinsdb/meta/{character_1503.txt => character.1503.txt} (100%) rename mods/skinsdb/meta/{character_1504.txt => character.1504.txt} (100%) rename mods/skinsdb/meta/{character_1505.txt => character.1505.txt} (100%) rename mods/skinsdb/meta/{character_1506.txt => character.1506.txt} (100%) rename mods/skinsdb/meta/{character_1507.txt => character.1507.txt} (100%) rename mods/skinsdb/meta/{character_1508.txt => character.1508.txt} (100%) rename mods/skinsdb/meta/{character_1509.txt => character.1509.txt} (100%) rename mods/skinsdb/meta/{character_151.txt => character.151.txt} (51%) rename mods/skinsdb/meta/{character_1510.txt => character.1510.txt} (100%) rename mods/skinsdb/meta/{character_1511.txt => character.1511.txt} (100%) rename mods/skinsdb/meta/{character_1512.txt => character.1512.txt} (100%) rename mods/skinsdb/meta/{character_1513.txt => character.1513.txt} (100%) rename mods/skinsdb/meta/{character_1514.txt => character.1514.txt} (100%) rename mods/skinsdb/meta/{character_1515.txt => character.1515.txt} (100%) rename mods/skinsdb/meta/{character_1516.txt => character.1516.txt} (100%) rename mods/skinsdb/meta/{character_1517.txt => character.1517.txt} (100%) rename mods/skinsdb/meta/{character_1518.txt => character.1518.txt} (100%) rename mods/skinsdb/meta/{character_1519.txt => character.1519.txt} (100%) rename mods/skinsdb/meta/{character_152.txt => character.152.txt} (100%) rename mods/skinsdb/meta/{character_1520.txt => character.1520.txt} (100%) rename mods/skinsdb/meta/{character_1521.txt => character.1521.txt} (100%) rename mods/skinsdb/meta/{character_1522.txt => character.1522.txt} (100%) rename mods/skinsdb/meta/{character_1523.txt => character.1523.txt} (100%) rename mods/skinsdb/meta/{character_1524.txt => character.1524.txt} (100%) rename mods/skinsdb/meta/{character_1525.txt => character.1525.txt} (100%) rename mods/skinsdb/meta/{character_1526.txt => character.1526.txt} (100%) rename mods/skinsdb/meta/{character_1527.txt => character.1527.txt} (100%) rename mods/skinsdb/meta/{character_1528.txt => character.1528.txt} (100%) rename mods/skinsdb/meta/{character_1529.txt => character.1529.txt} (100%) rename mods/skinsdb/meta/{character_153.txt => character.153.txt} (100%) rename mods/skinsdb/meta/{character_1530.txt => character.1530.txt} (100%) rename mods/skinsdb/meta/{character_1531.txt => character.1531.txt} (100%) rename mods/skinsdb/meta/{character_1532.txt => character.1532.txt} (100%) rename mods/skinsdb/meta/{character_1533.txt => character.1533.txt} (100%) rename mods/skinsdb/meta/{character_1534.txt => character.1534.txt} (100%) rename mods/skinsdb/meta/{character_1535.txt => character.1535.txt} (100%) rename mods/skinsdb/meta/{character_1536.txt => character.1536.txt} (100%) rename mods/skinsdb/meta/{character_1537.txt => character.1537.txt} (100%) rename mods/skinsdb/meta/{character_1538.txt => character.1538.txt} (100%) rename mods/skinsdb/meta/{character_1539.txt => character.1539.txt} (100%) rename mods/skinsdb/meta/{character_154.txt => character.154.txt} (100%) rename mods/skinsdb/meta/{character_1540.txt => character.1540.txt} (100%) rename mods/skinsdb/meta/{character_1541.txt => character.1541.txt} (100%) rename mods/skinsdb/meta/{character_1542.txt => character.1542.txt} (100%) rename mods/skinsdb/meta/{character_1543.txt => character.1543.txt} (100%) rename mods/skinsdb/meta/{character_1544.txt => character.1544.txt} (100%) rename mods/skinsdb/meta/{character_1545.txt => character.1545.txt} (100%) rename mods/skinsdb/meta/{character_1546.txt => character.1546.txt} (100%) rename mods/skinsdb/meta/{character_1547.txt => character.1547.txt} (100%) rename mods/skinsdb/meta/{character_1548.txt => character.1548.txt} (100%) rename mods/skinsdb/meta/{character_1549.txt => character.1549.txt} (100%) rename mods/skinsdb/meta/{character_155.txt => character.155.txt} (100%) rename mods/skinsdb/meta/{character_1550.txt => character.1550.txt} (100%) rename mods/skinsdb/meta/{character_1551.txt => character.1551.txt} (100%) rename mods/skinsdb/meta/{character_1552.txt => character.1552.txt} (100%) rename mods/skinsdb/meta/{character_1553.txt => character.1553.txt} (100%) rename mods/skinsdb/meta/{character_1554.txt => character.1554.txt} (100%) rename mods/skinsdb/meta/{character_1555.txt => character.1555.txt} (100%) rename mods/skinsdb/meta/{character_1556.txt => character.1556.txt} (100%) rename mods/skinsdb/meta/{character_1557.txt => character.1557.txt} (100%) rename mods/skinsdb/meta/{character_1558.txt => character.1558.txt} (100%) rename mods/skinsdb/meta/{character_1559.txt => character.1559.txt} (100%) rename mods/skinsdb/meta/{character_156.txt => character.156.txt} (100%) rename mods/skinsdb/meta/{character_1560.txt => character.1560.txt} (100%) rename mods/skinsdb/meta/{character_1561.txt => character.1561.txt} (100%) rename mods/skinsdb/meta/{character_1562.txt => character.1562.txt} (100%) rename mods/skinsdb/meta/{character_1563.txt => character.1563.txt} (100%) rename mods/skinsdb/meta/{character_1564.txt => character.1564.txt} (100%) rename mods/skinsdb/meta/{character_1565.txt => character.1565.txt} (100%) rename mods/skinsdb/meta/{character_1566.txt => character.1566.txt} (100%) rename mods/skinsdb/meta/{character_1567.txt => character.1567.txt} (100%) rename mods/skinsdb/meta/{character_1568.txt => character.1568.txt} (100%) rename mods/skinsdb/meta/{character_1569.txt => character.1569.txt} (100%) rename mods/skinsdb/meta/{character_157.txt => character.157.txt} (100%) rename mods/skinsdb/meta/{character_1570.txt => character.1570.txt} (100%) rename mods/skinsdb/meta/{character_1571.txt => character.1571.txt} (100%) rename mods/skinsdb/meta/{character_1572.txt => character.1572.txt} (100%) rename mods/skinsdb/meta/{character_1573.txt => character.1573.txt} (100%) rename mods/skinsdb/meta/{character_1574.txt => character.1574.txt} (100%) rename mods/skinsdb/meta/{character_1575.txt => character.1575.txt} (100%) rename mods/skinsdb/meta/{character_1576.txt => character.1576.txt} (100%) rename mods/skinsdb/meta/{character_1577.txt => character.1577.txt} (100%) rename mods/skinsdb/meta/{character_1578.txt => character.1578.txt} (100%) rename mods/skinsdb/meta/{character_1579.txt => character.1579.txt} (100%) rename mods/skinsdb/meta/{character_158.txt => character.158.txt} (100%) rename mods/skinsdb/meta/{character_1580.txt => character.1580.txt} (100%) rename mods/skinsdb/meta/{character_1581.txt => character.1581.txt} (100%) rename mods/skinsdb/meta/{character_1582.txt => character.1582.txt} (100%) rename mods/skinsdb/meta/{character_1583.txt => character.1583.txt} (100%) rename mods/skinsdb/meta/{character_1584.txt => character.1584.txt} (100%) rename mods/skinsdb/meta/{character_1585.txt => character.1585.txt} (100%) rename mods/skinsdb/meta/{character_1586.txt => character.1586.txt} (100%) rename mods/skinsdb/meta/{character_1587.txt => character.1587.txt} (100%) rename mods/skinsdb/meta/{character_1588.txt => character.1588.txt} (100%) rename mods/skinsdb/meta/{character_1589.txt => character.1589.txt} (100%) rename mods/skinsdb/meta/{character_159.txt => character.159.txt} (100%) rename mods/skinsdb/meta/{character_1590.txt => character.1590.txt} (100%) rename mods/skinsdb/meta/{character_1591.txt => character.1591.txt} (100%) rename mods/skinsdb/meta/{character_1592.txt => character.1592.txt} (100%) rename mods/skinsdb/meta/{character_1593.txt => character.1593.txt} (100%) rename mods/skinsdb/meta/{character_1594.txt => character.1594.txt} (100%) rename mods/skinsdb/meta/{character_1595.txt => character.1595.txt} (100%) rename mods/skinsdb/meta/{character_1596.txt => character.1596.txt} (100%) rename mods/skinsdb/meta/{character_1597.txt => character.1597.txt} (100%) rename mods/skinsdb/meta/{character_1598.txt => character.1598.txt} (100%) rename mods/skinsdb/meta/{character_1599.txt => character.1599.txt} (100%) rename mods/skinsdb/meta/{character_160.txt => character.160.txt} (100%) rename mods/skinsdb/meta/{character_1600.txt => character.1600.txt} (100%) rename mods/skinsdb/meta/{character_1601.txt => character.1601.txt} (100%) rename mods/skinsdb/meta/{character_1602.txt => character.1602.txt} (100%) rename mods/skinsdb/meta/{character_1603.txt => character.1603.txt} (100%) rename mods/skinsdb/meta/{character_1604.txt => character.1604.txt} (100%) rename mods/skinsdb/meta/{character_1605.txt => character.1605.txt} (100%) rename mods/skinsdb/meta/{character_1606.txt => character.1606.txt} (100%) rename mods/skinsdb/meta/{character_1607.txt => character.1607.txt} (100%) rename mods/skinsdb/meta/{character_1608.txt => character.1608.txt} (100%) rename mods/skinsdb/meta/{character_1609.txt => character.1609.txt} (100%) rename mods/skinsdb/meta/{character_161.txt => character.161.txt} (100%) rename mods/skinsdb/meta/{character_1610.txt => character.1610.txt} (100%) rename mods/skinsdb/meta/{character_1611.txt => character.1611.txt} (100%) rename mods/skinsdb/meta/{character_1612.txt => character.1612.txt} (100%) rename mods/skinsdb/meta/{character_1613.txt => character.1613.txt} (100%) rename mods/skinsdb/meta/{character_1614.txt => character.1614.txt} (100%) rename mods/skinsdb/meta/{character_1615.txt => character.1615.txt} (100%) rename mods/skinsdb/meta/{character_1616.txt => character.1616.txt} (100%) rename mods/skinsdb/meta/{character_1617.txt => character.1617.txt} (100%) rename mods/skinsdb/meta/{character_1618.txt => character.1618.txt} (100%) rename mods/skinsdb/meta/{character_1619.txt => character.1619.txt} (100%) rename mods/skinsdb/meta/{character_162.txt => character.162.txt} (100%) rename mods/skinsdb/meta/{character_1620.txt => character.1620.txt} (100%) rename mods/skinsdb/meta/{character_1621.txt => character.1621.txt} (100%) rename mods/skinsdb/meta/{character_1622.txt => character.1622.txt} (100%) rename mods/skinsdb/meta/{character_1623.txt => character.1623.txt} (100%) rename mods/skinsdb/meta/{character_1624.txt => character.1624.txt} (100%) rename mods/skinsdb/meta/{character_1625.txt => character.1625.txt} (100%) rename mods/skinsdb/meta/{character_1626.txt => character.1626.txt} (100%) rename mods/skinsdb/meta/{character_1627.txt => character.1627.txt} (100%) rename mods/skinsdb/meta/{character_1628.txt => character.1628.txt} (100%) rename mods/skinsdb/meta/{character_1629.txt => character.1629.txt} (100%) rename mods/skinsdb/meta/{character_163.txt => character.163.txt} (63%) rename mods/skinsdb/meta/{character_1630.txt => character.1630.txt} (100%) rename mods/skinsdb/meta/{character_1631.txt => character.1631.txt} (100%) rename mods/skinsdb/meta/{character_1632.txt => character.1632.txt} (100%) rename mods/skinsdb/meta/{character_1633.txt => character.1633.txt} (100%) rename mods/skinsdb/meta/{character_1634.txt => character.1634.txt} (100%) rename mods/skinsdb/meta/{character_1635.txt => character.1635.txt} (100%) rename mods/skinsdb/meta/{character_1636.txt => character.1636.txt} (100%) rename mods/skinsdb/meta/{character_1637.txt => character.1637.txt} (100%) rename mods/skinsdb/meta/{character_1638.txt => character.1638.txt} (100%) rename mods/skinsdb/meta/{character_1639.txt => character.1639.txt} (100%) rename mods/skinsdb/meta/{character_164.txt => character.164.txt} (100%) rename mods/skinsdb/meta/{character_1640.txt => character.1640.txt} (100%) rename mods/skinsdb/meta/{character_1641.txt => character.1641.txt} (100%) rename mods/skinsdb/meta/{character_1642.txt => character.1642.txt} (100%) rename mods/skinsdb/meta/{character_1643.txt => character.1643.txt} (100%) rename mods/skinsdb/meta/{character_1644.txt => character.1644.txt} (100%) rename mods/skinsdb/meta/{character_1645.txt => character.1645.txt} (100%) rename mods/skinsdb/meta/{character_1646.txt => character.1646.txt} (100%) rename mods/skinsdb/meta/{character_1647.txt => character.1647.txt} (100%) rename mods/skinsdb/meta/{character_1648.txt => character.1648.txt} (100%) rename mods/skinsdb/meta/{character_1649.txt => character.1649.txt} (100%) rename mods/skinsdb/meta/{character_165.txt => character.165.txt} (100%) rename mods/skinsdb/meta/{character_1650.txt => character.1650.txt} (100%) rename mods/skinsdb/meta/{character_1651.txt => character.1651.txt} (100%) rename mods/skinsdb/meta/{character_1652.txt => character.1652.txt} (100%) rename mods/skinsdb/meta/{character_1653.txt => character.1653.txt} (100%) rename mods/skinsdb/meta/{character_1654.txt => character.1654.txt} (100%) rename mods/skinsdb/meta/{character_1655.txt => character.1655.txt} (100%) rename mods/skinsdb/meta/{character_1656.txt => character.1656.txt} (100%) rename mods/skinsdb/meta/{character_1657.txt => character.1657.txt} (100%) rename mods/skinsdb/meta/{character_1658.txt => character.1658.txt} (100%) rename mods/skinsdb/meta/{character_1659.txt => character.1659.txt} (100%) rename mods/skinsdb/meta/{character_166.txt => character.166.txt} (100%) rename mods/skinsdb/meta/{character_1660.txt => character.1660.txt} (100%) rename mods/skinsdb/meta/{character_1661.txt => character.1661.txt} (100%) rename mods/skinsdb/meta/{character_1662.txt => character.1662.txt} (100%) rename mods/skinsdb/meta/{character_1663.txt => character.1663.txt} (100%) rename mods/skinsdb/meta/{character_1664.txt => character.1664.txt} (100%) rename mods/skinsdb/meta/{character_1665.txt => character.1665.txt} (100%) rename mods/skinsdb/meta/{character_1666.txt => character.1666.txt} (100%) rename mods/skinsdb/meta/{character_1667.txt => character.1667.txt} (100%) rename mods/skinsdb/meta/{character_1668.txt => character.1668.txt} (100%) rename mods/skinsdb/meta/{character_1669.txt => character.1669.txt} (100%) rename mods/skinsdb/meta/{character_167.txt => character.167.txt} (100%) rename mods/skinsdb/meta/{character_1670.txt => character.1670.txt} (100%) rename mods/skinsdb/meta/{character_1671.txt => character.1671.txt} (100%) rename mods/skinsdb/meta/{character_1672.txt => character.1672.txt} (100%) rename mods/skinsdb/meta/{character_1673.txt => character.1673.txt} (100%) rename mods/skinsdb/meta/{character_1674.txt => character.1674.txt} (100%) rename mods/skinsdb/meta/{character_1675.txt => character.1675.txt} (100%) rename mods/skinsdb/meta/{character_1676.txt => character.1676.txt} (100%) rename mods/skinsdb/meta/{character_1677.txt => character.1677.txt} (100%) rename mods/skinsdb/meta/{character_1678.txt => character.1678.txt} (100%) rename mods/skinsdb/meta/{character_1679.txt => character.1679.txt} (100%) rename mods/skinsdb/meta/{character_168.txt => character.168.txt} (100%) rename mods/skinsdb/meta/{character_1680.txt => character.1680.txt} (100%) rename mods/skinsdb/meta/{character_1681.txt => character.1681.txt} (100%) rename mods/skinsdb/meta/{character_1682.txt => character.1682.txt} (100%) rename mods/skinsdb/meta/{character_1683.txt => character.1683.txt} (100%) rename mods/skinsdb/meta/{character_1684.txt => character.1684.txt} (100%) rename mods/skinsdb/meta/{character_1685.txt => character.1685.txt} (100%) rename mods/skinsdb/meta/{character_1686.txt => character.1686.txt} (100%) rename mods/skinsdb/meta/{character_1687.txt => character.1687.txt} (100%) rename mods/skinsdb/meta/{character_1688.txt => character.1688.txt} (100%) rename mods/skinsdb/meta/{character_1689.txt => character.1689.txt} (100%) rename mods/skinsdb/meta/{character_169.txt => character.169.txt} (100%) rename mods/skinsdb/meta/{character_1690.txt => character.1690.txt} (100%) rename mods/skinsdb/meta/{character_1691.txt => character.1691.txt} (100%) rename mods/skinsdb/meta/{character_1692.txt => character.1692.txt} (100%) rename mods/skinsdb/meta/{character_1693.txt => character.1693.txt} (100%) rename mods/skinsdb/meta/{character_1694.txt => character.1694.txt} (100%) rename mods/skinsdb/meta/{character_1695.txt => character.1695.txt} (100%) rename mods/skinsdb/meta/{character_1696.txt => character.1696.txt} (100%) rename mods/skinsdb/meta/{character_1697.txt => character.1697.txt} (100%) rename mods/skinsdb/meta/{character_1698.txt => character.1698.txt} (100%) rename mods/skinsdb/meta/{character_1699.txt => character.1699.txt} (100%) rename mods/skinsdb/meta/{character_170.txt => character.170.txt} (100%) rename mods/skinsdb/meta/{character_1700.txt => character.1700.txt} (100%) rename mods/skinsdb/meta/{character_1701.txt => character.1701.txt} (100%) rename mods/skinsdb/meta/{character_1702.txt => character.1702.txt} (100%) rename mods/skinsdb/meta/{character_1703.txt => character.1703.txt} (100%) rename mods/skinsdb/meta/{character_1704.txt => character.1704.txt} (100%) rename mods/skinsdb/meta/{character_1705.txt => character.1705.txt} (100%) rename mods/skinsdb/meta/{character_1706.txt => character.1706.txt} (100%) rename mods/skinsdb/meta/{character_1707.txt => character.1707.txt} (100%) rename mods/skinsdb/meta/{character_1708.txt => character.1708.txt} (100%) rename mods/skinsdb/meta/{character_1709.txt => character.1709.txt} (100%) rename mods/skinsdb/meta/{character_171.txt => character.171.txt} (100%) rename mods/skinsdb/meta/{character_1710.txt => character.1710.txt} (100%) rename mods/skinsdb/meta/{character_1711.txt => character.1711.txt} (100%) rename mods/skinsdb/meta/{character_1712.txt => character.1712.txt} (100%) rename mods/skinsdb/meta/{character_1713.txt => character.1713.txt} (100%) rename mods/skinsdb/meta/{character_1714.txt => character.1714.txt} (100%) rename mods/skinsdb/meta/{character_1715.txt => character.1715.txt} (100%) rename mods/skinsdb/meta/{character_1716.txt => character.1716.txt} (100%) rename mods/skinsdb/meta/{character_1717.txt => character.1717.txt} (100%) rename mods/skinsdb/meta/{character_1718.txt => character.1718.txt} (100%) rename mods/skinsdb/meta/{character_1719.txt => character.1719.txt} (100%) rename mods/skinsdb/meta/{character_172.txt => character.172.txt} (100%) rename mods/skinsdb/meta/{character_1720.txt => character.1720.txt} (100%) rename mods/skinsdb/meta/{character_1721.txt => character.1721.txt} (100%) rename mods/skinsdb/meta/{character_1722.txt => character.1722.txt} (100%) rename mods/skinsdb/meta/{character_1723.txt => character.1723.txt} (100%) rename mods/skinsdb/meta/{character_1724.txt => character.1724.txt} (100%) rename mods/skinsdb/meta/{character_1725.txt => character.1725.txt} (100%) rename mods/skinsdb/meta/{character_1726.txt => character.1726.txt} (100%) rename mods/skinsdb/meta/{character_1727.txt => character.1727.txt} (100%) rename mods/skinsdb/meta/{character_1728.txt => character.1728.txt} (100%) rename mods/skinsdb/meta/{character_1729.txt => character.1729.txt} (100%) rename mods/skinsdb/meta/{character_173.txt => character.173.txt} (100%) rename mods/skinsdb/meta/{character_1730.txt => character.1730.txt} (100%) rename mods/skinsdb/meta/{character_1731.txt => character.1731.txt} (100%) rename mods/skinsdb/meta/{character_1732.txt => character.1732.txt} (100%) rename mods/skinsdb/meta/{character_1733.txt => character.1733.txt} (100%) rename mods/skinsdb/meta/{character_1734.txt => character.1734.txt} (100%) rename mods/skinsdb/meta/{character_1735.txt => character.1735.txt} (100%) rename mods/skinsdb/meta/{character_1736.txt => character.1736.txt} (100%) rename mods/skinsdb/meta/{character_1737.txt => character.1737.txt} (100%) rename mods/skinsdb/meta/{character_1738.txt => character.1738.txt} (100%) rename mods/skinsdb/meta/{character_1739.txt => character.1739.txt} (100%) rename mods/skinsdb/meta/{character_174.txt => character.174.txt} (100%) rename mods/skinsdb/meta/{character_1740.txt => character.1740.txt} (100%) rename mods/skinsdb/meta/{character_1741.txt => character.1741.txt} (100%) rename mods/skinsdb/meta/{character_1742.txt => character.1742.txt} (100%) rename mods/skinsdb/meta/{character_1743.txt => character.1743.txt} (100%) rename mods/skinsdb/meta/{character_1744.txt => character.1744.txt} (100%) rename mods/skinsdb/meta/{character_1745.txt => character.1745.txt} (100%) rename mods/skinsdb/meta/{character_1746.txt => character.1746.txt} (100%) rename mods/skinsdb/meta/{character_1747.txt => character.1747.txt} (100%) rename mods/skinsdb/meta/{character_1748.txt => character.1748.txt} (100%) rename mods/skinsdb/meta/{character_1749.txt => character.1749.txt} (100%) rename mods/skinsdb/meta/{character_175.txt => character.175.txt} (100%) rename mods/skinsdb/meta/{character_1750.txt => character.1750.txt} (100%) rename mods/skinsdb/meta/{character_1751.txt => character.1751.txt} (100%) rename mods/skinsdb/meta/{character_1752.txt => character.1752.txt} (100%) rename mods/skinsdb/meta/{character_1753.txt => character.1753.txt} (100%) rename mods/skinsdb/meta/{character_1754.txt => character.1754.txt} (100%) rename mods/skinsdb/meta/{character_1755.txt => character.1755.txt} (100%) rename mods/skinsdb/meta/{character_1756.txt => character.1756.txt} (100%) rename mods/skinsdb/meta/{character_1757.txt => character.1757.txt} (100%) rename mods/skinsdb/meta/{character_1758.txt => character.1758.txt} (100%) rename mods/skinsdb/meta/{character_1759.txt => character.1759.txt} (100%) rename mods/skinsdb/meta/{character_176.txt => character.176.txt} (100%) rename mods/skinsdb/meta/{character_1760.txt => character.1760.txt} (100%) rename mods/skinsdb/meta/{character_1761.txt => character.1761.txt} (100%) rename mods/skinsdb/meta/{character_1762.txt => character.1762.txt} (100%) rename mods/skinsdb/meta/{character_1763.txt => character.1763.txt} (100%) rename mods/skinsdb/meta/{character_1764.txt => character.1764.txt} (100%) rename mods/skinsdb/meta/{character_1765.txt => character.1765.txt} (100%) rename mods/skinsdb/meta/{character_1766.txt => character.1766.txt} (100%) rename mods/skinsdb/meta/{character_1767.txt => character.1767.txt} (100%) rename mods/skinsdb/meta/{character_1768.txt => character.1768.txt} (100%) rename mods/skinsdb/meta/{character_1769.txt => character.1769.txt} (100%) rename mods/skinsdb/meta/{character_177.txt => character.177.txt} (100%) rename mods/skinsdb/meta/{character_1770.txt => character.1770.txt} (100%) rename mods/skinsdb/meta/{character_1771.txt => character.1771.txt} (100%) rename mods/skinsdb/meta/{character_1772.txt => character.1772.txt} (100%) rename mods/skinsdb/meta/{character_1773.txt => character.1773.txt} (100%) rename mods/skinsdb/meta/{character_1774.txt => character.1774.txt} (100%) rename mods/skinsdb/meta/{character_1775.txt => character.1775.txt} (100%) rename mods/skinsdb/meta/{character_1776.txt => character.1776.txt} (100%) rename mods/skinsdb/meta/{character_1778.txt => character.1778.txt} (100%) rename mods/skinsdb/meta/{character_1779.txt => character.1779.txt} (100%) rename mods/skinsdb/meta/{character_178.txt => character.178.txt} (100%) rename mods/skinsdb/meta/{character_1780.txt => character.1780.txt} (100%) rename mods/skinsdb/meta/{character_1781.txt => character.1781.txt} (100%) rename mods/skinsdb/meta/{character_1782.txt => character.1782.txt} (100%) rename mods/skinsdb/meta/{character_1783.txt => character.1783.txt} (100%) rename mods/skinsdb/meta/{character_1784.txt => character.1784.txt} (100%) rename mods/skinsdb/meta/{character_1785.txt => character.1785.txt} (100%) rename mods/skinsdb/meta/{character_1786.txt => character.1786.txt} (100%) rename mods/skinsdb/meta/{character_1787.txt => character.1787.txt} (100%) rename mods/skinsdb/meta/{character_1788.txt => character.1788.txt} (100%) rename mods/skinsdb/meta/{character_1789.txt => character.1789.txt} (100%) rename mods/skinsdb/meta/{character_179.txt => character.179.txt} (100%) rename mods/skinsdb/meta/{character_1790.txt => character.1790.txt} (100%) rename mods/skinsdb/meta/{character_1791.txt => character.1791.txt} (100%) rename mods/skinsdb/meta/{character_1792.txt => character.1792.txt} (100%) rename mods/skinsdb/meta/{character_1793.txt => character.1793.txt} (100%) rename mods/skinsdb/meta/{character_1794.txt => character.1794.txt} (100%) rename mods/skinsdb/meta/{character_1796.txt => character.1796.txt} (100%) rename mods/skinsdb/meta/{character_1797.txt => character.1797.txt} (100%) rename mods/skinsdb/meta/{character_1798.txt => character.1798.txt} (100%) rename mods/skinsdb/meta/{character_1799.txt => character.1799.txt} (100%) rename mods/skinsdb/meta/{character_180.txt => character.180.txt} (100%) rename mods/skinsdb/meta/{character_1800.txt => character.1800.txt} (100%) rename mods/skinsdb/meta/{character_1801.txt => character.1801.txt} (100%) rename mods/skinsdb/meta/{character_1802.txt => character.1802.txt} (100%) rename mods/skinsdb/meta/{character_1803.txt => character.1803.txt} (100%) rename mods/skinsdb/meta/{character_1804.txt => character.1804.txt} (100%) rename mods/skinsdb/meta/{character_1805.txt => character.1805.txt} (100%) rename mods/skinsdb/meta/{character_1806.txt => character.1806.txt} (100%) rename mods/skinsdb/meta/{character_1807.txt => character.1807.txt} (100%) rename mods/skinsdb/meta/{character_1808.txt => character.1808.txt} (100%) rename mods/skinsdb/meta/{character_1809.txt => character.1809.txt} (100%) rename mods/skinsdb/meta/{character_181.txt => character.181.txt} (100%) rename mods/skinsdb/meta/{character_1810.txt => character.1810.txt} (100%) rename mods/skinsdb/meta/{character_1811.txt => character.1811.txt} (100%) rename mods/skinsdb/meta/{character_1812.txt => character.1812.txt} (100%) rename mods/skinsdb/meta/{character_1813.txt => character.1813.txt} (100%) rename mods/skinsdb/meta/{character_1814.txt => character.1814.txt} (100%) rename mods/skinsdb/meta/{character_1815.txt => character.1815.txt} (100%) rename mods/skinsdb/meta/{character_1816.txt => character.1816.txt} (100%) rename mods/skinsdb/meta/{character_1817.txt => character.1817.txt} (100%) rename mods/skinsdb/meta/{character_1818.txt => character.1818.txt} (100%) rename mods/skinsdb/meta/{character_1819.txt => character.1819.txt} (100%) rename mods/skinsdb/meta/{character_182.txt => character.182.txt} (100%) rename mods/skinsdb/meta/{character_1820.txt => character.1820.txt} (100%) rename mods/skinsdb/meta/{character_1821.txt => character.1821.txt} (100%) rename mods/skinsdb/meta/{character_1822.txt => character.1822.txt} (100%) rename mods/skinsdb/meta/{character_1823.txt => character.1823.txt} (100%) rename mods/skinsdb/meta/{character_1824.txt => character.1824.txt} (100%) rename mods/skinsdb/meta/{character_1825.txt => character.1825.txt} (100%) rename mods/skinsdb/meta/{character_1826.txt => character.1826.txt} (100%) rename mods/skinsdb/meta/{character_1827.txt => character.1827.txt} (100%) rename mods/skinsdb/meta/{character_1828.txt => character.1828.txt} (100%) rename mods/skinsdb/meta/{character_1829.txt => character.1829.txt} (100%) rename mods/skinsdb/meta/{character_183.txt => character.183.txt} (100%) rename mods/skinsdb/meta/{character_1830.txt => character.1830.txt} (100%) rename mods/skinsdb/meta/{character_1831.txt => character.1831.txt} (100%) rename mods/skinsdb/meta/{character_1832.txt => character.1832.txt} (100%) rename mods/skinsdb/meta/{character_1833.txt => character.1833.txt} (100%) rename mods/skinsdb/meta/{character_1834.txt => character.1834.txt} (100%) rename mods/skinsdb/meta/{character_1835.txt => character.1835.txt} (100%) rename mods/skinsdb/meta/{character_1836.txt => character.1836.txt} (100%) rename mods/skinsdb/meta/{character_1837.txt => character.1837.txt} (100%) rename mods/skinsdb/meta/{character_1838.txt => character.1838.txt} (100%) rename mods/skinsdb/meta/{character_1839.txt => character.1839.txt} (100%) rename mods/skinsdb/meta/{character_184.txt => character.184.txt} (100%) rename mods/skinsdb/meta/{character_1840.txt => character.1840.txt} (100%) rename mods/skinsdb/meta/{character_1841.txt => character.1841.txt} (100%) rename mods/skinsdb/meta/{character_1842.txt => character.1842.txt} (100%) rename mods/skinsdb/meta/{character_1843.txt => character.1843.txt} (100%) rename mods/skinsdb/meta/{character_1844.txt => character.1844.txt} (100%) rename mods/skinsdb/meta/{character_1845.txt => character.1845.txt} (100%) rename mods/skinsdb/meta/{character_1846.txt => character.1846.txt} (100%) rename mods/skinsdb/meta/{character_1847.txt => character.1847.txt} (100%) rename mods/skinsdb/meta/{character_1848.txt => character.1848.txt} (100%) rename mods/skinsdb/meta/{character_1849.txt => character.1849.txt} (100%) rename mods/skinsdb/meta/{character_185.txt => character.185.txt} (100%) rename mods/skinsdb/meta/{character_1850.txt => character.1850.txt} (100%) rename mods/skinsdb/meta/{character_1851.txt => character.1851.txt} (100%) rename mods/skinsdb/meta/{character_1852.txt => character.1852.txt} (100%) rename mods/skinsdb/meta/{character_1853.txt => character.1853.txt} (100%) rename mods/skinsdb/meta/{character_1854.txt => character.1854.txt} (100%) rename mods/skinsdb/meta/{character_1855.txt => character.1855.txt} (100%) rename mods/skinsdb/meta/{character_1856.txt => character.1856.txt} (100%) rename mods/skinsdb/meta/{character_1857.txt => character.1857.txt} (100%) rename mods/skinsdb/meta/{character_1858.txt => character.1858.txt} (100%) rename mods/skinsdb/meta/{character_1859.txt => character.1859.txt} (100%) rename mods/skinsdb/meta/{character_186.txt => character.186.txt} (100%) rename mods/skinsdb/meta/{character_1860.txt => character.1860.txt} (100%) rename mods/skinsdb/meta/{character_1861.txt => character.1861.txt} (100%) rename mods/skinsdb/meta/{character_1862.txt => character.1862.txt} (100%) rename mods/skinsdb/meta/{character_1863.txt => character.1863.txt} (100%) rename mods/skinsdb/meta/{character_1864.txt => character.1864.txt} (100%) rename mods/skinsdb/meta/{character_1865.txt => character.1865.txt} (100%) rename mods/skinsdb/meta/{character_1866.txt => character.1866.txt} (100%) rename mods/skinsdb/meta/{character_1867.txt => character.1867.txt} (100%) rename mods/skinsdb/meta/{character_1868.txt => character.1868.txt} (100%) rename mods/skinsdb/meta/{character_1869.txt => character.1869.txt} (100%) rename mods/skinsdb/meta/{character_187.txt => character.187.txt} (100%) rename mods/skinsdb/meta/{character_1870.txt => character.1870.txt} (100%) rename mods/skinsdb/meta/{character_1871.txt => character.1871.txt} (100%) rename mods/skinsdb/meta/{character_1872.txt => character.1872.txt} (100%) rename mods/skinsdb/meta/{character_1873.txt => character.1873.txt} (100%) rename mods/skinsdb/meta/{character_1874.txt => character.1874.txt} (100%) rename mods/skinsdb/meta/{character_1875.txt => character.1875.txt} (100%) rename mods/skinsdb/meta/{character_1876.txt => character.1876.txt} (100%) rename mods/skinsdb/meta/{character_1877.txt => character.1877.txt} (100%) rename mods/skinsdb/meta/{character_1878.txt => character.1878.txt} (100%) rename mods/skinsdb/meta/{character_1879.txt => character.1879.txt} (100%) rename mods/skinsdb/meta/{character_188.txt => character.188.txt} (100%) rename mods/skinsdb/meta/{character_1880.txt => character.1880.txt} (100%) rename mods/skinsdb/meta/{character_1881.txt => character.1881.txt} (100%) rename mods/skinsdb/meta/{character_1882.txt => character.1882.txt} (100%) rename mods/skinsdb/meta/{character_1883.txt => character.1883.txt} (100%) rename mods/skinsdb/meta/{character_1884.txt => character.1884.txt} (100%) rename mods/skinsdb/meta/{character_1885.txt => character.1885.txt} (100%) rename mods/skinsdb/meta/{character_1886.txt => character.1886.txt} (100%) rename mods/skinsdb/meta/{character_1887.txt => character.1887.txt} (100%) rename mods/skinsdb/meta/{character_1888.txt => character.1888.txt} (100%) rename mods/skinsdb/meta/{character_1889.txt => character.1889.txt} (100%) rename mods/skinsdb/meta/{character_189.txt => character.189.txt} (100%) rename mods/skinsdb/meta/{character_1890.txt => character.1890.txt} (100%) rename mods/skinsdb/meta/{character_1891.txt => character.1891.txt} (100%) rename mods/skinsdb/meta/{character_1892.txt => character.1892.txt} (100%) rename mods/skinsdb/meta/{character_1893.txt => character.1893.txt} (100%) rename mods/skinsdb/meta/{character_1894.txt => character.1894.txt} (100%) rename mods/skinsdb/meta/{character_1895.txt => character.1895.txt} (100%) rename mods/skinsdb/meta/{character_1896.txt => character.1896.txt} (100%) rename mods/skinsdb/meta/{character_1897.txt => character.1897.txt} (100%) rename mods/skinsdb/meta/{character_1898.txt => character.1898.txt} (100%) rename mods/skinsdb/meta/{character_1899.txt => character.1899.txt} (100%) rename mods/skinsdb/meta/{character_19.txt => character.19.txt} (100%) rename mods/skinsdb/meta/{character_190.txt => character.190.txt} (100%) rename mods/skinsdb/meta/{character_1900.txt => character.1900.txt} (100%) rename mods/skinsdb/meta/{character_1901.txt => character.1901.txt} (100%) rename mods/skinsdb/meta/{character_1902.txt => character.1902.txt} (100%) rename mods/skinsdb/meta/{character_1903.txt => character.1903.txt} (100%) rename mods/skinsdb/meta/{character_1904.txt => character.1904.txt} (100%) rename mods/skinsdb/meta/{character_1905.txt => character.1905.txt} (100%) rename mods/skinsdb/meta/{character_1906.txt => character.1906.txt} (100%) rename mods/skinsdb/meta/{character_1907.txt => character.1907.txt} (100%) rename mods/skinsdb/meta/{character_1908.txt => character.1908.txt} (100%) rename mods/skinsdb/meta/{character_1909.txt => character.1909.txt} (100%) rename mods/skinsdb/meta/{character_191.txt => character.191.txt} (100%) rename mods/skinsdb/meta/{character_1910.txt => character.1910.txt} (100%) rename mods/skinsdb/meta/{character_1911.txt => character.1911.txt} (100%) rename mods/skinsdb/meta/{character_1912.txt => character.1912.txt} (100%) rename mods/skinsdb/meta/{character_1913.txt => character.1913.txt} (100%) rename mods/skinsdb/meta/{character_1914.txt => character.1914.txt} (100%) rename mods/skinsdb/meta/{character_1915.txt => character.1915.txt} (100%) rename mods/skinsdb/meta/{character_1916.txt => character.1916.txt} (100%) rename mods/skinsdb/meta/{character_1917.txt => character.1917.txt} (100%) rename mods/skinsdb/meta/{character_1918.txt => character.1918.txt} (100%) rename mods/skinsdb/meta/{character_1919.txt => character.1919.txt} (100%) rename mods/skinsdb/meta/{character_192.txt => character.192.txt} (100%) rename mods/skinsdb/meta/{character_1920.txt => character.1920.txt} (100%) rename mods/skinsdb/meta/{character_1921.txt => character.1921.txt} (100%) rename mods/skinsdb/meta/{character_1922.txt => character.1922.txt} (100%) rename mods/skinsdb/meta/{character_1923.txt => character.1923.txt} (100%) rename mods/skinsdb/meta/{character_1924.txt => character.1924.txt} (100%) rename mods/skinsdb/meta/{character_1925.txt => character.1925.txt} (100%) rename mods/skinsdb/meta/{character_1926.txt => character.1926.txt} (100%) rename mods/skinsdb/meta/{character_1927.txt => character.1927.txt} (100%) rename mods/skinsdb/meta/{character_1928.txt => character.1928.txt} (100%) rename mods/skinsdb/meta/{character_1929.txt => character.1929.txt} (100%) rename mods/skinsdb/meta/{character_193.txt => character.193.txt} (100%) rename mods/skinsdb/meta/{character_1930.txt => character.1930.txt} (100%) rename mods/skinsdb/meta/{character_1931.txt => character.1931.txt} (100%) rename mods/skinsdb/meta/{character_1932.txt => character.1932.txt} (100%) rename mods/skinsdb/meta/{character_1933.txt => character.1933.txt} (100%) rename mods/skinsdb/meta/{character_1934.txt => character.1934.txt} (100%) rename mods/skinsdb/meta/{character_1935.txt => character.1935.txt} (100%) rename mods/skinsdb/meta/{character_1937.txt => character.1937.txt} (100%) rename mods/skinsdb/meta/{character_1938.txt => character.1938.txt} (100%) rename mods/skinsdb/meta/{character_1939.txt => character.1939.txt} (100%) rename mods/skinsdb/meta/{character_194.txt => character.194.txt} (100%) rename mods/skinsdb/meta/{character_1940.txt => character.1940.txt} (100%) rename mods/skinsdb/meta/{character_1941.txt => character.1941.txt} (100%) rename mods/skinsdb/meta/{character_1942.txt => character.1942.txt} (100%) rename mods/skinsdb/meta/{character_1943.txt => character.1943.txt} (100%) rename mods/skinsdb/meta/{character_1944.txt => character.1944.txt} (100%) rename mods/skinsdb/meta/{character_1945.txt => character.1945.txt} (100%) rename mods/skinsdb/meta/{character_1946.txt => character.1946.txt} (100%) rename mods/skinsdb/meta/{character_1947.txt => character.1947.txt} (100%) rename mods/skinsdb/meta/{character_1948.txt => character.1948.txt} (100%) rename mods/skinsdb/meta/{character_1949.txt => character.1949.txt} (100%) rename mods/skinsdb/meta/{character_195.txt => character.195.txt} (100%) rename mods/skinsdb/meta/{character_1950.txt => character.1950.txt} (100%) rename mods/skinsdb/meta/{character_1951.txt => character.1951.txt} (100%) rename mods/skinsdb/meta/{character_1952.txt => character.1952.txt} (100%) rename mods/skinsdb/meta/{character_1953.txt => character.1953.txt} (100%) rename mods/skinsdb/meta/{character_1954.txt => character.1954.txt} (100%) rename mods/skinsdb/meta/{character_1955.txt => character.1955.txt} (100%) rename mods/skinsdb/meta/{character_1956.txt => character.1956.txt} (100%) rename mods/skinsdb/meta/{character_1957.txt => character.1957.txt} (100%) rename mods/skinsdb/meta/{character_1958.txt => character.1958.txt} (100%) rename mods/skinsdb/meta/{character_1959.txt => character.1959.txt} (100%) rename mods/skinsdb/meta/{character_196.txt => character.196.txt} (100%) rename mods/skinsdb/meta/{character_1960.txt => character.1960.txt} (100%) rename mods/skinsdb/meta/{character_1961.txt => character.1961.txt} (100%) rename mods/skinsdb/meta/{character_1962.txt => character.1962.txt} (100%) rename mods/skinsdb/meta/{character_1963.txt => character.1963.txt} (100%) rename mods/skinsdb/meta/{character_1964.txt => character.1964.txt} (100%) rename mods/skinsdb/meta/{character_1965.txt => character.1965.txt} (100%) rename mods/skinsdb/meta/{character_1966.txt => character.1966.txt} (100%) rename mods/skinsdb/meta/{character_1967.txt => character.1967.txt} (100%) rename mods/skinsdb/meta/{character_1968.txt => character.1968.txt} (100%) rename mods/skinsdb/meta/{character_1969.txt => character.1969.txt} (100%) rename mods/skinsdb/meta/{character_197.txt => character.197.txt} (100%) rename mods/skinsdb/meta/{character_1970.txt => character.1970.txt} (100%) rename mods/skinsdb/meta/{character_1971.txt => character.1971.txt} (100%) rename mods/skinsdb/meta/{character_1972.txt => character.1972.txt} (100%) rename mods/skinsdb/meta/{character_1973.txt => character.1973.txt} (100%) rename mods/skinsdb/meta/{character_1974.txt => character.1974.txt} (100%) rename mods/skinsdb/meta/{character_1975.txt => character.1975.txt} (100%) rename mods/skinsdb/meta/{character_1976.txt => character.1976.txt} (100%) rename mods/skinsdb/meta/{character_1977.txt => character.1977.txt} (100%) rename mods/skinsdb/meta/{character_1978.txt => character.1978.txt} (100%) rename mods/skinsdb/meta/{character_1979.txt => character.1979.txt} (100%) rename mods/skinsdb/meta/{character_198.txt => character.198.txt} (100%) rename mods/skinsdb/meta/{character_1980.txt => character.1980.txt} (100%) rename mods/skinsdb/meta/{character_1981.txt => character.1981.txt} (100%) rename mods/skinsdb/meta/{character_1982.txt => character.1982.txt} (100%) rename mods/skinsdb/meta/{character_1983.txt => character.1983.txt} (100%) rename mods/skinsdb/meta/{character_1984.txt => character.1984.txt} (100%) rename mods/skinsdb/meta/{character_1985.txt => character.1985.txt} (100%) rename mods/skinsdb/meta/{character_1986.txt => character.1986.txt} (100%) rename mods/skinsdb/meta/{character_1987.txt => character.1987.txt} (100%) rename mods/skinsdb/meta/{character_1988.txt => character.1988.txt} (100%) rename mods/skinsdb/meta/{character_1989.txt => character.1989.txt} (100%) rename mods/skinsdb/meta/{character_199.txt => character.199.txt} (100%) rename mods/skinsdb/meta/{character_1990.txt => character.1990.txt} (100%) rename mods/skinsdb/meta/{character_1991.txt => character.1991.txt} (100%) rename mods/skinsdb/meta/{character_1992.txt => character.1992.txt} (100%) rename mods/skinsdb/meta/{character_1993.txt => character.1993.txt} (100%) rename mods/skinsdb/meta/{character_1994.txt => character.1994.txt} (100%) rename mods/skinsdb/meta/{character_1995.txt => character.1995.txt} (100%) rename mods/skinsdb/meta/{character_1996.txt => character.1996.txt} (100%) rename mods/skinsdb/meta/{character_1997.txt => character.1997.txt} (100%) rename mods/skinsdb/meta/{character_1998.txt => character.1998.txt} (100%) rename mods/skinsdb/meta/{character_1999.txt => character.1999.txt} (100%) rename mods/skinsdb/meta/{character_2.txt => character.2.txt} (100%) rename mods/skinsdb/meta/{character_20.txt => character.20.txt} (100%) rename mods/skinsdb/meta/{character_200.txt => character.200.txt} (100%) rename mods/skinsdb/meta/{character_2000.txt => character.2000.txt} (100%) rename mods/skinsdb/meta/{character_2001.txt => character.2001.txt} (100%) rename mods/skinsdb/meta/{character_2002.txt => character.2002.txt} (100%) rename mods/skinsdb/meta/{character_2003.txt => character.2003.txt} (100%) rename mods/skinsdb/meta/{character_2004.txt => character.2004.txt} (100%) rename mods/skinsdb/meta/{character_2005.txt => character.2005.txt} (100%) rename mods/skinsdb/meta/{character_2006.txt => character.2006.txt} (100%) rename mods/skinsdb/meta/{character_2007.txt => character.2007.txt} (100%) rename mods/skinsdb/meta/{character_2008.txt => character.2008.txt} (100%) rename mods/skinsdb/meta/{character_2009.txt => character.2009.txt} (100%) rename mods/skinsdb/meta/{character_201.txt => character.201.txt} (100%) rename mods/skinsdb/meta/{character_2010.txt => character.2010.txt} (100%) rename mods/skinsdb/meta/{character_2011.txt => character.2011.txt} (100%) rename mods/skinsdb/meta/{character_2012.txt => character.2012.txt} (100%) rename mods/skinsdb/meta/{character_2013.txt => character.2013.txt} (100%) rename mods/skinsdb/meta/{character_2014.txt => character.2014.txt} (100%) rename mods/skinsdb/meta/{character_2015.txt => character.2015.txt} (100%) rename mods/skinsdb/meta/{character_2016.txt => character.2016.txt} (100%) rename mods/skinsdb/meta/{character_2017.txt => character.2017.txt} (100%) rename mods/skinsdb/meta/{character_2018.txt => character.2018.txt} (100%) rename mods/skinsdb/meta/{character_2019.txt => character.2019.txt} (100%) rename mods/skinsdb/meta/{character_2020.txt => character.2020.txt} (100%) rename mods/skinsdb/meta/{character_2021.txt => character.2021.txt} (100%) rename mods/skinsdb/meta/{character_2022.txt => character.2022.txt} (100%) rename mods/skinsdb/meta/{character_2023.txt => character.2023.txt} (56%) rename mods/skinsdb/meta/{character_2024.txt => character.2024.txt} (100%) rename mods/skinsdb/meta/{character_2025.txt => character.2025.txt} (100%) rename mods/skinsdb/meta/{character_2026.txt => character.2026.txt} (100%) rename mods/skinsdb/meta/{character_2027.txt => character.2027.txt} (100%) rename mods/skinsdb/meta/{character_2028.txt => character.2028.txt} (100%) rename mods/skinsdb/meta/{character_2029.txt => character.2029.txt} (100%) rename mods/skinsdb/meta/{character_203.txt => character.203.txt} (100%) rename mods/skinsdb/meta/{character_2030.txt => character.2030.txt} (100%) rename mods/skinsdb/meta/{character_2031.txt => character.2031.txt} (100%) rename mods/skinsdb/meta/{character_2032.txt => character.2032.txt} (100%) rename mods/skinsdb/meta/{character_2033.txt => character.2033.txt} (100%) rename mods/skinsdb/meta/{character_2034.txt => character.2034.txt} (100%) rename mods/skinsdb/meta/{character_2035.txt => character.2035.txt} (100%) rename mods/skinsdb/meta/{character_2036.txt => character.2036.txt} (100%) rename mods/skinsdb/meta/{character_2037.txt => character.2037.txt} (100%) rename mods/skinsdb/meta/{character_2038.txt => character.2038.txt} (100%) rename mods/skinsdb/meta/{character_2039.txt => character.2039.txt} (100%) rename mods/skinsdb/meta/{character_2040.txt => character.2040.txt} (100%) rename mods/skinsdb/meta/{character_2041.txt => character.2041.txt} (100%) rename mods/skinsdb/meta/{character_2042.txt => character.2042.txt} (100%) rename mods/skinsdb/meta/{character_2043.txt => character.2043.txt} (100%) rename mods/skinsdb/meta/{character_2044.txt => character.2044.txt} (100%) rename mods/skinsdb/meta/{character_2045.txt => character.2045.txt} (100%) rename mods/skinsdb/meta/{character_2046.txt => character.2046.txt} (100%) rename mods/skinsdb/meta/{character_2047.txt => character.2047.txt} (100%) rename mods/skinsdb/meta/{character_2048.txt => character.2048.txt} (100%) rename mods/skinsdb/meta/{character_2049.txt => character.2049.txt} (100%) rename mods/skinsdb/meta/{character_205.txt => character.205.txt} (100%) rename mods/skinsdb/meta/{character_2050.txt => character.2050.txt} (100%) rename mods/skinsdb/meta/{character_2051.txt => character.2051.txt} (100%) rename mods/skinsdb/meta/{character_2052.txt => character.2052.txt} (57%) rename mods/skinsdb/meta/{character_2053.txt => character.2053.txt} (100%) rename mods/skinsdb/meta/{character_2054.txt => character.2054.txt} (100%) rename mods/skinsdb/meta/{character_2055.txt => character.2055.txt} (100%) rename mods/skinsdb/meta/{character_2056.txt => character.2056.txt} (100%) rename mods/skinsdb/meta/{character_2057.txt => character.2057.txt} (100%) rename mods/skinsdb/meta/{character_2058.txt => character.2058.txt} (100%) rename mods/skinsdb/meta/{character_2059.txt => character.2059.txt} (100%) rename mods/skinsdb/meta/{character_206.txt => character.206.txt} (100%) rename mods/skinsdb/meta/{character_2060.txt => character.2060.txt} (100%) rename mods/skinsdb/meta/{character_2061.txt => character.2061.txt} (100%) rename mods/skinsdb/meta/{character_2062.txt => character.2062.txt} (100%) rename mods/skinsdb/meta/{character_2063.txt => character.2063.txt} (100%) rename mods/skinsdb/meta/{character_2064.txt => character.2064.txt} (100%) rename mods/skinsdb/meta/{character_2065.txt => character.2065.txt} (100%) rename mods/skinsdb/meta/{character_2066.txt => character.2066.txt} (100%) rename mods/skinsdb/meta/{character_2067.txt => character.2067.txt} (100%) rename mods/skinsdb/meta/{character_2068.txt => character.2068.txt} (100%) rename mods/skinsdb/meta/{character_2069.txt => character.2069.txt} (100%) rename mods/skinsdb/meta/{character_207.txt => character.207.txt} (100%) rename mods/skinsdb/meta/{character_2070.txt => character.2070.txt} (100%) rename mods/skinsdb/meta/{character_2071.txt => character.2071.txt} (100%) rename mods/skinsdb/meta/{character_2072.txt => character.2072.txt} (100%) rename mods/skinsdb/meta/{character_2073.txt => character.2073.txt} (100%) rename mods/skinsdb/meta/{character_2074.txt => character.2074.txt} (100%) rename mods/skinsdb/meta/{character_2075.txt => character.2075.txt} (100%) rename mods/skinsdb/meta/{character_2076.txt => character.2076.txt} (100%) rename mods/skinsdb/meta/{character_2077.txt => character.2077.txt} (100%) rename mods/skinsdb/meta/{character_2078.txt => character.2078.txt} (100%) rename mods/skinsdb/meta/{character_2079.txt => character.2079.txt} (100%) rename mods/skinsdb/meta/{character_208.txt => character.208.txt} (100%) rename mods/skinsdb/meta/{character_2080.txt => character.2080.txt} (100%) rename mods/skinsdb/meta/{character_2081.txt => character.2081.txt} (100%) rename mods/skinsdb/meta/{character_2082.txt => character.2082.txt} (100%) rename mods/skinsdb/meta/{character_2083.txt => character.2083.txt} (100%) rename mods/skinsdb/meta/{character_2084.txt => character.2084.txt} (100%) rename mods/skinsdb/meta/{character_2085.txt => character.2085.txt} (100%) rename mods/skinsdb/meta/{character_2086.txt => character.2086.txt} (100%) rename mods/skinsdb/meta/{character_2087.txt => character.2087.txt} (100%) rename mods/skinsdb/meta/{character_2088.txt => character.2088.txt} (100%) rename mods/skinsdb/meta/{character_2089.txt => character.2089.txt} (100%) rename mods/skinsdb/meta/{character_209.txt => character.209.txt} (100%) rename mods/skinsdb/meta/{character_2090.txt => character.2090.txt} (100%) rename mods/skinsdb/meta/{character_2091.txt => character.2091.txt} (100%) rename mods/skinsdb/meta/{character_2092.txt => character.2092.txt} (100%) rename mods/skinsdb/meta/{character_2093.txt => character.2093.txt} (100%) rename mods/skinsdb/meta/{character_2094.txt => character.2094.txt} (100%) rename mods/skinsdb/meta/{character_2095.txt => character.2095.txt} (100%) rename mods/skinsdb/meta/{character_2096.txt => character.2096.txt} (100%) rename mods/skinsdb/meta/{character_2097.txt => character.2097.txt} (100%) rename mods/skinsdb/meta/{character_2098.txt => character.2098.txt} (100%) rename mods/skinsdb/meta/{character_2099.txt => character.2099.txt} (100%) rename mods/skinsdb/meta/{character_21.txt => character.21.txt} (100%) rename mods/skinsdb/meta/{character_210.txt => character.210.txt} (100%) rename mods/skinsdb/meta/{character_2100.txt => character.2100.txt} (100%) rename mods/skinsdb/meta/{character_2101.txt => character.2101.txt} (100%) rename mods/skinsdb/meta/{character_2102.txt => character.2102.txt} (100%) rename mods/skinsdb/meta/{character_2103.txt => character.2103.txt} (100%) rename mods/skinsdb/meta/{character_2104.txt => character.2104.txt} (100%) rename mods/skinsdb/meta/{character_2105.txt => character.2105.txt} (100%) rename mods/skinsdb/meta/{character_2106.txt => character.2106.txt} (100%) rename mods/skinsdb/meta/{character_2107.txt => character.2107.txt} (100%) rename mods/skinsdb/meta/{character_2108.txt => character.2108.txt} (100%) rename mods/skinsdb/meta/{character_2109.txt => character.2109.txt} (100%) rename mods/skinsdb/meta/{character_211.txt => character.211.txt} (100%) rename mods/skinsdb/meta/{character_2110.txt => character.2110.txt} (100%) rename mods/skinsdb/meta/{character_2111.txt => character.2111.txt} (100%) rename mods/skinsdb/meta/{character_2112.txt => character.2112.txt} (100%) rename mods/skinsdb/meta/{character_2114.txt => character.2114.txt} (100%) rename mods/skinsdb/meta/{character_2115.txt => character.2115.txt} (100%) rename mods/skinsdb/meta/{character_2116.txt => character.2116.txt} (100%) rename mods/skinsdb/meta/{character_2117.txt => character.2117.txt} (100%) rename mods/skinsdb/meta/{character_2118.txt => character.2118.txt} (100%) rename mods/skinsdb/meta/{character_2119.txt => character.2119.txt} (100%) rename mods/skinsdb/meta/{character_212.txt => character.212.txt} (100%) rename mods/skinsdb/meta/{character_2120.txt => character.2120.txt} (100%) rename mods/skinsdb/meta/{character_2121.txt => character.2121.txt} (100%) rename mods/skinsdb/meta/{character_2122.txt => character.2122.txt} (100%) rename mods/skinsdb/meta/{character_2123.txt => character.2123.txt} (100%) rename mods/skinsdb/meta/{character_2124.txt => character.2124.txt} (100%) rename mods/skinsdb/meta/{character_2125.txt => character.2125.txt} (100%) rename mods/skinsdb/meta/{character_2126.txt => character.2126.txt} (100%) rename mods/skinsdb/meta/{character_2127.txt => character.2127.txt} (100%) rename mods/skinsdb/meta/{character_2128.txt => character.2128.txt} (100%) rename mods/skinsdb/meta/{character_2129.txt => character.2129.txt} (100%) rename mods/skinsdb/meta/{character_213.txt => character.213.txt} (100%) rename mods/skinsdb/meta/{character_2130.txt => character.2130.txt} (100%) rename mods/skinsdb/meta/{character_2131.txt => character.2131.txt} (100%) rename mods/skinsdb/meta/{character_2132.txt => character.2132.txt} (100%) rename mods/skinsdb/meta/{character_2133.txt => character.2133.txt} (100%) rename mods/skinsdb/meta/{character_2134.txt => character.2134.txt} (100%) rename mods/skinsdb/meta/{character_2135.txt => character.2135.txt} (100%) rename mods/skinsdb/meta/{character_2136.txt => character.2136.txt} (100%) rename mods/skinsdb/meta/{character_2137.txt => character.2137.txt} (100%) rename mods/skinsdb/meta/{character_2138.txt => character.2138.txt} (100%) rename mods/skinsdb/meta/{character_2139.txt => character.2139.txt} (100%) rename mods/skinsdb/meta/{character_214.txt => character.214.txt} (100%) rename mods/skinsdb/meta/{character_2140.txt => character.2140.txt} (100%) rename mods/skinsdb/meta/{character_2141.txt => character.2141.txt} (100%) rename mods/skinsdb/meta/{character_2142.txt => character.2142.txt} (100%) rename mods/skinsdb/meta/{character_2143.txt => character.2143.txt} (100%) rename mods/skinsdb/meta/{character_2144.txt => character.2144.txt} (100%) rename mods/skinsdb/meta/{character_2145.txt => character.2145.txt} (100%) rename mods/skinsdb/meta/{character_2146.txt => character.2146.txt} (100%) rename mods/skinsdb/meta/{character_2147.txt => character.2147.txt} (100%) rename mods/skinsdb/meta/{character_2148.txt => character.2148.txt} (100%) rename mods/skinsdb/meta/{character_2149.txt => character.2149.txt} (100%) rename mods/skinsdb/meta/{character_215.txt => character.215.txt} (100%) rename mods/skinsdb/meta/{character_2150.txt => character.2150.txt} (100%) rename mods/skinsdb/meta/{character_2151.txt => character.2151.txt} (100%) rename mods/skinsdb/meta/{character_2152.txt => character.2152.txt} (100%) rename mods/skinsdb/meta/{character_2153.txt => character.2153.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2154.txt create mode 100644 mods/skinsdb/meta/character.2155.txt create mode 100644 mods/skinsdb/meta/character.2156.txt create mode 100644 mods/skinsdb/meta/character.2157.txt create mode 100644 mods/skinsdb/meta/character.2158.txt create mode 100644 mods/skinsdb/meta/character.2159.txt rename mods/skinsdb/meta/{character_216.txt => character.216.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2160.txt create mode 100644 mods/skinsdb/meta/character.2161.txt create mode 100644 mods/skinsdb/meta/character.2162.txt create mode 100644 mods/skinsdb/meta/character.2163.txt create mode 100644 mods/skinsdb/meta/character.2164.txt create mode 100644 mods/skinsdb/meta/character.2165.txt create mode 100644 mods/skinsdb/meta/character.2166.txt create mode 100644 mods/skinsdb/meta/character.2167.txt create mode 100644 mods/skinsdb/meta/character.2168.txt create mode 100644 mods/skinsdb/meta/character.2169.txt rename mods/skinsdb/meta/{character_217.txt => character.217.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2170.txt create mode 100644 mods/skinsdb/meta/character.2171.txt create mode 100644 mods/skinsdb/meta/character.2172.txt create mode 100644 mods/skinsdb/meta/character.2173.txt create mode 100644 mods/skinsdb/meta/character.2174.txt create mode 100644 mods/skinsdb/meta/character.2175.txt create mode 100644 mods/skinsdb/meta/character.2176.txt create mode 100644 mods/skinsdb/meta/character.2177.txt create mode 100644 mods/skinsdb/meta/character.2178.txt create mode 100644 mods/skinsdb/meta/character.2179.txt rename mods/skinsdb/meta/{character_218.txt => character.218.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2180.txt create mode 100644 mods/skinsdb/meta/character.2181.txt create mode 100644 mods/skinsdb/meta/character.2182.txt create mode 100644 mods/skinsdb/meta/character.2183.txt create mode 100644 mods/skinsdb/meta/character.2184.txt create mode 100644 mods/skinsdb/meta/character.2185.txt create mode 100644 mods/skinsdb/meta/character.2186.txt create mode 100644 mods/skinsdb/meta/character.2187.txt create mode 100644 mods/skinsdb/meta/character.2188.txt create mode 100644 mods/skinsdb/meta/character.2189.txt rename mods/skinsdb/meta/{character_219.txt => character.219.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2190.txt create mode 100644 mods/skinsdb/meta/character.2191.txt create mode 100644 mods/skinsdb/meta/character.2192.txt create mode 100644 mods/skinsdb/meta/character.2193.txt create mode 100644 mods/skinsdb/meta/character.2194.txt create mode 100644 mods/skinsdb/meta/character.2195.txt create mode 100644 mods/skinsdb/meta/character.2196.txt create mode 100644 mods/skinsdb/meta/character.2197.txt create mode 100644 mods/skinsdb/meta/character.2198.txt create mode 100644 mods/skinsdb/meta/character.2199.txt rename mods/skinsdb/meta/{character_22.txt => character.22.txt} (100%) rename mods/skinsdb/meta/{character_220.txt => character.220.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2200.txt create mode 100644 mods/skinsdb/meta/character.2201.txt create mode 100644 mods/skinsdb/meta/character.2202.txt create mode 100644 mods/skinsdb/meta/character.2203.txt create mode 100644 mods/skinsdb/meta/character.2204.txt create mode 100644 mods/skinsdb/meta/character.2205.txt create mode 100644 mods/skinsdb/meta/character.2206.txt create mode 100644 mods/skinsdb/meta/character.2207.txt create mode 100644 mods/skinsdb/meta/character.2208.txt create mode 100644 mods/skinsdb/meta/character.2209.txt rename mods/skinsdb/meta/{character_221.txt => character.221.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2210.txt create mode 100644 mods/skinsdb/meta/character.2211.txt create mode 100644 mods/skinsdb/meta/character.2212.txt create mode 100644 mods/skinsdb/meta/character.2213.txt create mode 100644 mods/skinsdb/meta/character.2214.txt create mode 100644 mods/skinsdb/meta/character.2215.txt create mode 100644 mods/skinsdb/meta/character.2216.txt create mode 100644 mods/skinsdb/meta/character.2217.txt create mode 100644 mods/skinsdb/meta/character.2218.txt create mode 100644 mods/skinsdb/meta/character.2219.txt rename mods/skinsdb/meta/{character_222.txt => character.222.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2220.txt create mode 100644 mods/skinsdb/meta/character.2221.txt create mode 100644 mods/skinsdb/meta/character.2222.txt create mode 100644 mods/skinsdb/meta/character.2223.txt create mode 100644 mods/skinsdb/meta/character.2224.txt create mode 100644 mods/skinsdb/meta/character.2225.txt create mode 100644 mods/skinsdb/meta/character.2226.txt create mode 100644 mods/skinsdb/meta/character.2227.txt create mode 100644 mods/skinsdb/meta/character.2228.txt create mode 100644 mods/skinsdb/meta/character.2229.txt rename mods/skinsdb/meta/{character_223.txt => character.223.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2230.txt create mode 100644 mods/skinsdb/meta/character.2231.txt create mode 100644 mods/skinsdb/meta/character.2232.txt create mode 100644 mods/skinsdb/meta/character.2233.txt create mode 100644 mods/skinsdb/meta/character.2234.txt create mode 100644 mods/skinsdb/meta/character.2235.txt create mode 100644 mods/skinsdb/meta/character.2236.txt create mode 100644 mods/skinsdb/meta/character.2237.txt create mode 100644 mods/skinsdb/meta/character.2238.txt create mode 100644 mods/skinsdb/meta/character.2239.txt rename mods/skinsdb/meta/{character_224.txt => character.224.txt} (56%) create mode 100644 mods/skinsdb/meta/character.2240.txt create mode 100644 mods/skinsdb/meta/character.2241.txt create mode 100644 mods/skinsdb/meta/character.2242.txt create mode 100644 mods/skinsdb/meta/character.2243.txt create mode 100644 mods/skinsdb/meta/character.2244.txt create mode 100644 mods/skinsdb/meta/character.2245.txt create mode 100644 mods/skinsdb/meta/character.2246.txt create mode 100644 mods/skinsdb/meta/character.2247.txt create mode 100644 mods/skinsdb/meta/character.2248.txt create mode 100644 mods/skinsdb/meta/character.2249.txt rename mods/skinsdb/meta/{character_225.txt => character.225.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2250.txt create mode 100644 mods/skinsdb/meta/character.2251.txt create mode 100644 mods/skinsdb/meta/character.2252.txt create mode 100644 mods/skinsdb/meta/character.2253.txt create mode 100644 mods/skinsdb/meta/character.2254.txt create mode 100644 mods/skinsdb/meta/character.2255.txt create mode 100644 mods/skinsdb/meta/character.2256.txt create mode 100644 mods/skinsdb/meta/character.2257.txt create mode 100644 mods/skinsdb/meta/character.2258.txt create mode 100644 mods/skinsdb/meta/character.2259.txt create mode 100644 mods/skinsdb/meta/character.2260.txt create mode 100644 mods/skinsdb/meta/character.2261.txt create mode 100644 mods/skinsdb/meta/character.2262.txt create mode 100644 mods/skinsdb/meta/character.2263.txt create mode 100644 mods/skinsdb/meta/character.2264.txt create mode 100644 mods/skinsdb/meta/character.2277.txt create mode 100644 mods/skinsdb/meta/character.2278.txt create mode 100644 mods/skinsdb/meta/character.2279.txt rename mods/skinsdb/meta/{character_228.txt => character.228.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2280.txt create mode 100644 mods/skinsdb/meta/character.2281.txt create mode 100644 mods/skinsdb/meta/character.2282.txt create mode 100644 mods/skinsdb/meta/character.2283.txt create mode 100644 mods/skinsdb/meta/character.2284.txt create mode 100644 mods/skinsdb/meta/character.2285.txt create mode 100644 mods/skinsdb/meta/character.2286.txt create mode 100644 mods/skinsdb/meta/character.2287.txt create mode 100644 mods/skinsdb/meta/character.2288.txt create mode 100644 mods/skinsdb/meta/character.2289.txt rename mods/skinsdb/meta/{character_229.txt => character.229.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2290.txt create mode 100644 mods/skinsdb/meta/character.2291.txt create mode 100644 mods/skinsdb/meta/character.2292.txt create mode 100644 mods/skinsdb/meta/character.2293.txt create mode 100644 mods/skinsdb/meta/character.2294.txt create mode 100644 mods/skinsdb/meta/character.2295.txt create mode 100644 mods/skinsdb/meta/character.2296.txt create mode 100644 mods/skinsdb/meta/character.2297.txt create mode 100644 mods/skinsdb/meta/character.2298.txt create mode 100644 mods/skinsdb/meta/character.2299.txt rename mods/skinsdb/meta/{character_230.txt => character.230.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2300.txt create mode 100644 mods/skinsdb/meta/character.2301.txt create mode 100644 mods/skinsdb/meta/character.2302.txt create mode 100644 mods/skinsdb/meta/character.2303.txt create mode 100644 mods/skinsdb/meta/character.2304.txt create mode 100644 mods/skinsdb/meta/character.2305.txt create mode 100644 mods/skinsdb/meta/character.2306.txt create mode 100644 mods/skinsdb/meta/character.2307.txt create mode 100644 mods/skinsdb/meta/character.2308.txt create mode 100644 mods/skinsdb/meta/character.2309.txt rename mods/skinsdb/meta/{character_231.txt => character.231.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2310.txt create mode 100644 mods/skinsdb/meta/character.2311.txt create mode 100644 mods/skinsdb/meta/character.2312.txt create mode 100644 mods/skinsdb/meta/character.2313.txt create mode 100644 mods/skinsdb/meta/character.2314.txt create mode 100644 mods/skinsdb/meta/character.2315.txt create mode 100644 mods/skinsdb/meta/character.2316.txt create mode 100644 mods/skinsdb/meta/character.2317.txt create mode 100644 mods/skinsdb/meta/character.2318.txt create mode 100644 mods/skinsdb/meta/character.2319.txt rename mods/skinsdb/meta/{character_232.txt => character.232.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2320.txt create mode 100644 mods/skinsdb/meta/character.2321.txt create mode 100644 mods/skinsdb/meta/character.2322.txt create mode 100644 mods/skinsdb/meta/character.2323.txt create mode 100644 mods/skinsdb/meta/character.2324.txt create mode 100644 mods/skinsdb/meta/character.2325.txt create mode 100644 mods/skinsdb/meta/character.2326.txt create mode 100644 mods/skinsdb/meta/character.2327.txt create mode 100644 mods/skinsdb/meta/character.2328.txt create mode 100644 mods/skinsdb/meta/character.2329.txt rename mods/skinsdb/meta/{character_233.txt => character.233.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2330.txt create mode 100644 mods/skinsdb/meta/character.2331.txt create mode 100644 mods/skinsdb/meta/character.2332.txt create mode 100644 mods/skinsdb/meta/character.2333.txt create mode 100644 mods/skinsdb/meta/character.2334.txt create mode 100644 mods/skinsdb/meta/character.2335.txt create mode 100644 mods/skinsdb/meta/character.2336.txt create mode 100644 mods/skinsdb/meta/character.2337.txt create mode 100644 mods/skinsdb/meta/character.2338.txt create mode 100644 mods/skinsdb/meta/character.2339.txt rename mods/skinsdb/meta/{character_234.txt => character.234.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2340.txt create mode 100644 mods/skinsdb/meta/character.2341.txt create mode 100644 mods/skinsdb/meta/character.2342.txt create mode 100644 mods/skinsdb/meta/character.2343.txt create mode 100644 mods/skinsdb/meta/character.2344.txt create mode 100644 mods/skinsdb/meta/character.2345.txt create mode 100644 mods/skinsdb/meta/character.2346.txt create mode 100644 mods/skinsdb/meta/character.2347.txt create mode 100644 mods/skinsdb/meta/character.2348.txt create mode 100644 mods/skinsdb/meta/character.2349.txt rename mods/skinsdb/meta/{character_235.txt => character.235.txt} (100%) create mode 100644 mods/skinsdb/meta/character.2350.txt create mode 100644 mods/skinsdb/meta/character.2351.txt rename mods/skinsdb/meta/{character_237.txt => character.237.txt} (100%) rename mods/skinsdb/meta/{character_239.txt => character.239.txt} (100%) rename mods/skinsdb/meta/{character_24.txt => character.24.txt} (100%) rename mods/skinsdb/meta/{character_241.txt => character.241.txt} (100%) rename mods/skinsdb/meta/{character_242.txt => character.242.txt} (100%) rename mods/skinsdb/meta/{character_243.txt => character.243.txt} (100%) rename mods/skinsdb/meta/{character_244.txt => character.244.txt} (100%) rename mods/skinsdb/meta/{character_245.txt => character.245.txt} (100%) rename mods/skinsdb/meta/{character_246.txt => character.246.txt} (100%) rename mods/skinsdb/meta/{character_247.txt => character.247.txt} (100%) rename mods/skinsdb/meta/{character_248.txt => character.248.txt} (100%) rename mods/skinsdb/meta/{character_249.txt => character.249.txt} (100%) rename mods/skinsdb/meta/{character_25.txt => character.25.txt} (100%) rename mods/skinsdb/meta/{character_250.txt => character.250.txt} (100%) rename mods/skinsdb/meta/{character_251.txt => character.251.txt} (100%) rename mods/skinsdb/meta/{character_252.txt => character.252.txt} (100%) rename mods/skinsdb/meta/{character_253.txt => character.253.txt} (100%) rename mods/skinsdb/meta/{character_254.txt => character.254.txt} (100%) rename mods/skinsdb/meta/{character_255.txt => character.255.txt} (100%) rename mods/skinsdb/meta/{character_256.txt => character.256.txt} (100%) rename mods/skinsdb/meta/{character_257.txt => character.257.txt} (100%) rename mods/skinsdb/meta/{character_258.txt => character.258.txt} (100%) rename mods/skinsdb/meta/{character_259.txt => character.259.txt} (100%) rename mods/skinsdb/meta/{character_26.txt => character.26.txt} (100%) rename mods/skinsdb/meta/{character_260.txt => character.260.txt} (100%) rename mods/skinsdb/meta/{character_261.txt => character.261.txt} (100%) rename mods/skinsdb/meta/{character_262.txt => character.262.txt} (100%) rename mods/skinsdb/meta/{character_263.txt => character.263.txt} (100%) rename mods/skinsdb/meta/{character_264.txt => character.264.txt} (100%) rename mods/skinsdb/meta/{character_265.txt => character.265.txt} (100%) rename mods/skinsdb/meta/{character_266.txt => character.266.txt} (100%) rename mods/skinsdb/meta/{character_267.txt => character.267.txt} (100%) rename mods/skinsdb/meta/{character_268.txt => character.268.txt} (100%) rename mods/skinsdb/meta/{character_269.txt => character.269.txt} (100%) rename mods/skinsdb/meta/{character_27.txt => character.27.txt} (100%) rename mods/skinsdb/meta/{character_270.txt => character.270.txt} (100%) rename mods/skinsdb/meta/{character_271.txt => character.271.txt} (100%) rename mods/skinsdb/meta/{character_272.txt => character.272.txt} (100%) rename mods/skinsdb/meta/{character_273.txt => character.273.txt} (100%) rename mods/skinsdb/meta/{character_274.txt => character.274.txt} (100%) rename mods/skinsdb/meta/{character_275.txt => character.275.txt} (100%) rename mods/skinsdb/meta/{character_276.txt => character.276.txt} (100%) rename mods/skinsdb/meta/{character_277.txt => character.277.txt} (100%) rename mods/skinsdb/meta/{character_278.txt => character.278.txt} (100%) rename mods/skinsdb/meta/{character_279.txt => character.279.txt} (100%) rename mods/skinsdb/meta/{character_28.txt => character.28.txt} (100%) rename mods/skinsdb/meta/{character_280.txt => character.280.txt} (100%) rename mods/skinsdb/meta/{character_281.txt => character.281.txt} (100%) rename mods/skinsdb/meta/{character_282.txt => character.282.txt} (100%) rename mods/skinsdb/meta/{character_283.txt => character.283.txt} (100%) rename mods/skinsdb/meta/{character_284.txt => character.284.txt} (100%) rename mods/skinsdb/meta/{character_285.txt => character.285.txt} (100%) rename mods/skinsdb/meta/{character_286.txt => character.286.txt} (100%) rename mods/skinsdb/meta/{character_287.txt => character.287.txt} (100%) rename mods/skinsdb/meta/{character_288.txt => character.288.txt} (100%) rename mods/skinsdb/meta/{character_289.txt => character.289.txt} (100%) rename mods/skinsdb/meta/{character_29.txt => character.29.txt} (100%) rename mods/skinsdb/meta/{character_290.txt => character.290.txt} (100%) rename mods/skinsdb/meta/{character_291.txt => character.291.txt} (100%) rename mods/skinsdb/meta/{character_292.txt => character.292.txt} (100%) rename mods/skinsdb/meta/{character_295.txt => character.295.txt} (100%) rename mods/skinsdb/meta/{character_297.txt => character.297.txt} (100%) rename mods/skinsdb/meta/{character_299.txt => character.299.txt} (100%) rename mods/skinsdb/meta/{character_3.txt => character.3.txt} (100%) rename mods/skinsdb/meta/{character_30.txt => character.30.txt} (100%) rename mods/skinsdb/meta/{character_300.txt => character.300.txt} (100%) rename mods/skinsdb/meta/{character_301.txt => character.301.txt} (100%) rename mods/skinsdb/meta/{character_302.txt => character.302.txt} (100%) rename mods/skinsdb/meta/{character_303.txt => character.303.txt} (100%) rename mods/skinsdb/meta/{character_304.txt => character.304.txt} (100%) rename mods/skinsdb/meta/{character_305.txt => character.305.txt} (100%) rename mods/skinsdb/meta/{character_306.txt => character.306.txt} (100%) rename mods/skinsdb/meta/{character_307.txt => character.307.txt} (100%) rename mods/skinsdb/meta/{character_308.txt => character.308.txt} (100%) rename mods/skinsdb/meta/{character_309.txt => character.309.txt} (100%) rename mods/skinsdb/meta/{character_31.txt => character.31.txt} (100%) rename mods/skinsdb/meta/{character_310.txt => character.310.txt} (100%) rename mods/skinsdb/meta/{character_311.txt => character.311.txt} (100%) rename mods/skinsdb/meta/{character_312.txt => character.312.txt} (100%) rename mods/skinsdb/meta/{character_313.txt => character.313.txt} (51%) rename mods/skinsdb/meta/{character_314.txt => character.314.txt} (100%) rename mods/skinsdb/meta/{character_315.txt => character.315.txt} (100%) rename mods/skinsdb/meta/{character_316.txt => character.316.txt} (100%) rename mods/skinsdb/meta/{character_317.txt => character.317.txt} (100%) rename mods/skinsdb/meta/{character_318.txt => character.318.txt} (100%) rename mods/skinsdb/meta/{character_319.txt => character.319.txt} (100%) rename mods/skinsdb/meta/{character_320.txt => character.320.txt} (100%) rename mods/skinsdb/meta/{character_321.txt => character.321.txt} (100%) rename mods/skinsdb/meta/{character_322.txt => character.322.txt} (100%) rename mods/skinsdb/meta/{character_323.txt => character.323.txt} (100%) rename mods/skinsdb/meta/{character_324.txt => character.324.txt} (100%) rename mods/skinsdb/meta/{character_325.txt => character.325.txt} (100%) rename mods/skinsdb/meta/{character_326.txt => character.326.txt} (100%) rename mods/skinsdb/meta/{character_327.txt => character.327.txt} (100%) rename mods/skinsdb/meta/{character_328.txt => character.328.txt} (100%) rename mods/skinsdb/meta/{character_329.txt => character.329.txt} (100%) rename mods/skinsdb/meta/{character_330.txt => character.330.txt} (100%) rename mods/skinsdb/meta/{character_331.txt => character.331.txt} (100%) rename mods/skinsdb/meta/{character_332.txt => character.332.txt} (100%) rename mods/skinsdb/meta/{character_333.txt => character.333.txt} (100%) rename mods/skinsdb/meta/{character_334.txt => character.334.txt} (100%) rename mods/skinsdb/meta/{character_335.txt => character.335.txt} (100%) rename mods/skinsdb/meta/{character_336.txt => character.336.txt} (100%) rename mods/skinsdb/meta/{character_337.txt => character.337.txt} (100%) rename mods/skinsdb/meta/{character_338.txt => character.338.txt} (100%) rename mods/skinsdb/meta/{character_339.txt => character.339.txt} (100%) rename mods/skinsdb/meta/{character_34.txt => character.34.txt} (100%) rename mods/skinsdb/meta/{character_340.txt => character.340.txt} (100%) rename mods/skinsdb/meta/{character_341.txt => character.341.txt} (100%) rename mods/skinsdb/meta/{character_342.txt => character.342.txt} (100%) rename mods/skinsdb/meta/{character_344.txt => character.344.txt} (100%) rename mods/skinsdb/meta/{character_349.txt => character.349.txt} (100%) rename mods/skinsdb/meta/{character_35.txt => character.35.txt} (100%) rename mods/skinsdb/meta/{character_352.txt => character.352.txt} (100%) rename mods/skinsdb/meta/{character_353.txt => character.353.txt} (100%) rename mods/skinsdb/meta/{character_356.txt => character.356.txt} (100%) rename mods/skinsdb/meta/{character_357.txt => character.357.txt} (100%) rename mods/skinsdb/meta/{character_359.txt => character.359.txt} (100%) rename mods/skinsdb/meta/{character_36.txt => character.36.txt} (100%) rename mods/skinsdb/meta/{character_361.txt => character.361.txt} (100%) rename mods/skinsdb/meta/{character_362.txt => character.362.txt} (100%) rename mods/skinsdb/meta/{character_363.txt => character.363.txt} (100%) rename mods/skinsdb/meta/{character_364.txt => character.364.txt} (100%) rename mods/skinsdb/meta/{character_365.txt => character.365.txt} (100%) rename mods/skinsdb/meta/{character_366.txt => character.366.txt} (100%) rename mods/skinsdb/meta/{character_367.txt => character.367.txt} (100%) rename mods/skinsdb/meta/{character_368.txt => character.368.txt} (100%) rename mods/skinsdb/meta/{character_369.txt => character.369.txt} (100%) rename mods/skinsdb/meta/{character_37.txt => character.37.txt} (100%) rename mods/skinsdb/meta/{character_370.txt => character.370.txt} (100%) rename mods/skinsdb/meta/{character_371.txt => character.371.txt} (100%) rename mods/skinsdb/meta/{character_372.txt => character.372.txt} (100%) rename mods/skinsdb/meta/{character_373.txt => character.373.txt} (100%) rename mods/skinsdb/meta/{character_374.txt => character.374.txt} (100%) rename mods/skinsdb/meta/{character_375.txt => character.375.txt} (100%) rename mods/skinsdb/meta/{character_376.txt => character.376.txt} (100%) rename mods/skinsdb/meta/{character_377.txt => character.377.txt} (100%) rename mods/skinsdb/meta/{character_378.txt => character.378.txt} (100%) rename mods/skinsdb/meta/{character_379.txt => character.379.txt} (100%) rename mods/skinsdb/meta/{character_380.txt => character.380.txt} (100%) rename mods/skinsdb/meta/{character_381.txt => character.381.txt} (100%) rename mods/skinsdb/meta/{character_382.txt => character.382.txt} (100%) rename mods/skinsdb/meta/{character_383.txt => character.383.txt} (100%) rename mods/skinsdb/meta/{character_384.txt => character.384.txt} (100%) rename mods/skinsdb/meta/{character_385.txt => character.385.txt} (100%) rename mods/skinsdb/meta/{character_387.txt => character.387.txt} (100%) rename mods/skinsdb/meta/{character_389.txt => character.389.txt} (100%) rename mods/skinsdb/meta/{character_390.txt => character.390.txt} (100%) rename mods/skinsdb/meta/{character_392.txt => character.392.txt} (100%) rename mods/skinsdb/meta/{character_393.txt => character.393.txt} (100%) rename mods/skinsdb/meta/{character_396.txt => character.396.txt} (100%) rename mods/skinsdb/meta/{character_399.txt => character.399.txt} (100%) rename mods/skinsdb/meta/{character_4.txt => character.4.txt} (100%) rename mods/skinsdb/meta/{character_400.txt => character.400.txt} (100%) rename mods/skinsdb/meta/{character_401.txt => character.401.txt} (100%) rename mods/skinsdb/meta/{character_402.txt => character.402.txt} (100%) rename mods/skinsdb/meta/{character_403.txt => character.403.txt} (100%) rename mods/skinsdb/meta/{character_404.txt => character.404.txt} (100%) rename mods/skinsdb/meta/{character_405.txt => character.405.txt} (100%) rename mods/skinsdb/meta/{character_406.txt => character.406.txt} (100%) rename mods/skinsdb/meta/{character_407.txt => character.407.txt} (100%) rename mods/skinsdb/meta/{character_408.txt => character.408.txt} (100%) rename mods/skinsdb/meta/{character_409.txt => character.409.txt} (100%) rename mods/skinsdb/meta/{character_410.txt => character.410.txt} (100%) rename mods/skinsdb/meta/{character_411.txt => character.411.txt} (100%) rename mods/skinsdb/meta/{character_412.txt => character.412.txt} (100%) rename mods/skinsdb/meta/{character_413.txt => character.413.txt} (100%) rename mods/skinsdb/meta/{character_414.txt => character.414.txt} (100%) rename mods/skinsdb/meta/{character_415.txt => character.415.txt} (100%) rename mods/skinsdb/meta/{character_416.txt => character.416.txt} (100%) rename mods/skinsdb/meta/{character_417.txt => character.417.txt} (100%) rename mods/skinsdb/meta/{character_418.txt => character.418.txt} (100%) rename mods/skinsdb/meta/{character_419.txt => character.419.txt} (100%) rename mods/skinsdb/meta/{character_420.txt => character.420.txt} (100%) rename mods/skinsdb/meta/{character_421.txt => character.421.txt} (100%) rename mods/skinsdb/meta/{character_428.txt => character.428.txt} (100%) rename mods/skinsdb/meta/{character_429.txt => character.429.txt} (100%) rename mods/skinsdb/meta/{character_430.txt => character.430.txt} (100%) rename mods/skinsdb/meta/{character_431.txt => character.431.txt} (100%) rename mods/skinsdb/meta/{character_432.txt => character.432.txt} (100%) rename mods/skinsdb/meta/{character_433.txt => character.433.txt} (100%) rename mods/skinsdb/meta/{character_434.txt => character.434.txt} (100%) rename mods/skinsdb/meta/{character_435.txt => character.435.txt} (100%) rename mods/skinsdb/meta/{character_436.txt => character.436.txt} (100%) rename mods/skinsdb/meta/{character_437.txt => character.437.txt} (100%) rename mods/skinsdb/meta/{character_438.txt => character.438.txt} (100%) rename mods/skinsdb/meta/{character_439.txt => character.439.txt} (100%) rename mods/skinsdb/meta/{character_440.txt => character.440.txt} (100%) rename mods/skinsdb/meta/{character_441.txt => character.441.txt} (100%) rename mods/skinsdb/meta/{character_442.txt => character.442.txt} (100%) rename mods/skinsdb/meta/{character_443.txt => character.443.txt} (100%) rename mods/skinsdb/meta/{character_444.txt => character.444.txt} (100%) rename mods/skinsdb/meta/{character_445.txt => character.445.txt} (100%) rename mods/skinsdb/meta/{character_446.txt => character.446.txt} (100%) rename mods/skinsdb/meta/{character_447.txt => character.447.txt} (100%) rename mods/skinsdb/meta/{character_448.txt => character.448.txt} (100%) rename mods/skinsdb/meta/{character_449.txt => character.449.txt} (100%) rename mods/skinsdb/meta/{character_450.txt => character.450.txt} (100%) rename mods/skinsdb/meta/{character_451.txt => character.451.txt} (100%) rename mods/skinsdb/meta/{character_452.txt => character.452.txt} (100%) rename mods/skinsdb/meta/{character_453.txt => character.453.txt} (100%) rename mods/skinsdb/meta/{character_454.txt => character.454.txt} (100%) rename mods/skinsdb/meta/{character_456.txt => character.456.txt} (100%) rename mods/skinsdb/meta/{character_457.txt => character.457.txt} (100%) rename mods/skinsdb/meta/{character_458.txt => character.458.txt} (100%) rename mods/skinsdb/meta/{character_459.txt => character.459.txt} (100%) rename mods/skinsdb/meta/{character_460.txt => character.460.txt} (100%) rename mods/skinsdb/meta/{character_461.txt => character.461.txt} (100%) rename mods/skinsdb/meta/{character_462.txt => character.462.txt} (100%) rename mods/skinsdb/meta/{character_463.txt => character.463.txt} (100%) rename mods/skinsdb/meta/{character_464.txt => character.464.txt} (100%) rename mods/skinsdb/meta/{character_465.txt => character.465.txt} (100%) rename mods/skinsdb/meta/{character_466.txt => character.466.txt} (100%) rename mods/skinsdb/meta/{character_467.txt => character.467.txt} (100%) rename mods/skinsdb/meta/{character_468.txt => character.468.txt} (100%) rename mods/skinsdb/meta/{character_469.txt => character.469.txt} (100%) rename mods/skinsdb/meta/{character_470.txt => character.470.txt} (100%) rename mods/skinsdb/meta/{character_471.txt => character.471.txt} (100%) rename mods/skinsdb/meta/{character_473.txt => character.473.txt} (100%) rename mods/skinsdb/meta/{character_474.txt => character.474.txt} (100%) rename mods/skinsdb/meta/{character_475.txt => character.475.txt} (100%) rename mods/skinsdb/meta/{character_476.txt => character.476.txt} (100%) rename mods/skinsdb/meta/{character_477.txt => character.477.txt} (100%) rename mods/skinsdb/meta/{character_478.txt => character.478.txt} (100%) rename mods/skinsdb/meta/{character_479.txt => character.479.txt} (100%) rename mods/skinsdb/meta/{character_480.txt => character.480.txt} (100%) rename mods/skinsdb/meta/{character_482.txt => character.482.txt} (100%) rename mods/skinsdb/meta/{character_483.txt => character.483.txt} (100%) rename mods/skinsdb/meta/{character_484.txt => character.484.txt} (100%) rename mods/skinsdb/meta/{character_485.txt => character.485.txt} (100%) rename mods/skinsdb/meta/{character_486.txt => character.486.txt} (100%) rename mods/skinsdb/meta/{character_487.txt => character.487.txt} (100%) rename mods/skinsdb/meta/{character_488.txt => character.488.txt} (100%) rename mods/skinsdb/meta/{character_489.txt => character.489.txt} (100%) rename mods/skinsdb/meta/{character_490.txt => character.490.txt} (100%) rename mods/skinsdb/meta/{character_491.txt => character.491.txt} (100%) rename mods/skinsdb/meta/{character_492.txt => character.492.txt} (100%) rename mods/skinsdb/meta/{character_493.txt => character.493.txt} (100%) rename mods/skinsdb/meta/{character_494.txt => character.494.txt} (100%) rename mods/skinsdb/meta/{character_495.txt => character.495.txt} (100%) rename mods/skinsdb/meta/{character_496.txt => character.496.txt} (100%) rename mods/skinsdb/meta/{character_497.txt => character.497.txt} (100%) rename mods/skinsdb/meta/{character_498.txt => character.498.txt} (100%) rename mods/skinsdb/meta/{character_5.txt => character.5.txt} (100%) rename mods/skinsdb/meta/{character_50.txt => character.50.txt} (100%) rename mods/skinsdb/meta/{character_500.txt => character.500.txt} (100%) rename mods/skinsdb/meta/{character_501.txt => character.501.txt} (100%) rename mods/skinsdb/meta/{character_502.txt => character.502.txt} (100%) rename mods/skinsdb/meta/{character_503.txt => character.503.txt} (100%) rename mods/skinsdb/meta/{character_504.txt => character.504.txt} (100%) rename mods/skinsdb/meta/{character_505.txt => character.505.txt} (100%) rename mods/skinsdb/meta/{character_507.txt => character.507.txt} (100%) rename mods/skinsdb/meta/{character_510.txt => character.510.txt} (100%) rename mods/skinsdb/meta/{character_511.txt => character.511.txt} (100%) rename mods/skinsdb/meta/{character_512.txt => character.512.txt} (100%) rename mods/skinsdb/meta/{character_513.txt => character.513.txt} (100%) rename mods/skinsdb/meta/{character_514.txt => character.514.txt} (100%) rename mods/skinsdb/meta/{character_515.txt => character.515.txt} (100%) rename mods/skinsdb/meta/{character_516.txt => character.516.txt} (100%) rename mods/skinsdb/meta/{character_517.txt => character.517.txt} (100%) rename mods/skinsdb/meta/{character_518.txt => character.518.txt} (100%) rename mods/skinsdb/meta/{character_519.txt => character.519.txt} (100%) rename mods/skinsdb/meta/{character_52.txt => character.52.txt} (100%) rename mods/skinsdb/meta/{character_520.txt => character.520.txt} (100%) rename mods/skinsdb/meta/{character_521.txt => character.521.txt} (100%) rename mods/skinsdb/meta/{character_522.txt => character.522.txt} (100%) rename mods/skinsdb/meta/{character_523.txt => character.523.txt} (100%) rename mods/skinsdb/meta/{character_524.txt => character.524.txt} (100%) rename mods/skinsdb/meta/{character_525.txt => character.525.txt} (100%) rename mods/skinsdb/meta/{character_526.txt => character.526.txt} (100%) rename mods/skinsdb/meta/{character_527.txt => character.527.txt} (100%) rename mods/skinsdb/meta/{character_528.txt => character.528.txt} (100%) rename mods/skinsdb/meta/{character_529.txt => character.529.txt} (100%) rename mods/skinsdb/meta/{character_530.txt => character.530.txt} (100%) rename mods/skinsdb/meta/{character_531.txt => character.531.txt} (100%) rename mods/skinsdb/meta/{character_532.txt => character.532.txt} (100%) rename mods/skinsdb/meta/{character_533.txt => character.533.txt} (100%) rename mods/skinsdb/meta/{character_534.txt => character.534.txt} (100%) rename mods/skinsdb/meta/{character_535.txt => character.535.txt} (100%) rename mods/skinsdb/meta/{character_536.txt => character.536.txt} (100%) rename mods/skinsdb/meta/{character_537.txt => character.537.txt} (100%) rename mods/skinsdb/meta/{character_539.txt => character.539.txt} (100%) rename mods/skinsdb/meta/{character_54.txt => character.54.txt} (100%) rename mods/skinsdb/meta/{character_540.txt => character.540.txt} (100%) rename mods/skinsdb/meta/{character_541.txt => character.541.txt} (100%) rename mods/skinsdb/meta/{character_542.txt => character.542.txt} (100%) rename mods/skinsdb/meta/{character_543.txt => character.543.txt} (100%) rename mods/skinsdb/meta/{character_544.txt => character.544.txt} (100%) rename mods/skinsdb/meta/{character_545.txt => character.545.txt} (100%) rename mods/skinsdb/meta/{character_546.txt => character.546.txt} (100%) rename mods/skinsdb/meta/{character_547.txt => character.547.txt} (100%) rename mods/skinsdb/meta/{character_548.txt => character.548.txt} (100%) rename mods/skinsdb/meta/{character_549.txt => character.549.txt} (100%) rename mods/skinsdb/meta/{character_55.txt => character.55.txt} (100%) rename mods/skinsdb/meta/{character_550.txt => character.550.txt} (100%) rename mods/skinsdb/meta/{character_551.txt => character.551.txt} (100%) rename mods/skinsdb/meta/{character_552.txt => character.552.txt} (100%) rename mods/skinsdb/meta/{character_553.txt => character.553.txt} (100%) rename mods/skinsdb/meta/{character_554.txt => character.554.txt} (100%) rename mods/skinsdb/meta/{character_555.txt => character.555.txt} (100%) rename mods/skinsdb/meta/{character_556.txt => character.556.txt} (100%) rename mods/skinsdb/meta/{character_558.txt => character.558.txt} (100%) rename mods/skinsdb/meta/{character_559.txt => character.559.txt} (100%) rename mods/skinsdb/meta/{character_560.txt => character.560.txt} (100%) rename mods/skinsdb/meta/{character_561.txt => character.561.txt} (100%) rename mods/skinsdb/meta/{character_562.txt => character.562.txt} (100%) rename mods/skinsdb/meta/{character_563.txt => character.563.txt} (100%) rename mods/skinsdb/meta/{character_564.txt => character.564.txt} (100%) rename mods/skinsdb/meta/{character_565.txt => character.565.txt} (100%) rename mods/skinsdb/meta/{character_567.txt => character.567.txt} (100%) rename mods/skinsdb/meta/{character_57.txt => character.57.txt} (100%) rename mods/skinsdb/meta/{character_570.txt => character.570.txt} (100%) rename mods/skinsdb/meta/{character_571.txt => character.571.txt} (100%) rename mods/skinsdb/meta/{character_572.txt => character.572.txt} (100%) rename mods/skinsdb/meta/{character_573.txt => character.573.txt} (100%) rename mods/skinsdb/meta/{character_575.txt => character.575.txt} (100%) rename mods/skinsdb/meta/{character_576.txt => character.576.txt} (100%) rename mods/skinsdb/meta/{character_577.txt => character.577.txt} (100%) rename mods/skinsdb/meta/{character_578.txt => character.578.txt} (100%) rename mods/skinsdb/meta/{character_579.txt => character.579.txt} (100%) rename mods/skinsdb/meta/{character_580.txt => character.580.txt} (100%) rename mods/skinsdb/meta/{character_581.txt => character.581.txt} (100%) rename mods/skinsdb/meta/{character_582.txt => character.582.txt} (100%) rename mods/skinsdb/meta/{character_583.txt => character.583.txt} (100%) rename mods/skinsdb/meta/{character_584.txt => character.584.txt} (100%) rename mods/skinsdb/meta/{character_585.txt => character.585.txt} (100%) rename mods/skinsdb/meta/{character_586.txt => character.586.txt} (100%) rename mods/skinsdb/meta/{character_587.txt => character.587.txt} (100%) rename mods/skinsdb/meta/{character_588.txt => character.588.txt} (100%) rename mods/skinsdb/meta/{character_589.txt => character.589.txt} (100%) rename mods/skinsdb/meta/{character_590.txt => character.590.txt} (100%) rename mods/skinsdb/meta/{character_591.txt => character.591.txt} (100%) rename mods/skinsdb/meta/{character_592.txt => character.592.txt} (100%) create mode 100644 mods/skinsdb/meta/character.593.txt rename mods/skinsdb/meta/{character_594.txt => character.594.txt} (100%) rename mods/skinsdb/meta/{character_595.txt => character.595.txt} (100%) rename mods/skinsdb/meta/{character_596.txt => character.596.txt} (100%) rename mods/skinsdb/meta/{character_597.txt => character.597.txt} (100%) rename mods/skinsdb/meta/{character_598.txt => character.598.txt} (100%) rename mods/skinsdb/meta/{character_599.txt => character.599.txt} (100%) rename mods/skinsdb/meta/{character_6.txt => character.6.txt} (100%) rename mods/skinsdb/meta/{character_600.txt => character.600.txt} (100%) rename mods/skinsdb/meta/{character_601.txt => character.601.txt} (100%) rename mods/skinsdb/meta/{character_602.txt => character.602.txt} (100%) rename mods/skinsdb/meta/{character_603.txt => character.603.txt} (100%) rename mods/skinsdb/meta/{character_604.txt => character.604.txt} (100%) rename mods/skinsdb/meta/{character_605.txt => character.605.txt} (100%) rename mods/skinsdb/meta/{character_606.txt => character.606.txt} (100%) rename mods/skinsdb/meta/{character_607.txt => character.607.txt} (100%) rename mods/skinsdb/meta/{character_608.txt => character.608.txt} (100%) rename mods/skinsdb/meta/{character_609.txt => character.609.txt} (100%) rename mods/skinsdb/meta/{character_61.txt => character.61.txt} (100%) rename mods/skinsdb/meta/{character_610.txt => character.610.txt} (100%) rename mods/skinsdb/meta/{character_611.txt => character.611.txt} (100%) rename mods/skinsdb/meta/{character_612.txt => character.612.txt} (100%) rename mods/skinsdb/meta/{character_613.txt => character.613.txt} (100%) rename mods/skinsdb/meta/{character_614.txt => character.614.txt} (100%) rename mods/skinsdb/meta/{character_615.txt => character.615.txt} (100%) rename mods/skinsdb/meta/{character_616.txt => character.616.txt} (100%) rename mods/skinsdb/meta/{character_618.txt => character.618.txt} (100%) rename mods/skinsdb/meta/{character_619.txt => character.619.txt} (100%) rename mods/skinsdb/meta/{character_620.txt => character.620.txt} (100%) rename mods/skinsdb/meta/{character_621.txt => character.621.txt} (100%) rename mods/skinsdb/meta/{character_622.txt => character.622.txt} (100%) rename mods/skinsdb/meta/{character_623.txt => character.623.txt} (100%) rename mods/skinsdb/meta/{character_624.txt => character.624.txt} (100%) rename mods/skinsdb/meta/{character_625.txt => character.625.txt} (100%) rename mods/skinsdb/meta/{character_626.txt => character.626.txt} (100%) rename mods/skinsdb/meta/{character_627.txt => character.627.txt} (100%) rename mods/skinsdb/meta/{character_628.txt => character.628.txt} (100%) rename mods/skinsdb/meta/{character_629.txt => character.629.txt} (100%) rename mods/skinsdb/meta/{character_630.txt => character.630.txt} (100%) rename mods/skinsdb/meta/{character_631.txt => character.631.txt} (100%) rename mods/skinsdb/meta/{character_632.txt => character.632.txt} (100%) rename mods/skinsdb/meta/{character_633.txt => character.633.txt} (100%) rename mods/skinsdb/meta/{character_634.txt => character.634.txt} (100%) rename mods/skinsdb/meta/{character_635.txt => character.635.txt} (100%) rename mods/skinsdb/meta/{character_636.txt => character.636.txt} (100%) rename mods/skinsdb/meta/{character_637.txt => character.637.txt} (100%) rename mods/skinsdb/meta/{character_638.txt => character.638.txt} (100%) rename mods/skinsdb/meta/{character_639.txt => character.639.txt} (100%) rename mods/skinsdb/meta/{character_640.txt => character.640.txt} (100%) rename mods/skinsdb/meta/{character_641.txt => character.641.txt} (100%) rename mods/skinsdb/meta/{character_642.txt => character.642.txt} (100%) rename mods/skinsdb/meta/{character_643.txt => character.643.txt} (100%) rename mods/skinsdb/meta/{character_644.txt => character.644.txt} (100%) rename mods/skinsdb/meta/{character_645.txt => character.645.txt} (100%) rename mods/skinsdb/meta/{character_646.txt => character.646.txt} (100%) rename mods/skinsdb/meta/{character_647.txt => character.647.txt} (100%) create mode 100644 mods/skinsdb/meta/character.648.txt rename mods/skinsdb/meta/{character_649.txt => character.649.txt} (100%) rename mods/skinsdb/meta/{character_650.txt => character.650.txt} (100%) rename mods/skinsdb/meta/{character_651.txt => character.651.txt} (100%) rename mods/skinsdb/meta/{character_652.txt => character.652.txt} (100%) rename mods/skinsdb/meta/{character_656.txt => character.656.txt} (100%) rename mods/skinsdb/meta/{character_657.txt => character.657.txt} (100%) rename mods/skinsdb/meta/{character_658.txt => character.658.txt} (100%) rename mods/skinsdb/meta/{character_659.txt => character.659.txt} (100%) rename mods/skinsdb/meta/{character_660.txt => character.660.txt} (100%) rename mods/skinsdb/meta/{character_661.txt => character.661.txt} (100%) rename mods/skinsdb/meta/{character_662.txt => character.662.txt} (100%) rename mods/skinsdb/meta/{character_663.txt => character.663.txt} (100%) rename mods/skinsdb/meta/{character_664.txt => character.664.txt} (100%) rename mods/skinsdb/meta/{character_666.txt => character.666.txt} (100%) rename mods/skinsdb/meta/{character_667.txt => character.667.txt} (100%) rename mods/skinsdb/meta/{character_668.txt => character.668.txt} (100%) rename mods/skinsdb/meta/{character_669.txt => character.669.txt} (100%) rename mods/skinsdb/meta/{character_670.txt => character.670.txt} (100%) rename mods/skinsdb/meta/{character_671.txt => character.671.txt} (100%) rename mods/skinsdb/meta/{character_672.txt => character.672.txt} (100%) rename mods/skinsdb/meta/{character_673.txt => character.673.txt} (100%) rename mods/skinsdb/meta/{character_674.txt => character.674.txt} (100%) rename mods/skinsdb/meta/{character_675.txt => character.675.txt} (100%) rename mods/skinsdb/meta/{character_676.txt => character.676.txt} (100%) rename mods/skinsdb/meta/{character_677.txt => character.677.txt} (100%) rename mods/skinsdb/meta/{character_678.txt => character.678.txt} (100%) rename mods/skinsdb/meta/{character_679.txt => character.679.txt} (100%) rename mods/skinsdb/meta/{character_680.txt => character.680.txt} (100%) rename mods/skinsdb/meta/{character_681.txt => character.681.txt} (100%) rename mods/skinsdb/meta/{character_682.txt => character.682.txt} (100%) rename mods/skinsdb/meta/{character_683.txt => character.683.txt} (100%) rename mods/skinsdb/meta/{character_684.txt => character.684.txt} (100%) rename mods/skinsdb/meta/{character_685.txt => character.685.txt} (100%) rename mods/skinsdb/meta/{character_686.txt => character.686.txt} (100%) rename mods/skinsdb/meta/{character_687.txt => character.687.txt} (100%) rename mods/skinsdb/meta/{character_688.txt => character.688.txt} (100%) rename mods/skinsdb/meta/{character_689.txt => character.689.txt} (100%) rename mods/skinsdb/meta/{character_69.txt => character.69.txt} (100%) rename mods/skinsdb/meta/{character_690.txt => character.690.txt} (100%) rename mods/skinsdb/meta/{character_691.txt => character.691.txt} (100%) rename mods/skinsdb/meta/{character_692.txt => character.692.txt} (100%) rename mods/skinsdb/meta/{character_693.txt => character.693.txt} (100%) rename mods/skinsdb/meta/{character_694.txt => character.694.txt} (100%) rename mods/skinsdb/meta/{character_695.txt => character.695.txt} (100%) rename mods/skinsdb/meta/{character_696.txt => character.696.txt} (100%) rename mods/skinsdb/meta/{character_697.txt => character.697.txt} (100%) rename mods/skinsdb/meta/{character_698.txt => character.698.txt} (100%) rename mods/skinsdb/meta/{character_699.txt => character.699.txt} (100%) rename mods/skinsdb/meta/{character_7.txt => character.7.txt} (100%) rename mods/skinsdb/meta/{character_70.txt => character.70.txt} (100%) rename mods/skinsdb/meta/{character_700.txt => character.700.txt} (100%) rename mods/skinsdb/meta/{character_701.txt => character.701.txt} (100%) rename mods/skinsdb/meta/{character_702.txt => character.702.txt} (100%) rename mods/skinsdb/meta/{character_703.txt => character.703.txt} (100%) rename mods/skinsdb/meta/{character_704.txt => character.704.txt} (100%) rename mods/skinsdb/meta/{character_705.txt => character.705.txt} (100%) rename mods/skinsdb/meta/{character_706.txt => character.706.txt} (100%) rename mods/skinsdb/meta/{character_707.txt => character.707.txt} (100%) rename mods/skinsdb/meta/{character_708.txt => character.708.txt} (100%) rename mods/skinsdb/meta/{character_709.txt => character.709.txt} (100%) rename mods/skinsdb/meta/{character_71.txt => character.71.txt} (100%) rename mods/skinsdb/meta/{character_710.txt => character.710.txt} (100%) rename mods/skinsdb/meta/{character_711.txt => character.711.txt} (100%) rename mods/skinsdb/meta/{character_712.txt => character.712.txt} (100%) rename mods/skinsdb/meta/{character_713.txt => character.713.txt} (100%) rename mods/skinsdb/meta/{character_714.txt => character.714.txt} (100%) rename mods/skinsdb/meta/{character_715.txt => character.715.txt} (100%) rename mods/skinsdb/meta/{character_716.txt => character.716.txt} (100%) rename mods/skinsdb/meta/{character_717.txt => character.717.txt} (100%) rename mods/skinsdb/meta/{character_718.txt => character.718.txt} (100%) rename mods/skinsdb/meta/{character_72.txt => character.72.txt} (100%) rename mods/skinsdb/meta/{character_720.txt => character.720.txt} (100%) rename mods/skinsdb/meta/{character_721.txt => character.721.txt} (100%) rename mods/skinsdb/meta/{character_723.txt => character.723.txt} (100%) rename mods/skinsdb/meta/{character_724.txt => character.724.txt} (100%) rename mods/skinsdb/meta/{character_725.txt => character.725.txt} (100%) rename mods/skinsdb/meta/{character_726.txt => character.726.txt} (100%) rename mods/skinsdb/meta/{character_727.txt => character.727.txt} (100%) rename mods/skinsdb/meta/{character_728.txt => character.728.txt} (100%) rename mods/skinsdb/meta/{character_729.txt => character.729.txt} (100%) rename mods/skinsdb/meta/{character_73.txt => character.73.txt} (100%) rename mods/skinsdb/meta/{character_730.txt => character.730.txt} (100%) rename mods/skinsdb/meta/{character_731.txt => character.731.txt} (100%) rename mods/skinsdb/meta/{character_732.txt => character.732.txt} (100%) rename mods/skinsdb/meta/{character_734.txt => character.734.txt} (100%) rename mods/skinsdb/meta/{character_735.txt => character.735.txt} (100%) rename mods/skinsdb/meta/{character_736.txt => character.736.txt} (100%) rename mods/skinsdb/meta/{character_737.txt => character.737.txt} (100%) rename mods/skinsdb/meta/{character_738.txt => character.738.txt} (100%) rename mods/skinsdb/meta/{character_739.txt => character.739.txt} (100%) rename mods/skinsdb/meta/{character_74.txt => character.74.txt} (100%) rename mods/skinsdb/meta/{character_740.txt => character.740.txt} (100%) rename mods/skinsdb/meta/{character_741.txt => character.741.txt} (100%) rename mods/skinsdb/meta/{character_742.txt => character.742.txt} (100%) rename mods/skinsdb/meta/{character_743.txt => character.743.txt} (100%) rename mods/skinsdb/meta/{character_744.txt => character.744.txt} (100%) rename mods/skinsdb/meta/{character_745.txt => character.745.txt} (100%) rename mods/skinsdb/meta/{character_746.txt => character.746.txt} (100%) rename mods/skinsdb/meta/{character_747.txt => character.747.txt} (100%) rename mods/skinsdb/meta/{character_748.txt => character.748.txt} (100%) rename mods/skinsdb/meta/{character_749.txt => character.749.txt} (100%) rename mods/skinsdb/meta/{character_75.txt => character.75.txt} (100%) rename mods/skinsdb/meta/{character_750.txt => character.750.txt} (100%) rename mods/skinsdb/meta/{character_751.txt => character.751.txt} (100%) rename mods/skinsdb/meta/{character_752.txt => character.752.txt} (100%) rename mods/skinsdb/meta/{character_753.txt => character.753.txt} (100%) rename mods/skinsdb/meta/{character_754.txt => character.754.txt} (100%) rename mods/skinsdb/meta/{character_755.txt => character.755.txt} (100%) rename mods/skinsdb/meta/{character_756.txt => character.756.txt} (100%) rename mods/skinsdb/meta/{character_757.txt => character.757.txt} (100%) rename mods/skinsdb/meta/{character_758.txt => character.758.txt} (100%) rename mods/skinsdb/meta/{character_759.txt => character.759.txt} (100%) rename mods/skinsdb/meta/{character_76.txt => character.76.txt} (100%) rename mods/skinsdb/meta/{character_760.txt => character.760.txt} (100%) rename mods/skinsdb/meta/{character_761.txt => character.761.txt} (100%) rename mods/skinsdb/meta/{character_762.txt => character.762.txt} (100%) rename mods/skinsdb/meta/{character_763.txt => character.763.txt} (100%) rename mods/skinsdb/meta/{character_764.txt => character.764.txt} (100%) rename mods/skinsdb/meta/{character_765.txt => character.765.txt} (100%) rename mods/skinsdb/meta/{character_766.txt => character.766.txt} (100%) rename mods/skinsdb/meta/{character_767.txt => character.767.txt} (100%) rename mods/skinsdb/meta/{character_768.txt => character.768.txt} (100%) rename mods/skinsdb/meta/{character_769.txt => character.769.txt} (100%) rename mods/skinsdb/meta/{character_77.txt => character.77.txt} (100%) rename mods/skinsdb/meta/{character_770.txt => character.770.txt} (100%) rename mods/skinsdb/meta/{character_771.txt => character.771.txt} (100%) rename mods/skinsdb/meta/{character_772.txt => character.772.txt} (100%) rename mods/skinsdb/meta/{character_773.txt => character.773.txt} (100%) rename mods/skinsdb/meta/{character_774.txt => character.774.txt} (100%) rename mods/skinsdb/meta/{character_775.txt => character.775.txt} (100%) rename mods/skinsdb/meta/{character_776.txt => character.776.txt} (100%) rename mods/skinsdb/meta/{character_777.txt => character.777.txt} (100%) rename mods/skinsdb/meta/{character_778.txt => character.778.txt} (100%) rename mods/skinsdb/meta/{character_779.txt => character.779.txt} (100%) rename mods/skinsdb/meta/{character_78.txt => character.78.txt} (100%) rename mods/skinsdb/meta/{character_780.txt => character.780.txt} (100%) rename mods/skinsdb/meta/{character_781.txt => character.781.txt} (100%) rename mods/skinsdb/meta/{character_782.txt => character.782.txt} (100%) rename mods/skinsdb/meta/{character_783.txt => character.783.txt} (100%) rename mods/skinsdb/meta/{character_784.txt => character.784.txt} (100%) rename mods/skinsdb/meta/{character_785.txt => character.785.txt} (100%) rename mods/skinsdb/meta/{character_786.txt => character.786.txt} (100%) rename mods/skinsdb/meta/{character_787.txt => character.787.txt} (100%) rename mods/skinsdb/meta/{character_788.txt => character.788.txt} (100%) rename mods/skinsdb/meta/{character_789.txt => character.789.txt} (100%) rename mods/skinsdb/meta/{character_790.txt => character.790.txt} (100%) rename mods/skinsdb/meta/{character_791.txt => character.791.txt} (100%) rename mods/skinsdb/meta/{character_792.txt => character.792.txt} (100%) rename mods/skinsdb/meta/{character_793.txt => character.793.txt} (100%) rename mods/skinsdb/meta/{character_794.txt => character.794.txt} (100%) rename mods/skinsdb/meta/{character_795.txt => character.795.txt} (100%) rename mods/skinsdb/meta/{character_796.txt => character.796.txt} (100%) rename mods/skinsdb/meta/{character_797.txt => character.797.txt} (100%) rename mods/skinsdb/meta/{character_798.txt => character.798.txt} (100%) rename mods/skinsdb/meta/{character_799.txt => character.799.txt} (100%) rename mods/skinsdb/meta/{character_8.txt => character.8.txt} (100%) rename mods/skinsdb/meta/{character_80.txt => character.80.txt} (100%) rename mods/skinsdb/meta/{character_800.txt => character.800.txt} (100%) rename mods/skinsdb/meta/{character_801.txt => character.801.txt} (100%) rename mods/skinsdb/meta/{character_802.txt => character.802.txt} (100%) rename mods/skinsdb/meta/{character_803.txt => character.803.txt} (100%) rename mods/skinsdb/meta/{character_804.txt => character.804.txt} (100%) rename mods/skinsdb/meta/{character_805.txt => character.805.txt} (100%) rename mods/skinsdb/meta/{character_806.txt => character.806.txt} (100%) rename mods/skinsdb/meta/{character_807.txt => character.807.txt} (100%) rename mods/skinsdb/meta/{character_808.txt => character.808.txt} (100%) rename mods/skinsdb/meta/{character_809.txt => character.809.txt} (100%) rename mods/skinsdb/meta/{character_81.txt => character.81.txt} (100%) rename mods/skinsdb/meta/{character_810.txt => character.810.txt} (100%) rename mods/skinsdb/meta/{character_811.txt => character.811.txt} (100%) rename mods/skinsdb/meta/{character_812.txt => character.812.txt} (100%) rename mods/skinsdb/meta/{character_813.txt => character.813.txt} (100%) rename mods/skinsdb/meta/{character_814.txt => character.814.txt} (100%) rename mods/skinsdb/meta/{character_815.txt => character.815.txt} (100%) rename mods/skinsdb/meta/{character_816.txt => character.816.txt} (100%) rename mods/skinsdb/meta/{character_817.txt => character.817.txt} (100%) rename mods/skinsdb/meta/{character_818.txt => character.818.txt} (100%) rename mods/skinsdb/meta/{character_819.txt => character.819.txt} (100%) rename mods/skinsdb/meta/{character_82.txt => character.82.txt} (100%) rename mods/skinsdb/meta/{character_821.txt => character.821.txt} (100%) rename mods/skinsdb/meta/{character_822.txt => character.822.txt} (100%) rename mods/skinsdb/meta/{character_823.txt => character.823.txt} (100%) rename mods/skinsdb/meta/{character_824.txt => character.824.txt} (100%) rename mods/skinsdb/meta/{character_827.txt => character.827.txt} (100%) rename mods/skinsdb/meta/{character_828.txt => character.828.txt} (100%) rename mods/skinsdb/meta/{character_829.txt => character.829.txt} (100%) rename mods/skinsdb/meta/{character_83.txt => character.83.txt} (100%) rename mods/skinsdb/meta/{character_830.txt => character.830.txt} (100%) rename mods/skinsdb/meta/{character_831.txt => character.831.txt} (100%) rename mods/skinsdb/meta/{character_832.txt => character.832.txt} (100%) rename mods/skinsdb/meta/{character_833.txt => character.833.txt} (100%) rename mods/skinsdb/meta/{character_834.txt => character.834.txt} (100%) rename mods/skinsdb/meta/{character_835.txt => character.835.txt} (100%) rename mods/skinsdb/meta/{character_836.txt => character.836.txt} (100%) rename mods/skinsdb/meta/{character_837.txt => character.837.txt} (100%) rename mods/skinsdb/meta/{character_838.txt => character.838.txt} (100%) rename mods/skinsdb/meta/{character_839.txt => character.839.txt} (100%) rename mods/skinsdb/meta/{character_84.txt => character.84.txt} (100%) rename mods/skinsdb/meta/{character_841.txt => character.841.txt} (100%) rename mods/skinsdb/meta/{character_843.txt => character.843.txt} (100%) rename mods/skinsdb/meta/{character_844.txt => character.844.txt} (100%) rename mods/skinsdb/meta/{character_845.txt => character.845.txt} (100%) rename mods/skinsdb/meta/{character_846.txt => character.846.txt} (100%) rename mods/skinsdb/meta/{character_847.txt => character.847.txt} (100%) rename mods/skinsdb/meta/{character_848.txt => character.848.txt} (100%) rename mods/skinsdb/meta/{character_85.txt => character.85.txt} (100%) rename mods/skinsdb/meta/{character_850.txt => character.850.txt} (100%) rename mods/skinsdb/meta/{character_851.txt => character.851.txt} (100%) rename mods/skinsdb/meta/{character_852.txt => character.852.txt} (100%) rename mods/skinsdb/meta/{character_853.txt => character.853.txt} (100%) rename mods/skinsdb/meta/{character_855.txt => character.855.txt} (100%) rename mods/skinsdb/meta/{character_856.txt => character.856.txt} (100%) rename mods/skinsdb/meta/{character_857.txt => character.857.txt} (100%) rename mods/skinsdb/meta/{character_859.txt => character.859.txt} (100%) rename mods/skinsdb/meta/{character_860.txt => character.860.txt} (100%) rename mods/skinsdb/meta/{character_861.txt => character.861.txt} (100%) rename mods/skinsdb/meta/{character_862.txt => character.862.txt} (100%) rename mods/skinsdb/meta/{character_863.txt => character.863.txt} (100%) rename mods/skinsdb/meta/{character_864.txt => character.864.txt} (100%) rename mods/skinsdb/meta/{character_865.txt => character.865.txt} (100%) rename mods/skinsdb/meta/{character_866.txt => character.866.txt} (100%) rename mods/skinsdb/meta/{character_869.txt => character.869.txt} (100%) rename mods/skinsdb/meta/{character_87.txt => character.87.txt} (100%) rename mods/skinsdb/meta/{character_870.txt => character.870.txt} (100%) rename mods/skinsdb/meta/{character_871.txt => character.871.txt} (100%) rename mods/skinsdb/meta/{character_874.txt => character.874.txt} (100%) rename mods/skinsdb/meta/{character_877.txt => character.877.txt} (100%) rename mods/skinsdb/meta/{character_878.txt => character.878.txt} (100%) rename mods/skinsdb/meta/{character_879.txt => character.879.txt} (100%) rename mods/skinsdb/meta/{character_88.txt => character.88.txt} (100%) rename mods/skinsdb/meta/{character_880.txt => character.880.txt} (100%) rename mods/skinsdb/meta/{character_881.txt => character.881.txt} (100%) rename mods/skinsdb/meta/{character_882.txt => character.882.txt} (100%) rename mods/skinsdb/meta/{character_883.txt => character.883.txt} (100%) rename mods/skinsdb/meta/{character_884.txt => character.884.txt} (100%) rename mods/skinsdb/meta/{character_885.txt => character.885.txt} (100%) rename mods/skinsdb/meta/{character_886.txt => character.886.txt} (100%) rename mods/skinsdb/meta/{character_887.txt => character.887.txt} (100%) rename mods/skinsdb/meta/{character_888.txt => character.888.txt} (100%) rename mods/skinsdb/meta/{character_889.txt => character.889.txt} (100%) rename mods/skinsdb/meta/{character_89.txt => character.89.txt} (100%) rename mods/skinsdb/meta/{character_890.txt => character.890.txt} (100%) rename mods/skinsdb/meta/{character_891.txt => character.891.txt} (100%) rename mods/skinsdb/meta/{character_893.txt => character.893.txt} (100%) rename mods/skinsdb/meta/{character_894.txt => character.894.txt} (100%) rename mods/skinsdb/meta/{character_895.txt => character.895.txt} (100%) rename mods/skinsdb/meta/{character_896.txt => character.896.txt} (100%) rename mods/skinsdb/meta/{character_897.txt => character.897.txt} (100%) rename mods/skinsdb/meta/{character_898.txt => character.898.txt} (100%) rename mods/skinsdb/meta/{character_899.txt => character.899.txt} (100%) rename mods/skinsdb/meta/{character_9.txt => character.9.txt} (100%) rename mods/skinsdb/meta/{character_900.txt => character.900.txt} (100%) rename mods/skinsdb/meta/{character_901.txt => character.901.txt} (100%) rename mods/skinsdb/meta/{character_902.txt => character.902.txt} (100%) rename mods/skinsdb/meta/{character_903.txt => character.903.txt} (100%) rename mods/skinsdb/meta/{character_904.txt => character.904.txt} (100%) rename mods/skinsdb/meta/{character_905.txt => character.905.txt} (100%) rename mods/skinsdb/meta/{character_906.txt => character.906.txt} (100%) rename mods/skinsdb/meta/{character_907.txt => character.907.txt} (100%) rename mods/skinsdb/meta/{character_908.txt => character.908.txt} (100%) rename mods/skinsdb/meta/{character_909.txt => character.909.txt} (100%) rename mods/skinsdb/meta/{character_910.txt => character.910.txt} (100%) rename mods/skinsdb/meta/{character_911.txt => character.911.txt} (100%) rename mods/skinsdb/meta/{character_912.txt => character.912.txt} (100%) rename mods/skinsdb/meta/{character_913.txt => character.913.txt} (100%) rename mods/skinsdb/meta/{character_914.txt => character.914.txt} (100%) rename mods/skinsdb/meta/{character_915.txt => character.915.txt} (100%) rename mods/skinsdb/meta/{character_916.txt => character.916.txt} (100%) rename mods/skinsdb/meta/{character_917.txt => character.917.txt} (100%) rename mods/skinsdb/meta/{character_918.txt => character.918.txt} (100%) rename mods/skinsdb/meta/{character_919.txt => character.919.txt} (100%) rename mods/skinsdb/meta/{character_92.txt => character.92.txt} (100%) rename mods/skinsdb/meta/{character_920.txt => character.920.txt} (100%) rename mods/skinsdb/meta/{character_921.txt => character.921.txt} (100%) rename mods/skinsdb/meta/{character_922.txt => character.922.txt} (100%) rename mods/skinsdb/meta/{character_923.txt => character.923.txt} (100%) rename mods/skinsdb/meta/{character_924.txt => character.924.txt} (100%) rename mods/skinsdb/meta/{character_925.txt => character.925.txt} (100%) rename mods/skinsdb/meta/{character_926.txt => character.926.txt} (100%) rename mods/skinsdb/meta/{character_927.txt => character.927.txt} (100%) rename mods/skinsdb/meta/{character_928.txt => character.928.txt} (100%) rename mods/skinsdb/meta/{character_929.txt => character.929.txt} (100%) rename mods/skinsdb/meta/{character_93.txt => character.93.txt} (100%) rename mods/skinsdb/meta/{character_930.txt => character.930.txt} (100%) rename mods/skinsdb/meta/{character_931.txt => character.931.txt} (100%) rename mods/skinsdb/meta/{character_932.txt => character.932.txt} (100%) rename mods/skinsdb/meta/{character_933.txt => character.933.txt} (100%) rename mods/skinsdb/meta/{character_934.txt => character.934.txt} (100%) rename mods/skinsdb/meta/{character_935.txt => character.935.txt} (100%) rename mods/skinsdb/meta/{character_936.txt => character.936.txt} (100%) rename mods/skinsdb/meta/{character_937.txt => character.937.txt} (100%) rename mods/skinsdb/meta/{character_938.txt => character.938.txt} (100%) rename mods/skinsdb/meta/{character_939.txt => character.939.txt} (100%) rename mods/skinsdb/meta/{character_940.txt => character.940.txt} (100%) rename mods/skinsdb/meta/{character_941.txt => character.941.txt} (100%) rename mods/skinsdb/meta/{character_942.txt => character.942.txt} (100%) rename mods/skinsdb/meta/{character_943.txt => character.943.txt} (100%) rename mods/skinsdb/meta/{character_944.txt => character.944.txt} (100%) rename mods/skinsdb/meta/{character_945.txt => character.945.txt} (100%) rename mods/skinsdb/meta/{character_946.txt => character.946.txt} (100%) rename mods/skinsdb/meta/{character_947.txt => character.947.txt} (100%) rename mods/skinsdb/meta/{character_948.txt => character.948.txt} (100%) rename mods/skinsdb/meta/{character_949.txt => character.949.txt} (100%) rename mods/skinsdb/meta/{character_95.txt => character.95.txt} (100%) rename mods/skinsdb/meta/{character_950.txt => character.950.txt} (100%) rename mods/skinsdb/meta/{character_951.txt => character.951.txt} (100%) rename mods/skinsdb/meta/{character_952.txt => character.952.txt} (100%) rename mods/skinsdb/meta/{character_953.txt => character.953.txt} (100%) rename mods/skinsdb/meta/{character_954.txt => character.954.txt} (100%) rename mods/skinsdb/meta/{character_955.txt => character.955.txt} (100%) rename mods/skinsdb/meta/{character_956.txt => character.956.txt} (100%) rename mods/skinsdb/meta/{character_957.txt => character.957.txt} (100%) rename mods/skinsdb/meta/{character_958.txt => character.958.txt} (100%) rename mods/skinsdb/meta/{character_959.txt => character.959.txt} (100%) rename mods/skinsdb/meta/{character_96.txt => character.96.txt} (100%) rename mods/skinsdb/meta/{character_960.txt => character.960.txt} (100%) rename mods/skinsdb/meta/{character_961.txt => character.961.txt} (100%) rename mods/skinsdb/meta/{character_962.txt => character.962.txt} (100%) rename mods/skinsdb/meta/{character_963.txt => character.963.txt} (100%) rename mods/skinsdb/meta/{character_964.txt => character.964.txt} (100%) rename mods/skinsdb/meta/{character_965.txt => character.965.txt} (100%) rename mods/skinsdb/meta/{character_966.txt => character.966.txt} (100%) rename mods/skinsdb/meta/{character_967.txt => character.967.txt} (100%) rename mods/skinsdb/meta/{character_968.txt => character.968.txt} (100%) rename mods/skinsdb/meta/{character_969.txt => character.969.txt} (100%) rename mods/skinsdb/meta/{character_970.txt => character.970.txt} (100%) rename mods/skinsdb/meta/{character_971.txt => character.971.txt} (100%) rename mods/skinsdb/meta/{character_972.txt => character.972.txt} (100%) rename mods/skinsdb/meta/{character_973.txt => character.973.txt} (100%) rename mods/skinsdb/meta/{character_974.txt => character.974.txt} (100%) rename mods/skinsdb/meta/{character_975.txt => character.975.txt} (100%) rename mods/skinsdb/meta/{character_976.txt => character.976.txt} (100%) rename mods/skinsdb/meta/{character_977.txt => character.977.txt} (100%) rename mods/skinsdb/meta/{character_978.txt => character.978.txt} (100%) rename mods/skinsdb/meta/{character_979.txt => character.979.txt} (100%) rename mods/skinsdb/meta/{character_98.txt => character.98.txt} (100%) rename mods/skinsdb/meta/{character_980.txt => character.980.txt} (100%) rename mods/skinsdb/meta/{character_981.txt => character.981.txt} (100%) rename mods/skinsdb/meta/{character_982.txt => character.982.txt} (100%) rename mods/skinsdb/meta/{character_983.txt => character.983.txt} (100%) rename mods/skinsdb/meta/{character_984.txt => character.984.txt} (100%) rename mods/skinsdb/meta/{character_985.txt => character.985.txt} (100%) rename mods/skinsdb/meta/{character_986.txt => character.986.txt} (100%) rename mods/skinsdb/meta/{character_987.txt => character.987.txt} (100%) rename mods/skinsdb/meta/{character_988.txt => character.988.txt} (100%) rename mods/skinsdb/meta/{character_989.txt => character.989.txt} (100%) rename mods/skinsdb/meta/{character_99.txt => character.99.txt} (100%) rename mods/skinsdb/meta/{character_990.txt => character.990.txt} (100%) rename mods/skinsdb/meta/{character_991.txt => character.991.txt} (100%) rename mods/skinsdb/meta/{character_992.txt => character.992.txt} (100%) rename mods/skinsdb/meta/{character_993.txt => character.993.txt} (100%) rename mods/skinsdb/meta/{character_994.txt => character.994.txt} (100%) rename mods/skinsdb/meta/{character_995.txt => character.995.txt} (100%) rename mods/skinsdb/meta/{character_996.txt => character.996.txt} (100%) rename mods/skinsdb/meta/{character_997.txt => character.997.txt} (100%) rename mods/skinsdb/meta/{character_998.txt => character.998.txt} (100%) rename mods/skinsdb/meta/{character_999.txt => character.999.txt} (100%) delete mode 100644 mods/skinsdb/meta/character_1135.txt delete mode 100644 mods/skinsdb/meta/character_593.txt delete mode 100644 mods/skinsdb/meta/character_648.txt create mode 100644 mods/skinsdb/models/skinsdb_hand.b3d create mode 100644 mods/skinsdb/models/skinsdb_hand.blend create mode 100644 mods/skinsdb/models/skinsdb_hand_18.b3d create mode 100644 mods/skinsdb/models/skinsdb_hand_18.blend rename mods/skinsdb/textures/{character_1.png => character.1.png} (100%) rename mods/skinsdb/textures/{character_10.png => character.10.png} (100%) rename mods/skinsdb/textures/{character_1000.png => character.1000.png} (100%) rename mods/skinsdb/textures/{character_1001.png => character.1001.png} (100%) rename mods/skinsdb/textures/{character_1002.png => character.1002.png} (100%) rename mods/skinsdb/textures/{character_1003.png => character.1003.png} (100%) rename mods/skinsdb/textures/{character_1004.png => character.1004.png} (100%) rename mods/skinsdb/textures/{character_1005.png => character.1005.png} (100%) rename mods/skinsdb/textures/{character_1006.png => character.1006.png} (100%) rename mods/skinsdb/textures/{character_1007.png => character.1007.png} (100%) rename mods/skinsdb/textures/{character_1008.png => character.1008.png} (100%) rename mods/skinsdb/textures/{character_1009.png => character.1009.png} (100%) rename mods/skinsdb/textures/{character_101.png => character.101.png} (100%) rename mods/skinsdb/textures/{character_1010.png => character.1010.png} (100%) rename mods/skinsdb/textures/{character_1011.png => character.1011.png} (100%) rename mods/skinsdb/textures/{character_1012.png => character.1012.png} (100%) rename mods/skinsdb/textures/{character_1013.png => character.1013.png} (100%) rename mods/skinsdb/textures/{character_1014.png => character.1014.png} (100%) rename mods/skinsdb/textures/{character_1015.png => character.1015.png} (100%) rename mods/skinsdb/textures/{character_1016.png => character.1016.png} (100%) rename mods/skinsdb/textures/{character_1017.png => character.1017.png} (100%) rename mods/skinsdb/textures/{character_1018.png => character.1018.png} (100%) rename mods/skinsdb/textures/{character_1019.png => character.1019.png} (100%) rename mods/skinsdb/textures/{character_1020.png => character.1020.png} (100%) rename mods/skinsdb/textures/{character_1021.png => character.1021.png} (100%) rename mods/skinsdb/textures/{character_1022.png => character.1022.png} (100%) rename mods/skinsdb/textures/{character_1023.png => character.1023.png} (100%) rename mods/skinsdb/textures/{character_1024.png => character.1024.png} (100%) rename mods/skinsdb/textures/{character_1025.png => character.1025.png} (100%) rename mods/skinsdb/textures/{character_1026.png => character.1026.png} (100%) rename mods/skinsdb/textures/{character_1027.png => character.1027.png} (100%) rename mods/skinsdb/textures/{character_1028.png => character.1028.png} (100%) rename mods/skinsdb/textures/{character_1029.png => character.1029.png} (100%) rename mods/skinsdb/textures/{character_1030.png => character.1030.png} (100%) rename mods/skinsdb/textures/{character_1031.png => character.1031.png} (100%) rename mods/skinsdb/textures/{character_1032.png => character.1032.png} (100%) rename mods/skinsdb/textures/{character_1033.png => character.1033.png} (100%) rename mods/skinsdb/textures/{character_1034.png => character.1034.png} (100%) rename mods/skinsdb/textures/{character_1035.png => character.1035.png} (100%) rename mods/skinsdb/textures/{character_1036.png => character.1036.png} (100%) rename mods/skinsdb/textures/{character_1037.png => character.1037.png} (100%) rename mods/skinsdb/textures/{character_1038.png => character.1038.png} (100%) rename mods/skinsdb/textures/{character_1039.png => character.1039.png} (100%) rename mods/skinsdb/textures/{character_1040.png => character.1040.png} (100%) rename mods/skinsdb/textures/{character_1041.png => character.1041.png} (100%) rename mods/skinsdb/textures/{character_1042.png => character.1042.png} (100%) rename mods/skinsdb/textures/{character_1043.png => character.1043.png} (100%) rename mods/skinsdb/textures/{character_1044.png => character.1044.png} (100%) rename mods/skinsdb/textures/{character_1045.png => character.1045.png} (100%) rename mods/skinsdb/textures/{character_1046.png => character.1046.png} (100%) rename mods/skinsdb/textures/{character_1047.png => character.1047.png} (100%) rename mods/skinsdb/textures/{character_1048.png => character.1048.png} (100%) rename mods/skinsdb/textures/{character_1049.png => character.1049.png} (100%) rename mods/skinsdb/textures/{character_1050.png => character.1050.png} (100%) rename mods/skinsdb/textures/{character_1051.png => character.1051.png} (100%) rename mods/skinsdb/textures/{character_1052.png => character.1052.png} (100%) rename mods/skinsdb/textures/{character_1053.png => character.1053.png} (100%) rename mods/skinsdb/textures/{character_1054.png => character.1054.png} (100%) rename mods/skinsdb/textures/{character_1055.png => character.1055.png} (100%) rename mods/skinsdb/textures/{character_1056.png => character.1056.png} (100%) rename mods/skinsdb/textures/{character_1057.png => character.1057.png} (100%) rename mods/skinsdb/textures/{character_1058.png => character.1058.png} (100%) rename mods/skinsdb/textures/{character_1059.png => character.1059.png} (100%) rename mods/skinsdb/textures/{character_1060.png => character.1060.png} (100%) rename mods/skinsdb/textures/{character_1061.png => character.1061.png} (100%) rename mods/skinsdb/textures/{character_1062.png => character.1062.png} (100%) rename mods/skinsdb/textures/{character_1063.png => character.1063.png} (100%) rename mods/skinsdb/textures/{character_1064.png => character.1064.png} (100%) rename mods/skinsdb/textures/{character_1065.png => character.1065.png} (100%) rename mods/skinsdb/textures/{character_1066.png => character.1066.png} (100%) rename mods/skinsdb/textures/{character_1067.png => character.1067.png} (100%) rename mods/skinsdb/textures/{character_1068.png => character.1068.png} (100%) rename mods/skinsdb/textures/{character_1069.png => character.1069.png} (100%) rename mods/skinsdb/textures/{character_1070.png => character.1070.png} (100%) rename mods/skinsdb/textures/{character_1071.png => character.1071.png} (100%) rename mods/skinsdb/textures/{character_1072.png => character.1072.png} (100%) rename mods/skinsdb/textures/{character_1073.png => character.1073.png} (100%) rename mods/skinsdb/textures/{character_1075.png => character.1075.png} (100%) rename mods/skinsdb/textures/{character_1076.png => character.1076.png} (100%) rename mods/skinsdb/textures/{character_1077.png => character.1077.png} (100%) rename mods/skinsdb/textures/{character_1078.png => character.1078.png} (100%) rename mods/skinsdb/textures/{character_1079.png => character.1079.png} (100%) rename mods/skinsdb/textures/{character_108.png => character.108.png} (100%) rename mods/skinsdb/textures/{character_1080.png => character.1080.png} (100%) rename mods/skinsdb/textures/{character_1081.png => character.1081.png} (100%) rename mods/skinsdb/textures/{character_1082.png => character.1082.png} (100%) rename mods/skinsdb/textures/{character_1083.png => character.1083.png} (100%) rename mods/skinsdb/textures/{character_1084.png => character.1084.png} (100%) rename mods/skinsdb/textures/{character_1085.png => character.1085.png} (100%) rename mods/skinsdb/textures/{character_1086.png => character.1086.png} (100%) rename mods/skinsdb/textures/{character_1087.png => character.1087.png} (100%) rename mods/skinsdb/textures/{character_1088.png => character.1088.png} (100%) rename mods/skinsdb/textures/{character_1089.png => character.1089.png} (100%) rename mods/skinsdb/textures/{character_109.png => character.109.png} (100%) rename mods/skinsdb/textures/{character_1090.png => character.1090.png} (100%) rename mods/skinsdb/textures/{character_1091.png => character.1091.png} (100%) rename mods/skinsdb/textures/{character_1092.png => character.1092.png} (100%) rename mods/skinsdb/textures/{character_1093.png => character.1093.png} (100%) rename mods/skinsdb/textures/{character_1094.png => character.1094.png} (100%) rename mods/skinsdb/textures/{character_1095.png => character.1095.png} (100%) rename mods/skinsdb/textures/{character_1096.png => character.1096.png} (100%) rename mods/skinsdb/textures/{character_1097.png => character.1097.png} (100%) rename mods/skinsdb/textures/{character_1098.png => character.1098.png} (100%) rename mods/skinsdb/textures/{character_1099.png => character.1099.png} (100%) rename mods/skinsdb/textures/{character_110.png => character.110.png} (100%) rename mods/skinsdb/textures/{character_1100.png => character.1100.png} (100%) rename mods/skinsdb/textures/{character_1101.png => character.1101.png} (100%) rename mods/skinsdb/textures/{character_1102.png => character.1102.png} (100%) rename mods/skinsdb/textures/{character_1103.png => character.1103.png} (100%) rename mods/skinsdb/textures/{character_1104.png => character.1104.png} (100%) rename mods/skinsdb/textures/{character_1105.png => character.1105.png} (100%) rename mods/skinsdb/textures/{character_1106.png => character.1106.png} (100%) rename mods/skinsdb/textures/{character_1107.png => character.1107.png} (100%) rename mods/skinsdb/textures/{character_1108.png => character.1108.png} (100%) rename mods/skinsdb/textures/{character_1109.png => character.1109.png} (100%) rename mods/skinsdb/textures/{character_111.png => character.111.png} (100%) rename mods/skinsdb/textures/{character_1110.png => character.1110.png} (100%) rename mods/skinsdb/textures/{character_1111.png => character.1111.png} (100%) rename mods/skinsdb/textures/{character_1112.png => character.1112.png} (100%) rename mods/skinsdb/textures/{character_1113.png => character.1113.png} (100%) rename mods/skinsdb/textures/{character_1114.png => character.1114.png} (100%) rename mods/skinsdb/textures/{character_1115.png => character.1115.png} (100%) rename mods/skinsdb/textures/{character_1116.png => character.1116.png} (100%) rename mods/skinsdb/textures/{character_1117.png => character.1117.png} (100%) rename mods/skinsdb/textures/{character_1118.png => character.1118.png} (100%) rename mods/skinsdb/textures/{character_1119.png => character.1119.png} (100%) rename mods/skinsdb/textures/{character_112.png => character.112.png} (100%) rename mods/skinsdb/textures/{character_1120.png => character.1120.png} (100%) rename mods/skinsdb/textures/{character_1121.png => character.1121.png} (100%) rename mods/skinsdb/textures/{character_1122.png => character.1122.png} (100%) rename mods/skinsdb/textures/{character_1123.png => character.1123.png} (100%) rename mods/skinsdb/textures/{character_1124.png => character.1124.png} (100%) rename mods/skinsdb/textures/{character_1126.png => character.1126.png} (100%) rename mods/skinsdb/textures/{character_1127.png => character.1127.png} (100%) rename mods/skinsdb/textures/{character_113.png => character.113.png} (100%) rename mods/skinsdb/textures/{character_1133.png => character.1133.png} (100%) rename mods/skinsdb/textures/{character_1134.png => character.1134.png} (100%) rename mods/skinsdb/textures/{character_1135.png => character.1135.png} (100%) rename mods/skinsdb/textures/{character_1136.png => character.1136.png} (100%) rename mods/skinsdb/textures/{character_1137.png => character.1137.png} (100%) rename mods/skinsdb/textures/{character_1138.png => character.1138.png} (100%) rename mods/skinsdb/textures/{character_1139.png => character.1139.png} (100%) rename mods/skinsdb/textures/{character_114.png => character.114.png} (100%) rename mods/skinsdb/textures/{character_1140.png => character.1140.png} (100%) rename mods/skinsdb/textures/{character_1141.png => character.1141.png} (100%) rename mods/skinsdb/textures/{character_1142.png => character.1142.png} (100%) rename mods/skinsdb/textures/{character_1143.png => character.1143.png} (100%) rename mods/skinsdb/textures/{character_1144.png => character.1144.png} (100%) rename mods/skinsdb/textures/{character_1145.png => character.1145.png} (100%) rename mods/skinsdb/textures/{character_1146.png => character.1146.png} (100%) rename mods/skinsdb/textures/{character_1147.png => character.1147.png} (100%) rename mods/skinsdb/textures/{character_1148.png => character.1148.png} (100%) rename mods/skinsdb/textures/{character_1149.png => character.1149.png} (100%) rename mods/skinsdb/textures/{character_1150.png => character.1150.png} (100%) rename mods/skinsdb/textures/{character_1151.png => character.1151.png} (100%) rename mods/skinsdb/textures/{character_1153.png => character.1153.png} (100%) rename mods/skinsdb/textures/{character_1154.png => character.1154.png} (100%) rename mods/skinsdb/textures/{character_1155.png => character.1155.png} (100%) rename mods/skinsdb/textures/{character_1156.png => character.1156.png} (100%) rename mods/skinsdb/textures/{character_1157.png => character.1157.png} (100%) rename mods/skinsdb/textures/{character_1158.png => character.1158.png} (100%) rename mods/skinsdb/textures/{character_1159.png => character.1159.png} (100%) rename mods/skinsdb/textures/{character_1160.png => character.1160.png} (100%) rename mods/skinsdb/textures/{character_1161.png => character.1161.png} (100%) rename mods/skinsdb/textures/{character_1162.png => character.1162.png} (100%) rename mods/skinsdb/textures/{character_1163.png => character.1163.png} (100%) rename mods/skinsdb/textures/{character_1164.png => character.1164.png} (100%) rename mods/skinsdb/textures/{character_1165.png => character.1165.png} (100%) rename mods/skinsdb/textures/{character_1166.png => character.1166.png} (100%) rename mods/skinsdb/textures/{character_1167.png => character.1167.png} (100%) rename mods/skinsdb/textures/{character_1168.png => character.1168.png} (100%) rename mods/skinsdb/textures/{character_1169.png => character.1169.png} (100%) rename mods/skinsdb/textures/{character_117.png => character.117.png} (100%) rename mods/skinsdb/textures/{character_1170.png => character.1170.png} (100%) rename mods/skinsdb/textures/{character_1171.png => character.1171.png} (100%) rename mods/skinsdb/textures/{character_1172.png => character.1172.png} (100%) rename mods/skinsdb/textures/{character_1173.png => character.1173.png} (100%) rename mods/skinsdb/textures/{character_1174.png => character.1174.png} (100%) rename mods/skinsdb/textures/{character_1175.png => character.1175.png} (100%) rename mods/skinsdb/textures/{character_1176.png => character.1176.png} (100%) rename mods/skinsdb/textures/{character_1177.png => character.1177.png} (100%) rename mods/skinsdb/textures/{character_1178.png => character.1178.png} (100%) rename mods/skinsdb/textures/{character_1179.png => character.1179.png} (100%) rename mods/skinsdb/textures/{character_118.png => character.118.png} (100%) rename mods/skinsdb/textures/{character_1180.png => character.1180.png} (100%) rename mods/skinsdb/textures/{character_1181.png => character.1181.png} (100%) rename mods/skinsdb/textures/{character_1182.png => character.1182.png} (100%) rename mods/skinsdb/textures/{character_1183.png => character.1183.png} (100%) rename mods/skinsdb/textures/{character_1184.png => character.1184.png} (100%) rename mods/skinsdb/textures/{character_1185.png => character.1185.png} (100%) rename mods/skinsdb/textures/{character_1186.png => character.1186.png} (100%) rename mods/skinsdb/textures/{character_1191.png => character.1191.png} (100%) rename mods/skinsdb/textures/{character_1192.png => character.1192.png} (100%) rename mods/skinsdb/textures/{character_1193.png => character.1193.png} (100%) rename mods/skinsdb/textures/{character_1194.png => character.1194.png} (100%) rename mods/skinsdb/textures/{character_1195.png => character.1195.png} (100%) rename mods/skinsdb/textures/{character_1196.png => character.1196.png} (100%) rename mods/skinsdb/textures/{character_1197.png => character.1197.png} (100%) rename mods/skinsdb/textures/{character_1198.png => character.1198.png} (100%) rename mods/skinsdb/textures/{character_1199.png => character.1199.png} (100%) rename mods/skinsdb/textures/{character_12.png => character.12.png} (100%) rename mods/skinsdb/textures/{character_1200.png => character.1200.png} (100%) rename mods/skinsdb/textures/{character_1201.png => character.1201.png} (100%) rename mods/skinsdb/textures/{character_1202.png => character.1202.png} (100%) rename mods/skinsdb/textures/{character_1203.png => character.1203.png} (100%) rename mods/skinsdb/textures/{character_1204.png => character.1204.png} (100%) rename mods/skinsdb/textures/{character_1205.png => character.1205.png} (100%) rename mods/skinsdb/textures/{character_1206.png => character.1206.png} (100%) rename mods/skinsdb/textures/{character_1207.png => character.1207.png} (100%) rename mods/skinsdb/textures/{character_1208.png => character.1208.png} (100%) rename mods/skinsdb/textures/{character_1209.png => character.1209.png} (100%) rename mods/skinsdb/textures/{character_121.png => character.121.png} (100%) rename mods/skinsdb/textures/{character_1210.png => character.1210.png} (100%) rename mods/skinsdb/textures/{character_1211.png => character.1211.png} (100%) rename mods/skinsdb/textures/{character_1212.png => character.1212.png} (100%) rename mods/skinsdb/textures/{character_1213.png => character.1213.png} (100%) rename mods/skinsdb/textures/{character_1214.png => character.1214.png} (100%) rename mods/skinsdb/textures/{character_1215.png => character.1215.png} (100%) rename mods/skinsdb/textures/{character_1216.png => character.1216.png} (100%) rename mods/skinsdb/textures/{character_1217.png => character.1217.png} (100%) rename mods/skinsdb/textures/{character_1218.png => character.1218.png} (100%) rename mods/skinsdb/textures/{character_1219.png => character.1219.png} (100%) rename mods/skinsdb/textures/{character_1220.png => character.1220.png} (100%) rename mods/skinsdb/textures/{character_1221.png => character.1221.png} (100%) rename mods/skinsdb/textures/{character_1222.png => character.1222.png} (100%) rename mods/skinsdb/textures/{character_1223.png => character.1223.png} (100%) rename mods/skinsdb/textures/{character_1224.png => character.1224.png} (100%) rename mods/skinsdb/textures/{character_1225.png => character.1225.png} (100%) rename mods/skinsdb/textures/{character_1226.png => character.1226.png} (100%) rename mods/skinsdb/textures/{character_1227.png => character.1227.png} (100%) rename mods/skinsdb/textures/{character_1228.png => character.1228.png} (100%) rename mods/skinsdb/textures/{character_1229.png => character.1229.png} (100%) rename mods/skinsdb/textures/{character_1230.png => character.1230.png} (100%) rename mods/skinsdb/textures/{character_1231.png => character.1231.png} (100%) rename mods/skinsdb/textures/{character_1232.png => character.1232.png} (100%) rename mods/skinsdb/textures/{character_1233.png => character.1233.png} (100%) rename mods/skinsdb/textures/{character_1234.png => character.1234.png} (100%) rename mods/skinsdb/textures/{character_1235.png => character.1235.png} (100%) rename mods/skinsdb/textures/{character_1236.png => character.1236.png} (100%) rename mods/skinsdb/textures/{character_1237.png => character.1237.png} (100%) rename mods/skinsdb/textures/{character_1238.png => character.1238.png} (100%) rename mods/skinsdb/textures/{character_1239.png => character.1239.png} (100%) rename mods/skinsdb/textures/{character_124.png => character.124.png} (100%) rename mods/skinsdb/textures/{character_1240.png => character.1240.png} (100%) rename mods/skinsdb/textures/{character_1241.png => character.1241.png} (100%) rename mods/skinsdb/textures/{character_1242.png => character.1242.png} (100%) rename mods/skinsdb/textures/{character_1243.png => character.1243.png} (100%) rename mods/skinsdb/textures/{character_1244.png => character.1244.png} (100%) rename mods/skinsdb/textures/{character_1245.png => character.1245.png} (100%) rename mods/skinsdb/textures/{character_1246.png => character.1246.png} (100%) rename mods/skinsdb/textures/{character_1247.png => character.1247.png} (100%) rename mods/skinsdb/textures/{character_1248.png => character.1248.png} (100%) rename mods/skinsdb/textures/{character_1249.png => character.1249.png} (100%) rename mods/skinsdb/textures/{character_1250.png => character.1250.png} (100%) rename mods/skinsdb/textures/{character_1251.png => character.1251.png} (100%) rename mods/skinsdb/textures/{character_1252.png => character.1252.png} (100%) rename mods/skinsdb/textures/{character_1253.png => character.1253.png} (100%) rename mods/skinsdb/textures/{character_1254.png => character.1254.png} (100%) rename mods/skinsdb/textures/{character_1255.png => character.1255.png} (100%) rename mods/skinsdb/textures/{character_1256.png => character.1256.png} (100%) rename mods/skinsdb/textures/{character_1257.png => character.1257.png} (100%) rename mods/skinsdb/textures/{character_1258.png => character.1258.png} (100%) rename mods/skinsdb/textures/{character_1259.png => character.1259.png} (100%) rename mods/skinsdb/textures/{character_126.png => character.126.png} (100%) rename mods/skinsdb/textures/{character_1260.png => character.1260.png} (100%) rename mods/skinsdb/textures/{character_1261.png => character.1261.png} (100%) rename mods/skinsdb/textures/{character_1262.png => character.1262.png} (100%) rename mods/skinsdb/textures/{character_1263.png => character.1263.png} (100%) rename mods/skinsdb/textures/{character_1264.png => character.1264.png} (100%) rename mods/skinsdb/textures/{character_1265.png => character.1265.png} (100%) rename mods/skinsdb/textures/{character_1266.png => character.1266.png} (100%) rename mods/skinsdb/textures/{character_1267.png => character.1267.png} (100%) rename mods/skinsdb/textures/{character_1268.png => character.1268.png} (100%) rename mods/skinsdb/textures/{character_1269.png => character.1269.png} (100%) rename mods/skinsdb/textures/{character_1270.png => character.1270.png} (100%) rename mods/skinsdb/textures/{character_1271.png => character.1271.png} (100%) rename mods/skinsdb/textures/{character_1272.png => character.1272.png} (100%) rename mods/skinsdb/textures/{character_1273.png => character.1273.png} (100%) rename mods/skinsdb/textures/{character_1274.png => character.1274.png} (100%) rename mods/skinsdb/textures/{character_1275.png => character.1275.png} (100%) rename mods/skinsdb/textures/{character_1276.png => character.1276.png} (100%) rename mods/skinsdb/textures/{character_1277.png => character.1277.png} (100%) rename mods/skinsdb/textures/{character_1278.png => character.1278.png} (100%) rename mods/skinsdb/textures/{character_1279.png => character.1279.png} (100%) rename mods/skinsdb/textures/{character_128.png => character.128.png} (100%) rename mods/skinsdb/textures/{character_1280.png => character.1280.png} (100%) rename mods/skinsdb/textures/{character_1281.png => character.1281.png} (100%) rename mods/skinsdb/textures/{character_1282.png => character.1282.png} (100%) rename mods/skinsdb/textures/{character_1283.png => character.1283.png} (100%) rename mods/skinsdb/textures/{character_1284.png => character.1284.png} (100%) rename mods/skinsdb/textures/{character_1285.png => character.1285.png} (100%) rename mods/skinsdb/textures/{character_1286.png => character.1286.png} (100%) rename mods/skinsdb/textures/{character_1287.png => character.1287.png} (100%) rename mods/skinsdb/textures/{character_1288.png => character.1288.png} (100%) rename mods/skinsdb/textures/{character_1289.png => character.1289.png} (100%) rename mods/skinsdb/textures/{character_129.png => character.129.png} (100%) rename mods/skinsdb/textures/{character_1290.png => character.1290.png} (100%) rename mods/skinsdb/textures/{character_1291.png => character.1291.png} (100%) rename mods/skinsdb/textures/{character_1292.png => character.1292.png} (100%) rename mods/skinsdb/textures/{character_1293.png => character.1293.png} (100%) rename mods/skinsdb/textures/{character_1294.png => character.1294.png} (100%) rename mods/skinsdb/textures/{character_1295.png => character.1295.png} (100%) rename mods/skinsdb/textures/{character_1296.png => character.1296.png} (100%) rename mods/skinsdb/textures/{character_1297.png => character.1297.png} (100%) rename mods/skinsdb/textures/{character_1298.png => character.1298.png} (100%) rename mods/skinsdb/textures/{character_1299.png => character.1299.png} (100%) rename mods/skinsdb/textures/{character_1300.png => character.1300.png} (100%) rename mods/skinsdb/textures/{character_1301.png => character.1301.png} (100%) rename mods/skinsdb/textures/{character_1302.png => character.1302.png} (100%) rename mods/skinsdb/textures/{character_1303.png => character.1303.png} (100%) rename mods/skinsdb/textures/{character_1304.png => character.1304.png} (100%) rename mods/skinsdb/textures/{character_1305.png => character.1305.png} (100%) rename mods/skinsdb/textures/{character_1306.png => character.1306.png} (100%) rename mods/skinsdb/textures/{character_1307.png => character.1307.png} (100%) rename mods/skinsdb/textures/{character_1308.png => character.1308.png} (100%) rename mods/skinsdb/textures/{character_1309.png => character.1309.png} (100%) rename mods/skinsdb/textures/{character_1310.png => character.1310.png} (100%) rename mods/skinsdb/textures/{character_1311.png => character.1311.png} (100%) rename mods/skinsdb/textures/{character_1312.png => character.1312.png} (100%) rename mods/skinsdb/textures/{character_1313.png => character.1313.png} (100%) rename mods/skinsdb/textures/{character_1314.png => character.1314.png} (100%) rename mods/skinsdb/textures/{character_1315.png => character.1315.png} (100%) rename mods/skinsdb/textures/{character_1316.png => character.1316.png} (100%) rename mods/skinsdb/textures/{character_1317.png => character.1317.png} (100%) rename mods/skinsdb/textures/{character_1318.png => character.1318.png} (100%) rename mods/skinsdb/textures/{character_1319.png => character.1319.png} (100%) rename mods/skinsdb/textures/{character_1320.png => character.1320.png} (100%) rename mods/skinsdb/textures/{character_1321.png => character.1321.png} (100%) rename mods/skinsdb/textures/{character_1322.png => character.1322.png} (100%) rename mods/skinsdb/textures/{character_1323.png => character.1323.png} (100%) rename mods/skinsdb/textures/{character_1324.png => character.1324.png} (100%) rename mods/skinsdb/textures/{character_1325.png => character.1325.png} (100%) rename mods/skinsdb/textures/{character_1326.png => character.1326.png} (100%) rename mods/skinsdb/textures/{character_1327.png => character.1327.png} (100%) rename mods/skinsdb/textures/{character_1328.png => character.1328.png} (100%) rename mods/skinsdb/textures/{character_1329.png => character.1329.png} (100%) rename mods/skinsdb/textures/{character_1330.png => character.1330.png} (100%) rename mods/skinsdb/textures/{character_1331.png => character.1331.png} (100%) rename mods/skinsdb/textures/{character_1332.png => character.1332.png} (100%) rename mods/skinsdb/textures/{character_1333.png => character.1333.png} (100%) rename mods/skinsdb/textures/{character_1334.png => character.1334.png} (100%) rename mods/skinsdb/textures/{character_1335.png => character.1335.png} (100%) rename mods/skinsdb/textures/{character_1336.png => character.1336.png} (100%) rename mods/skinsdb/textures/{character_1337.png => character.1337.png} (100%) rename mods/skinsdb/textures/{character_1338.png => character.1338.png} (100%) rename mods/skinsdb/textures/{character_134.png => character.134.png} (100%) rename mods/skinsdb/textures/{character_1340.png => character.1340.png} (100%) rename mods/skinsdb/textures/{character_1341.png => character.1341.png} (100%) rename mods/skinsdb/textures/{character_1342.png => character.1342.png} (100%) rename mods/skinsdb/textures/{character_1343.png => character.1343.png} (100%) rename mods/skinsdb/textures/{character_1344.png => character.1344.png} (100%) rename mods/skinsdb/textures/{character_1345.png => character.1345.png} (100%) rename mods/skinsdb/textures/{character_1346.png => character.1346.png} (100%) rename mods/skinsdb/textures/{character_1347.png => character.1347.png} (100%) rename mods/skinsdb/textures/{character_1348.png => character.1348.png} (100%) rename mods/skinsdb/textures/{character_1349.png => character.1349.png} (100%) rename mods/skinsdb/textures/{character_135.png => character.135.png} (100%) rename mods/skinsdb/textures/{character_1350.png => character.1350.png} (100%) rename mods/skinsdb/textures/{character_1351.png => character.1351.png} (100%) rename mods/skinsdb/textures/{character_1352.png => character.1352.png} (100%) rename mods/skinsdb/textures/{character_1353.png => character.1353.png} (100%) rename mods/skinsdb/textures/{character_1354.png => character.1354.png} (100%) rename mods/skinsdb/textures/{character_1355.png => character.1355.png} (100%) rename mods/skinsdb/textures/{character_1356.png => character.1356.png} (100%) rename mods/skinsdb/textures/{character_1357.png => character.1357.png} (100%) rename mods/skinsdb/textures/{character_1358.png => character.1358.png} (100%) rename mods/skinsdb/textures/{character_1359.png => character.1359.png} (100%) rename mods/skinsdb/textures/{character_136.png => character.136.png} (100%) rename mods/skinsdb/textures/{character_1360.png => character.1360.png} (100%) rename mods/skinsdb/textures/{character_1361.png => character.1361.png} (100%) rename mods/skinsdb/textures/{character_1362.png => character.1362.png} (100%) rename mods/skinsdb/textures/{character_1363.png => character.1363.png} (100%) rename mods/skinsdb/textures/{character_1364.png => character.1364.png} (100%) rename mods/skinsdb/textures/{character_1365.png => character.1365.png} (100%) rename mods/skinsdb/textures/{character_1366.png => character.1366.png} (100%) rename mods/skinsdb/textures/{character_1367.png => character.1367.png} (100%) rename mods/skinsdb/textures/{character_1368.png => character.1368.png} (100%) rename mods/skinsdb/textures/{character_1369.png => character.1369.png} (100%) rename mods/skinsdb/textures/{character_1370.png => character.1370.png} (100%) rename mods/skinsdb/textures/{character_1371.png => character.1371.png} (100%) rename mods/skinsdb/textures/{character_1372.png => character.1372.png} (100%) rename mods/skinsdb/textures/{character_1373.png => character.1373.png} (100%) rename mods/skinsdb/textures/{character_1374.png => character.1374.png} (100%) rename mods/skinsdb/textures/{character_1375.png => character.1375.png} (100%) rename mods/skinsdb/textures/{character_1376.png => character.1376.png} (100%) rename mods/skinsdb/textures/{character_1377.png => character.1377.png} (100%) rename mods/skinsdb/textures/{character_1378.png => character.1378.png} (100%) rename mods/skinsdb/textures/{character_1379.png => character.1379.png} (100%) rename mods/skinsdb/textures/{character_1380.png => character.1380.png} (100%) rename mods/skinsdb/textures/{character_1381.png => character.1381.png} (100%) rename mods/skinsdb/textures/{character_1382.png => character.1382.png} (100%) rename mods/skinsdb/textures/{character_1383.png => character.1383.png} (100%) rename mods/skinsdb/textures/{character_1384.png => character.1384.png} (100%) rename mods/skinsdb/textures/{character_1385.png => character.1385.png} (100%) rename mods/skinsdb/textures/{character_1386.png => character.1386.png} (100%) rename mods/skinsdb/textures/{character_1387.png => character.1387.png} (100%) rename mods/skinsdb/textures/{character_1388.png => character.1388.png} (100%) rename mods/skinsdb/textures/{character_1389.png => character.1389.png} (100%) rename mods/skinsdb/textures/{character_1390.png => character.1390.png} (100%) rename mods/skinsdb/textures/{character_1391.png => character.1391.png} (100%) rename mods/skinsdb/textures/{character_1392.png => character.1392.png} (100%) rename mods/skinsdb/textures/{character_1393.png => character.1393.png} (100%) rename mods/skinsdb/textures/{character_1394.png => character.1394.png} (100%) rename mods/skinsdb/textures/{character_1395.png => character.1395.png} (100%) rename mods/skinsdb/textures/{character_1396.png => character.1396.png} (100%) rename mods/skinsdb/textures/{character_1397.png => character.1397.png} (100%) rename mods/skinsdb/textures/{character_1398.png => character.1398.png} (100%) rename mods/skinsdb/textures/{character_1399.png => character.1399.png} (100%) rename mods/skinsdb/textures/{character_140.png => character.140.png} (100%) rename mods/skinsdb/textures/{character_1400.png => character.1400.png} (100%) rename mods/skinsdb/textures/{character_1401.png => character.1401.png} (100%) rename mods/skinsdb/textures/{character_1402.png => character.1402.png} (100%) rename mods/skinsdb/textures/{character_1403.png => character.1403.png} (100%) rename mods/skinsdb/textures/{character_1404.png => character.1404.png} (100%) rename mods/skinsdb/textures/{character_1405.png => character.1405.png} (100%) rename mods/skinsdb/textures/{character_1406.png => character.1406.png} (100%) rename mods/skinsdb/textures/{character_1407.png => character.1407.png} (100%) rename mods/skinsdb/textures/{character_1408.png => character.1408.png} (100%) rename mods/skinsdb/textures/{character_1409.png => character.1409.png} (100%) rename mods/skinsdb/textures/{character_141.png => character.141.png} (100%) rename mods/skinsdb/textures/{character_1410.png => character.1410.png} (100%) rename mods/skinsdb/textures/{character_1411.png => character.1411.png} (100%) rename mods/skinsdb/textures/{character_1414.png => character.1414.png} (100%) rename mods/skinsdb/textures/{character_1415.png => character.1415.png} (100%) rename mods/skinsdb/textures/{character_1416.png => character.1416.png} (100%) rename mods/skinsdb/textures/{character_1417.png => character.1417.png} (100%) rename mods/skinsdb/textures/{character_1418.png => character.1418.png} (100%) rename mods/skinsdb/textures/{character_1419.png => character.1419.png} (100%) rename mods/skinsdb/textures/{character_142.png => character.142.png} (100%) rename mods/skinsdb/textures/{character_1420.png => character.1420.png} (100%) rename mods/skinsdb/textures/{character_1421.png => character.1421.png} (100%) rename mods/skinsdb/textures/{character_1422.png => character.1422.png} (100%) rename mods/skinsdb/textures/{character_1423.png => character.1423.png} (100%) rename mods/skinsdb/textures/{character_1424.png => character.1424.png} (100%) rename mods/skinsdb/textures/{character_1425.png => character.1425.png} (100%) rename mods/skinsdb/textures/{character_1426.png => character.1426.png} (100%) rename mods/skinsdb/textures/{character_1427.png => character.1427.png} (100%) rename mods/skinsdb/textures/{character_1428.png => character.1428.png} (100%) rename mods/skinsdb/textures/{character_1429.png => character.1429.png} (100%) rename mods/skinsdb/textures/{character_143.png => character.143.png} (100%) rename mods/skinsdb/textures/{character_1430.png => character.1430.png} (100%) rename mods/skinsdb/textures/{character_1431.png => character.1431.png} (100%) rename mods/skinsdb/textures/{character_1432.png => character.1432.png} (100%) rename mods/skinsdb/textures/{character_1433.png => character.1433.png} (100%) rename mods/skinsdb/textures/{character_1434.png => character.1434.png} (100%) rename mods/skinsdb/textures/{character_1435.png => character.1435.png} (100%) rename mods/skinsdb/textures/{character_1436.png => character.1436.png} (100%) rename mods/skinsdb/textures/{character_1437.png => character.1437.png} (100%) rename mods/skinsdb/textures/{character_1438.png => character.1438.png} (100%) rename mods/skinsdb/textures/{character_1439.png => character.1439.png} (100%) rename mods/skinsdb/textures/{character_144.png => character.144.png} (100%) rename mods/skinsdb/textures/{character_1440.png => character.1440.png} (100%) rename mods/skinsdb/textures/{character_1441.png => character.1441.png} (100%) rename mods/skinsdb/textures/{character_1442.png => character.1442.png} (100%) rename mods/skinsdb/textures/{character_1443.png => character.1443.png} (100%) rename mods/skinsdb/textures/{character_1444.png => character.1444.png} (100%) rename mods/skinsdb/textures/{character_1445.png => character.1445.png} (100%) rename mods/skinsdb/textures/{character_145.png => character.145.png} (100%) rename mods/skinsdb/textures/{character_1455.png => character.1455.png} (100%) rename mods/skinsdb/textures/{character_1456.png => character.1456.png} (100%) rename mods/skinsdb/textures/{character_1457.png => character.1457.png} (100%) rename mods/skinsdb/textures/{character_1458.png => character.1458.png} (100%) rename mods/skinsdb/textures/{character_1459.png => character.1459.png} (100%) rename mods/skinsdb/textures/{character_146.png => character.146.png} (100%) rename mods/skinsdb/textures/{character_1460.png => character.1460.png} (100%) rename mods/skinsdb/textures/{character_1461.png => character.1461.png} (100%) rename mods/skinsdb/textures/{character_1462.png => character.1462.png} (100%) rename mods/skinsdb/textures/{character_1463.png => character.1463.png} (100%) rename mods/skinsdb/textures/{character_1464.png => character.1464.png} (100%) rename mods/skinsdb/textures/{character_1465.png => character.1465.png} (100%) rename mods/skinsdb/textures/{character_1466.png => character.1466.png} (100%) rename mods/skinsdb/textures/{character_1467.png => character.1467.png} (100%) rename mods/skinsdb/textures/{character_1468.png => character.1468.png} (100%) rename mods/skinsdb/textures/{character_1469.png => character.1469.png} (100%) rename mods/skinsdb/textures/{character_147.png => character.147.png} (100%) rename mods/skinsdb/textures/{character_1470.png => character.1470.png} (100%) rename mods/skinsdb/textures/{character_1471.png => character.1471.png} (100%) rename mods/skinsdb/textures/{character_1472.png => character.1472.png} (100%) rename mods/skinsdb/textures/{character_1473.png => character.1473.png} (100%) rename mods/skinsdb/textures/{character_1474.png => character.1474.png} (100%) rename mods/skinsdb/textures/{character_1475.png => character.1475.png} (100%) rename mods/skinsdb/textures/{character_1476.png => character.1476.png} (100%) rename mods/skinsdb/textures/{character_1477.png => character.1477.png} (100%) rename mods/skinsdb/textures/{character_1478.png => character.1478.png} (100%) rename mods/skinsdb/textures/{character_1479.png => character.1479.png} (100%) rename mods/skinsdb/textures/{character_148.png => character.148.png} (100%) rename mods/skinsdb/textures/{character_1480.png => character.1480.png} (100%) rename mods/skinsdb/textures/{character_1481.png => character.1481.png} (100%) rename mods/skinsdb/textures/{character_1482.png => character.1482.png} (100%) rename mods/skinsdb/textures/{character_1483.png => character.1483.png} (100%) rename mods/skinsdb/textures/{character_1484.png => character.1484.png} (100%) rename mods/skinsdb/textures/{character_1485.png => character.1485.png} (100%) rename mods/skinsdb/textures/{character_1486.png => character.1486.png} (100%) rename mods/skinsdb/textures/{character_1487.png => character.1487.png} (100%) rename mods/skinsdb/textures/{character_1488.png => character.1488.png} (100%) rename mods/skinsdb/textures/{character_1489.png => character.1489.png} (100%) rename mods/skinsdb/textures/{character_1490.png => character.1490.png} (100%) rename mods/skinsdb/textures/{character_1491.png => character.1491.png} (100%) rename mods/skinsdb/textures/{character_1492.png => character.1492.png} (100%) rename mods/skinsdb/textures/{character_1493.png => character.1493.png} (100%) rename mods/skinsdb/textures/{character_1494.png => character.1494.png} (100%) rename mods/skinsdb/textures/{character_1495.png => character.1495.png} (100%) rename mods/skinsdb/textures/{character_1496.png => character.1496.png} (100%) rename mods/skinsdb/textures/{character_1497.png => character.1497.png} (100%) rename mods/skinsdb/textures/{character_1498.png => character.1498.png} (100%) rename mods/skinsdb/textures/{character_1499.png => character.1499.png} (100%) rename mods/skinsdb/textures/{character_1500.png => character.1500.png} (100%) rename mods/skinsdb/textures/{character_1501.png => character.1501.png} (100%) rename mods/skinsdb/textures/{character_1502.png => character.1502.png} (100%) rename mods/skinsdb/textures/{character_1503.png => character.1503.png} (100%) rename mods/skinsdb/textures/{character_1504.png => character.1504.png} (100%) rename mods/skinsdb/textures/{character_1505.png => character.1505.png} (100%) rename mods/skinsdb/textures/{character_1506.png => character.1506.png} (100%) rename mods/skinsdb/textures/{character_1507.png => character.1507.png} (100%) rename mods/skinsdb/textures/{character_1508.png => character.1508.png} (100%) rename mods/skinsdb/textures/{character_1509.png => character.1509.png} (100%) rename mods/skinsdb/textures/{character_151.png => character.151.png} (100%) rename mods/skinsdb/textures/{character_1510.png => character.1510.png} (100%) rename mods/skinsdb/textures/{character_1511.png => character.1511.png} (100%) rename mods/skinsdb/textures/{character_1512.png => character.1512.png} (100%) rename mods/skinsdb/textures/{character_1513.png => character.1513.png} (100%) rename mods/skinsdb/textures/{character_1514.png => character.1514.png} (100%) rename mods/skinsdb/textures/{character_1515.png => character.1515.png} (100%) rename mods/skinsdb/textures/{character_1516.png => character.1516.png} (100%) rename mods/skinsdb/textures/{character_1517.png => character.1517.png} (100%) rename mods/skinsdb/textures/{character_1518.png => character.1518.png} (100%) rename mods/skinsdb/textures/{character_1519.png => character.1519.png} (100%) rename mods/skinsdb/textures/{character_152.png => character.152.png} (100%) rename mods/skinsdb/textures/{character_1520.png => character.1520.png} (100%) rename mods/skinsdb/textures/{character_1521.png => character.1521.png} (100%) rename mods/skinsdb/textures/{character_1522.png => character.1522.png} (100%) rename mods/skinsdb/textures/{character_1523.png => character.1523.png} (100%) rename mods/skinsdb/textures/{character_1524.png => character.1524.png} (100%) rename mods/skinsdb/textures/{character_1525.png => character.1525.png} (100%) rename mods/skinsdb/textures/{character_1526.png => character.1526.png} (100%) rename mods/skinsdb/textures/{character_1527.png => character.1527.png} (100%) rename mods/skinsdb/textures/{character_1528.png => character.1528.png} (100%) rename mods/skinsdb/textures/{character_1529.png => character.1529.png} (100%) rename mods/skinsdb/textures/{character_153.png => character.153.png} (100%) rename mods/skinsdb/textures/{character_1530.png => character.1530.png} (100%) rename mods/skinsdb/textures/{character_1531.png => character.1531.png} (100%) rename mods/skinsdb/textures/{character_1532.png => character.1532.png} (100%) rename mods/skinsdb/textures/{character_1533.png => character.1533.png} (100%) rename mods/skinsdb/textures/{character_1534.png => character.1534.png} (100%) rename mods/skinsdb/textures/{character_1535.png => character.1535.png} (100%) rename mods/skinsdb/textures/{character_1536.png => character.1536.png} (100%) rename mods/skinsdb/textures/{character_1537.png => character.1537.png} (100%) rename mods/skinsdb/textures/{character_1538.png => character.1538.png} (100%) rename mods/skinsdb/textures/{character_1539.png => character.1539.png} (100%) rename mods/skinsdb/textures/{character_154.png => character.154.png} (100%) rename mods/skinsdb/textures/{character_1540.png => character.1540.png} (100%) rename mods/skinsdb/textures/{character_1541.png => character.1541.png} (100%) rename mods/skinsdb/textures/{character_1542.png => character.1542.png} (100%) rename mods/skinsdb/textures/{character_1543.png => character.1543.png} (100%) rename mods/skinsdb/textures/{character_1544.png => character.1544.png} (100%) rename mods/skinsdb/textures/{character_1545.png => character.1545.png} (100%) rename mods/skinsdb/textures/{character_1546.png => character.1546.png} (100%) rename mods/skinsdb/textures/{character_1547.png => character.1547.png} (100%) rename mods/skinsdb/textures/{character_1548.png => character.1548.png} (100%) rename mods/skinsdb/textures/{character_1549.png => character.1549.png} (100%) rename mods/skinsdb/textures/{character_155.png => character.155.png} (100%) rename mods/skinsdb/textures/{character_1550.png => character.1550.png} (100%) rename mods/skinsdb/textures/{character_1551.png => character.1551.png} (100%) rename mods/skinsdb/textures/{character_1552.png => character.1552.png} (100%) rename mods/skinsdb/textures/{character_1553.png => character.1553.png} (100%) rename mods/skinsdb/textures/{character_1554.png => character.1554.png} (100%) rename mods/skinsdb/textures/{character_1555.png => character.1555.png} (100%) rename mods/skinsdb/textures/{character_1556.png => character.1556.png} (100%) rename mods/skinsdb/textures/{character_1557.png => character.1557.png} (100%) rename mods/skinsdb/textures/{character_1558.png => character.1558.png} (100%) rename mods/skinsdb/textures/{character_1559.png => character.1559.png} (100%) rename mods/skinsdb/textures/{character_156.png => character.156.png} (100%) rename mods/skinsdb/textures/{character_1560.png => character.1560.png} (100%) rename mods/skinsdb/textures/{character_1561.png => character.1561.png} (100%) rename mods/skinsdb/textures/{character_1562.png => character.1562.png} (100%) rename mods/skinsdb/textures/{character_1563.png => character.1563.png} (100%) rename mods/skinsdb/textures/{character_1564.png => character.1564.png} (100%) rename mods/skinsdb/textures/{character_1565.png => character.1565.png} (100%) rename mods/skinsdb/textures/{character_1566.png => character.1566.png} (100%) rename mods/skinsdb/textures/{character_1567.png => character.1567.png} (100%) rename mods/skinsdb/textures/{character_1568.png => character.1568.png} (100%) rename mods/skinsdb/textures/{character_1569.png => character.1569.png} (100%) rename mods/skinsdb/textures/{character_157.png => character.157.png} (100%) rename mods/skinsdb/textures/{character_1570.png => character.1570.png} (100%) rename mods/skinsdb/textures/{character_1571.png => character.1571.png} (100%) rename mods/skinsdb/textures/{character_1572.png => character.1572.png} (100%) rename mods/skinsdb/textures/{character_1573.png => character.1573.png} (100%) rename mods/skinsdb/textures/{character_1574.png => character.1574.png} (100%) rename mods/skinsdb/textures/{character_1575.png => character.1575.png} (100%) rename mods/skinsdb/textures/{character_1576.png => character.1576.png} (100%) rename mods/skinsdb/textures/{character_1577.png => character.1577.png} (100%) rename mods/skinsdb/textures/{character_1578.png => character.1578.png} (100%) rename mods/skinsdb/textures/{character_1579.png => character.1579.png} (100%) rename mods/skinsdb/textures/{character_158.png => character.158.png} (100%) rename mods/skinsdb/textures/{character_1580.png => character.1580.png} (100%) rename mods/skinsdb/textures/{character_1581.png => character.1581.png} (100%) rename mods/skinsdb/textures/{character_1582.png => character.1582.png} (100%) rename mods/skinsdb/textures/{character_1583.png => character.1583.png} (100%) rename mods/skinsdb/textures/{character_1584.png => character.1584.png} (100%) rename mods/skinsdb/textures/{character_1585.png => character.1585.png} (100%) rename mods/skinsdb/textures/{character_1586.png => character.1586.png} (100%) rename mods/skinsdb/textures/{character_1587.png => character.1587.png} (100%) rename mods/skinsdb/textures/{character_1588.png => character.1588.png} (100%) rename mods/skinsdb/textures/{character_1589.png => character.1589.png} (100%) rename mods/skinsdb/textures/{character_159.png => character.159.png} (100%) rename mods/skinsdb/textures/{character_1590.png => character.1590.png} (100%) rename mods/skinsdb/textures/{character_1591.png => character.1591.png} (100%) rename mods/skinsdb/textures/{character_1592.png => character.1592.png} (100%) rename mods/skinsdb/textures/{character_1593.png => character.1593.png} (100%) rename mods/skinsdb/textures/{character_1594.png => character.1594.png} (100%) rename mods/skinsdb/textures/{character_1595.png => character.1595.png} (100%) rename mods/skinsdb/textures/{character_1596.png => character.1596.png} (100%) rename mods/skinsdb/textures/{character_1597.png => character.1597.png} (100%) rename mods/skinsdb/textures/{character_1598.png => character.1598.png} (100%) rename mods/skinsdb/textures/{character_1599.png => character.1599.png} (100%) rename mods/skinsdb/textures/{character_160.png => character.160.png} (100%) rename mods/skinsdb/textures/{character_1600.png => character.1600.png} (100%) rename mods/skinsdb/textures/{character_1601.png => character.1601.png} (100%) rename mods/skinsdb/textures/{character_1602.png => character.1602.png} (100%) rename mods/skinsdb/textures/{character_1603.png => character.1603.png} (100%) rename mods/skinsdb/textures/{character_1604.png => character.1604.png} (100%) rename mods/skinsdb/textures/{character_1605.png => character.1605.png} (100%) rename mods/skinsdb/textures/{character_1606.png => character.1606.png} (100%) rename mods/skinsdb/textures/{character_1607.png => character.1607.png} (100%) rename mods/skinsdb/textures/{character_1608.png => character.1608.png} (100%) rename mods/skinsdb/textures/{character_1609.png => character.1609.png} (100%) rename mods/skinsdb/textures/{character_161.png => character.161.png} (100%) rename mods/skinsdb/textures/{character_1610.png => character.1610.png} (100%) rename mods/skinsdb/textures/{character_1611.png => character.1611.png} (100%) rename mods/skinsdb/textures/{character_1612.png => character.1612.png} (100%) rename mods/skinsdb/textures/{character_1613.png => character.1613.png} (100%) rename mods/skinsdb/textures/{character_1614.png => character.1614.png} (100%) rename mods/skinsdb/textures/{character_1615.png => character.1615.png} (100%) rename mods/skinsdb/textures/{character_1616.png => character.1616.png} (100%) rename mods/skinsdb/textures/{character_1617.png => character.1617.png} (100%) rename mods/skinsdb/textures/{character_1618.png => character.1618.png} (100%) rename mods/skinsdb/textures/{character_1619.png => character.1619.png} (100%) rename mods/skinsdb/textures/{character_162.png => character.162.png} (100%) rename mods/skinsdb/textures/{character_1620.png => character.1620.png} (100%) rename mods/skinsdb/textures/{character_1621.png => character.1621.png} (100%) rename mods/skinsdb/textures/{character_1622.png => character.1622.png} (100%) rename mods/skinsdb/textures/{character_1623.png => character.1623.png} (100%) rename mods/skinsdb/textures/{character_1624.png => character.1624.png} (100%) rename mods/skinsdb/textures/{character_1625.png => character.1625.png} (100%) rename mods/skinsdb/textures/{character_1626.png => character.1626.png} (100%) rename mods/skinsdb/textures/{character_1627.png => character.1627.png} (100%) rename mods/skinsdb/textures/{character_1628.png => character.1628.png} (100%) rename mods/skinsdb/textures/{character_1629.png => character.1629.png} (100%) rename mods/skinsdb/textures/{character_163.png => character.163.png} (100%) rename mods/skinsdb/textures/{character_1630.png => character.1630.png} (100%) rename mods/skinsdb/textures/{character_1631.png => character.1631.png} (100%) rename mods/skinsdb/textures/{character_1632.png => character.1632.png} (100%) rename mods/skinsdb/textures/{character_1633.png => character.1633.png} (100%) rename mods/skinsdb/textures/{character_1634.png => character.1634.png} (100%) rename mods/skinsdb/textures/{character_1635.png => character.1635.png} (100%) rename mods/skinsdb/textures/{character_1636.png => character.1636.png} (100%) rename mods/skinsdb/textures/{character_1637.png => character.1637.png} (100%) rename mods/skinsdb/textures/{character_1638.png => character.1638.png} (100%) rename mods/skinsdb/textures/{character_1639.png => character.1639.png} (100%) rename mods/skinsdb/textures/{character_164.png => character.164.png} (100%) rename mods/skinsdb/textures/{character_1640.png => character.1640.png} (100%) rename mods/skinsdb/textures/{character_1641.png => character.1641.png} (100%) rename mods/skinsdb/textures/{character_1642.png => character.1642.png} (100%) rename mods/skinsdb/textures/{character_1643.png => character.1643.png} (100%) rename mods/skinsdb/textures/{character_1644.png => character.1644.png} (100%) rename mods/skinsdb/textures/{character_1645.png => character.1645.png} (100%) rename mods/skinsdb/textures/{character_1646.png => character.1646.png} (100%) rename mods/skinsdb/textures/{character_1647.png => character.1647.png} (100%) rename mods/skinsdb/textures/{character_1648.png => character.1648.png} (100%) rename mods/skinsdb/textures/{character_1649.png => character.1649.png} (100%) rename mods/skinsdb/textures/{character_165.png => character.165.png} (100%) rename mods/skinsdb/textures/{character_1650.png => character.1650.png} (100%) rename mods/skinsdb/textures/{character_1651.png => character.1651.png} (100%) rename mods/skinsdb/textures/{character_1652.png => character.1652.png} (100%) rename mods/skinsdb/textures/{character_1653.png => character.1653.png} (100%) rename mods/skinsdb/textures/{character_1654.png => character.1654.png} (100%) rename mods/skinsdb/textures/{character_1655.png => character.1655.png} (100%) rename mods/skinsdb/textures/{character_1656.png => character.1656.png} (100%) rename mods/skinsdb/textures/{character_1657.png => character.1657.png} (100%) rename mods/skinsdb/textures/{character_1658.png => character.1658.png} (100%) rename mods/skinsdb/textures/{character_1659.png => character.1659.png} (100%) rename mods/skinsdb/textures/{character_166.png => character.166.png} (100%) rename mods/skinsdb/textures/{character_1660.png => character.1660.png} (100%) rename mods/skinsdb/textures/{character_1661.png => character.1661.png} (100%) rename mods/skinsdb/textures/{character_1662.png => character.1662.png} (100%) rename mods/skinsdb/textures/{character_1663.png => character.1663.png} (100%) rename mods/skinsdb/textures/{character_1664.png => character.1664.png} (100%) rename mods/skinsdb/textures/{character_1665.png => character.1665.png} (100%) rename mods/skinsdb/textures/{character_1666.png => character.1666.png} (100%) rename mods/skinsdb/textures/{character_1667.png => character.1667.png} (100%) rename mods/skinsdb/textures/{character_1668.png => character.1668.png} (100%) rename mods/skinsdb/textures/{character_1669.png => character.1669.png} (100%) rename mods/skinsdb/textures/{character_167.png => character.167.png} (100%) rename mods/skinsdb/textures/{character_1670.png => character.1670.png} (100%) rename mods/skinsdb/textures/{character_1671.png => character.1671.png} (100%) rename mods/skinsdb/textures/{character_1672.png => character.1672.png} (100%) rename mods/skinsdb/textures/{character_1673.png => character.1673.png} (100%) rename mods/skinsdb/textures/{character_1674.png => character.1674.png} (100%) rename mods/skinsdb/textures/{character_1675.png => character.1675.png} (100%) rename mods/skinsdb/textures/{character_1676.png => character.1676.png} (100%) rename mods/skinsdb/textures/{character_1677.png => character.1677.png} (100%) rename mods/skinsdb/textures/{character_1678.png => character.1678.png} (100%) rename mods/skinsdb/textures/{character_1679.png => character.1679.png} (100%) rename mods/skinsdb/textures/{character_168.png => character.168.png} (100%) rename mods/skinsdb/textures/{character_1680.png => character.1680.png} (100%) rename mods/skinsdb/textures/{character_1681.png => character.1681.png} (100%) rename mods/skinsdb/textures/{character_1682.png => character.1682.png} (100%) rename mods/skinsdb/textures/{character_1683.png => character.1683.png} (100%) rename mods/skinsdb/textures/{character_1684.png => character.1684.png} (100%) rename mods/skinsdb/textures/{character_1685.png => character.1685.png} (100%) rename mods/skinsdb/textures/{character_1686.png => character.1686.png} (100%) rename mods/skinsdb/textures/{character_1687.png => character.1687.png} (100%) rename mods/skinsdb/textures/{character_1688.png => character.1688.png} (100%) rename mods/skinsdb/textures/{character_1689.png => character.1689.png} (100%) rename mods/skinsdb/textures/{character_169.png => character.169.png} (100%) rename mods/skinsdb/textures/{character_1690.png => character.1690.png} (100%) rename mods/skinsdb/textures/{character_1691.png => character.1691.png} (100%) rename mods/skinsdb/textures/{character_1692.png => character.1692.png} (100%) rename mods/skinsdb/textures/{character_1693.png => character.1693.png} (100%) rename mods/skinsdb/textures/{character_1694.png => character.1694.png} (100%) rename mods/skinsdb/textures/{character_1695.png => character.1695.png} (100%) rename mods/skinsdb/textures/{character_1696.png => character.1696.png} (100%) rename mods/skinsdb/textures/{character_1697.png => character.1697.png} (100%) rename mods/skinsdb/textures/{character_1698.png => character.1698.png} (100%) rename mods/skinsdb/textures/{character_1699.png => character.1699.png} (100%) rename mods/skinsdb/textures/{character_170.png => character.170.png} (100%) rename mods/skinsdb/textures/{character_1700.png => character.1700.png} (100%) rename mods/skinsdb/textures/{character_1701.png => character.1701.png} (100%) rename mods/skinsdb/textures/{character_1702.png => character.1702.png} (100%) rename mods/skinsdb/textures/{character_1703.png => character.1703.png} (100%) rename mods/skinsdb/textures/{character_1704.png => character.1704.png} (100%) rename mods/skinsdb/textures/{character_1705.png => character.1705.png} (100%) rename mods/skinsdb/textures/{character_1706.png => character.1706.png} (100%) rename mods/skinsdb/textures/{character_1707.png => character.1707.png} (100%) rename mods/skinsdb/textures/{character_1708.png => character.1708.png} (100%) rename mods/skinsdb/textures/{character_1709.png => character.1709.png} (100%) rename mods/skinsdb/textures/{character_171.png => character.171.png} (100%) rename mods/skinsdb/textures/{character_1710.png => character.1710.png} (100%) rename mods/skinsdb/textures/{character_1711.png => character.1711.png} (100%) rename mods/skinsdb/textures/{character_1712.png => character.1712.png} (100%) rename mods/skinsdb/textures/{character_1713.png => character.1713.png} (100%) rename mods/skinsdb/textures/{character_1714.png => character.1714.png} (100%) rename mods/skinsdb/textures/{character_1715.png => character.1715.png} (100%) rename mods/skinsdb/textures/{character_1716.png => character.1716.png} (100%) rename mods/skinsdb/textures/{character_1717.png => character.1717.png} (100%) rename mods/skinsdb/textures/{character_1718.png => character.1718.png} (100%) rename mods/skinsdb/textures/{character_1719.png => character.1719.png} (100%) rename mods/skinsdb/textures/{character_172.png => character.172.png} (100%) rename mods/skinsdb/textures/{character_1720.png => character.1720.png} (100%) rename mods/skinsdb/textures/{character_1721.png => character.1721.png} (100%) rename mods/skinsdb/textures/{character_1722.png => character.1722.png} (100%) rename mods/skinsdb/textures/{character_1723.png => character.1723.png} (100%) rename mods/skinsdb/textures/{character_1724.png => character.1724.png} (100%) rename mods/skinsdb/textures/{character_1725.png => character.1725.png} (100%) rename mods/skinsdb/textures/{character_1726.png => character.1726.png} (100%) rename mods/skinsdb/textures/{character_1727.png => character.1727.png} (100%) rename mods/skinsdb/textures/{character_1728.png => character.1728.png} (100%) rename mods/skinsdb/textures/{character_1729.png => character.1729.png} (100%) rename mods/skinsdb/textures/{character_173.png => character.173.png} (100%) rename mods/skinsdb/textures/{character_1730.png => character.1730.png} (100%) rename mods/skinsdb/textures/{character_1731.png => character.1731.png} (100%) rename mods/skinsdb/textures/{character_1732.png => character.1732.png} (100%) rename mods/skinsdb/textures/{character_1733.png => character.1733.png} (100%) rename mods/skinsdb/textures/{character_1734.png => character.1734.png} (100%) rename mods/skinsdb/textures/{character_1735.png => character.1735.png} (100%) rename mods/skinsdb/textures/{character_1736.png => character.1736.png} (100%) rename mods/skinsdb/textures/{character_1737.png => character.1737.png} (100%) rename mods/skinsdb/textures/{character_1738.png => character.1738.png} (100%) rename mods/skinsdb/textures/{character_1739.png => character.1739.png} (100%) rename mods/skinsdb/textures/{character_174.png => character.174.png} (100%) rename mods/skinsdb/textures/{character_1740.png => character.1740.png} (100%) rename mods/skinsdb/textures/{character_1741.png => character.1741.png} (100%) rename mods/skinsdb/textures/{character_1742.png => character.1742.png} (100%) rename mods/skinsdb/textures/{character_1743.png => character.1743.png} (100%) rename mods/skinsdb/textures/{character_1744.png => character.1744.png} (100%) rename mods/skinsdb/textures/{character_1745.png => character.1745.png} (100%) rename mods/skinsdb/textures/{character_1746.png => character.1746.png} (100%) rename mods/skinsdb/textures/{character_1747.png => character.1747.png} (100%) rename mods/skinsdb/textures/{character_1748.png => character.1748.png} (100%) rename mods/skinsdb/textures/{character_1749.png => character.1749.png} (100%) rename mods/skinsdb/textures/{character_175.png => character.175.png} (100%) rename mods/skinsdb/textures/{character_1750.png => character.1750.png} (100%) rename mods/skinsdb/textures/{character_1751.png => character.1751.png} (100%) rename mods/skinsdb/textures/{character_1752.png => character.1752.png} (100%) rename mods/skinsdb/textures/{character_1753.png => character.1753.png} (100%) rename mods/skinsdb/textures/{character_1754.png => character.1754.png} (100%) rename mods/skinsdb/textures/{character_1755.png => character.1755.png} (100%) rename mods/skinsdb/textures/{character_1756.png => character.1756.png} (100%) rename mods/skinsdb/textures/{character_1757.png => character.1757.png} (100%) rename mods/skinsdb/textures/{character_1758.png => character.1758.png} (100%) rename mods/skinsdb/textures/{character_1759.png => character.1759.png} (100%) rename mods/skinsdb/textures/{character_176.png => character.176.png} (100%) rename mods/skinsdb/textures/{character_1760.png => character.1760.png} (100%) rename mods/skinsdb/textures/{character_1761.png => character.1761.png} (100%) rename mods/skinsdb/textures/{character_1762.png => character.1762.png} (100%) rename mods/skinsdb/textures/{character_1763.png => character.1763.png} (100%) rename mods/skinsdb/textures/{character_1764.png => character.1764.png} (100%) rename mods/skinsdb/textures/{character_1765.png => character.1765.png} (100%) rename mods/skinsdb/textures/{character_1766.png => character.1766.png} (100%) rename mods/skinsdb/textures/{character_1767.png => character.1767.png} (100%) rename mods/skinsdb/textures/{character_1768.png => character.1768.png} (100%) rename mods/skinsdb/textures/{character_1769.png => character.1769.png} (100%) rename mods/skinsdb/textures/{character_177.png => character.177.png} (100%) rename mods/skinsdb/textures/{character_1770.png => character.1770.png} (100%) rename mods/skinsdb/textures/{character_1771.png => character.1771.png} (100%) rename mods/skinsdb/textures/{character_1772.png => character.1772.png} (100%) rename mods/skinsdb/textures/{character_1773.png => character.1773.png} (100%) rename mods/skinsdb/textures/{character_1774.png => character.1774.png} (100%) rename mods/skinsdb/textures/{character_1775.png => character.1775.png} (100%) rename mods/skinsdb/textures/{character_1776.png => character.1776.png} (100%) rename mods/skinsdb/textures/{character_1778.png => character.1778.png} (100%) rename mods/skinsdb/textures/{character_1779.png => character.1779.png} (100%) rename mods/skinsdb/textures/{character_178.png => character.178.png} (100%) rename mods/skinsdb/textures/{character_1780.png => character.1780.png} (100%) rename mods/skinsdb/textures/{character_1781.png => character.1781.png} (100%) rename mods/skinsdb/textures/{character_1782.png => character.1782.png} (100%) rename mods/skinsdb/textures/{character_1783.png => character.1783.png} (100%) rename mods/skinsdb/textures/{character_1784.png => character.1784.png} (100%) rename mods/skinsdb/textures/{character_1785.png => character.1785.png} (100%) rename mods/skinsdb/textures/{character_1786.png => character.1786.png} (100%) rename mods/skinsdb/textures/{character_1787.png => character.1787.png} (100%) rename mods/skinsdb/textures/{character_1788.png => character.1788.png} (100%) rename mods/skinsdb/textures/{character_1789.png => character.1789.png} (100%) rename mods/skinsdb/textures/{character_179.png => character.179.png} (100%) rename mods/skinsdb/textures/{character_1790.png => character.1790.png} (100%) rename mods/skinsdb/textures/{character_1791.png => character.1791.png} (100%) rename mods/skinsdb/textures/{character_1792.png => character.1792.png} (100%) rename mods/skinsdb/textures/{character_1793.png => character.1793.png} (100%) rename mods/skinsdb/textures/{character_1794.png => character.1794.png} (100%) rename mods/skinsdb/textures/{character_1796.png => character.1796.png} (100%) rename mods/skinsdb/textures/{character_1797.png => character.1797.png} (100%) rename mods/skinsdb/textures/{character_1798.png => character.1798.png} (100%) rename mods/skinsdb/textures/{character_1799.png => character.1799.png} (100%) rename mods/skinsdb/textures/{character_180.png => character.180.png} (100%) rename mods/skinsdb/textures/{character_1800.png => character.1800.png} (100%) rename mods/skinsdb/textures/{character_1801.png => character.1801.png} (100%) rename mods/skinsdb/textures/{character_1802.png => character.1802.png} (100%) rename mods/skinsdb/textures/{character_1803.png => character.1803.png} (100%) rename mods/skinsdb/textures/{character_1804.png => character.1804.png} (100%) rename mods/skinsdb/textures/{character_1805.png => character.1805.png} (100%) rename mods/skinsdb/textures/{character_1806.png => character.1806.png} (100%) rename mods/skinsdb/textures/{character_1807.png => character.1807.png} (100%) rename mods/skinsdb/textures/{character_1808.png => character.1808.png} (100%) rename mods/skinsdb/textures/{character_1809.png => character.1809.png} (100%) rename mods/skinsdb/textures/{character_181.png => character.181.png} (100%) rename mods/skinsdb/textures/{character_1810.png => character.1810.png} (100%) rename mods/skinsdb/textures/{character_1811.png => character.1811.png} (100%) rename mods/skinsdb/textures/{character_1812.png => character.1812.png} (100%) rename mods/skinsdb/textures/{character_1813.png => character.1813.png} (100%) rename mods/skinsdb/textures/{character_1814.png => character.1814.png} (100%) rename mods/skinsdb/textures/{character_1815.png => character.1815.png} (100%) rename mods/skinsdb/textures/{character_1816.png => character.1816.png} (100%) rename mods/skinsdb/textures/{character_1817.png => character.1817.png} (100%) rename mods/skinsdb/textures/{character_1818.png => character.1818.png} (100%) rename mods/skinsdb/textures/{character_1819.png => character.1819.png} (100%) rename mods/skinsdb/textures/{character_182.png => character.182.png} (100%) rename mods/skinsdb/textures/{character_1820.png => character.1820.png} (100%) rename mods/skinsdb/textures/{character_1821.png => character.1821.png} (100%) rename mods/skinsdb/textures/{character_1822.png => character.1822.png} (100%) rename mods/skinsdb/textures/{character_1823.png => character.1823.png} (100%) rename mods/skinsdb/textures/{character_1824.png => character.1824.png} (100%) rename mods/skinsdb/textures/{character_1825.png => character.1825.png} (100%) rename mods/skinsdb/textures/{character_1826.png => character.1826.png} (100%) rename mods/skinsdb/textures/{character_1827.png => character.1827.png} (100%) rename mods/skinsdb/textures/{character_1828.png => character.1828.png} (100%) rename mods/skinsdb/textures/{character_1829.png => character.1829.png} (100%) rename mods/skinsdb/textures/{character_183.png => character.183.png} (100%) rename mods/skinsdb/textures/{character_1830.png => character.1830.png} (100%) rename mods/skinsdb/textures/{character_1831.png => character.1831.png} (100%) rename mods/skinsdb/textures/{character_1832.png => character.1832.png} (100%) rename mods/skinsdb/textures/{character_1833.png => character.1833.png} (100%) rename mods/skinsdb/textures/{character_1834.png => character.1834.png} (100%) rename mods/skinsdb/textures/{character_1835.png => character.1835.png} (100%) rename mods/skinsdb/textures/{character_1836.png => character.1836.png} (100%) rename mods/skinsdb/textures/{character_1837.png => character.1837.png} (100%) rename mods/skinsdb/textures/{character_1838.png => character.1838.png} (100%) rename mods/skinsdb/textures/{character_1839.png => character.1839.png} (100%) rename mods/skinsdb/textures/{character_184.png => character.184.png} (100%) rename mods/skinsdb/textures/{character_1840.png => character.1840.png} (100%) rename mods/skinsdb/textures/{character_1841.png => character.1841.png} (100%) rename mods/skinsdb/textures/{character_1842.png => character.1842.png} (100%) rename mods/skinsdb/textures/{character_1843.png => character.1843.png} (100%) rename mods/skinsdb/textures/{character_1844.png => character.1844.png} (100%) rename mods/skinsdb/textures/{character_1845.png => character.1845.png} (100%) rename mods/skinsdb/textures/{character_1846.png => character.1846.png} (100%) rename mods/skinsdb/textures/{character_1847.png => character.1847.png} (100%) rename mods/skinsdb/textures/{character_1848.png => character.1848.png} (100%) rename mods/skinsdb/textures/{character_1849.png => character.1849.png} (100%) rename mods/skinsdb/textures/{character_185.png => character.185.png} (100%) rename mods/skinsdb/textures/{character_1850.png => character.1850.png} (100%) rename mods/skinsdb/textures/{character_1851.png => character.1851.png} (100%) rename mods/skinsdb/textures/{character_1852.png => character.1852.png} (100%) rename mods/skinsdb/textures/{character_1853.png => character.1853.png} (100%) rename mods/skinsdb/textures/{character_1854.png => character.1854.png} (100%) rename mods/skinsdb/textures/{character_1855.png => character.1855.png} (100%) rename mods/skinsdb/textures/{character_1856.png => character.1856.png} (100%) rename mods/skinsdb/textures/{character_1857.png => character.1857.png} (100%) rename mods/skinsdb/textures/{character_1858.png => character.1858.png} (100%) rename mods/skinsdb/textures/{character_1859.png => character.1859.png} (100%) rename mods/skinsdb/textures/{character_186.png => character.186.png} (100%) rename mods/skinsdb/textures/{character_1860.png => character.1860.png} (100%) rename mods/skinsdb/textures/{character_1861.png => character.1861.png} (100%) rename mods/skinsdb/textures/{character_1862.png => character.1862.png} (100%) rename mods/skinsdb/textures/{character_1863.png => character.1863.png} (100%) rename mods/skinsdb/textures/{character_1864.png => character.1864.png} (100%) rename mods/skinsdb/textures/{character_1865.png => character.1865.png} (100%) rename mods/skinsdb/textures/{character_1866.png => character.1866.png} (100%) rename mods/skinsdb/textures/{character_1867.png => character.1867.png} (100%) rename mods/skinsdb/textures/{character_1868.png => character.1868.png} (100%) rename mods/skinsdb/textures/{character_1869.png => character.1869.png} (100%) rename mods/skinsdb/textures/{character_187.png => character.187.png} (100%) rename mods/skinsdb/textures/{character_1870.png => character.1870.png} (100%) rename mods/skinsdb/textures/{character_1871.png => character.1871.png} (100%) rename mods/skinsdb/textures/{character_1872.png => character.1872.png} (100%) rename mods/skinsdb/textures/{character_1873.png => character.1873.png} (100%) rename mods/skinsdb/textures/{character_1874.png => character.1874.png} (100%) rename mods/skinsdb/textures/{character_1875.png => character.1875.png} (100%) rename mods/skinsdb/textures/{character_1876.png => character.1876.png} (100%) rename mods/skinsdb/textures/{character_1877.png => character.1877.png} (100%) rename mods/skinsdb/textures/{character_1878.png => character.1878.png} (100%) rename mods/skinsdb/textures/{character_1879.png => character.1879.png} (100%) rename mods/skinsdb/textures/{character_188.png => character.188.png} (100%) rename mods/skinsdb/textures/{character_1880.png => character.1880.png} (100%) rename mods/skinsdb/textures/{character_1881.png => character.1881.png} (100%) rename mods/skinsdb/textures/{character_1882.png => character.1882.png} (100%) rename mods/skinsdb/textures/{character_1883.png => character.1883.png} (100%) rename mods/skinsdb/textures/{character_1884.png => character.1884.png} (100%) rename mods/skinsdb/textures/{character_1885.png => character.1885.png} (100%) rename mods/skinsdb/textures/{character_1886.png => character.1886.png} (100%) rename mods/skinsdb/textures/{character_1887.png => character.1887.png} (100%) rename mods/skinsdb/textures/{character_1888.png => character.1888.png} (100%) rename mods/skinsdb/textures/{character_1889.png => character.1889.png} (100%) rename mods/skinsdb/textures/{character_189.png => character.189.png} (100%) rename mods/skinsdb/textures/{character_1890.png => character.1890.png} (100%) rename mods/skinsdb/textures/{character_1891.png => character.1891.png} (100%) rename mods/skinsdb/textures/{character_1892.png => character.1892.png} (100%) rename mods/skinsdb/textures/{character_1893.png => character.1893.png} (100%) rename mods/skinsdb/textures/{character_1894.png => character.1894.png} (100%) rename mods/skinsdb/textures/{character_1895.png => character.1895.png} (100%) rename mods/skinsdb/textures/{character_1896.png => character.1896.png} (100%) rename mods/skinsdb/textures/{character_1897.png => character.1897.png} (100%) rename mods/skinsdb/textures/{character_1898.png => character.1898.png} (100%) rename mods/skinsdb/textures/{character_1899.png => character.1899.png} (100%) rename mods/skinsdb/textures/{character_19.png => character.19.png} (100%) rename mods/skinsdb/textures/{character_190.png => character.190.png} (100%) rename mods/skinsdb/textures/{character_1900.png => character.1900.png} (100%) rename mods/skinsdb/textures/{character_1901.png => character.1901.png} (100%) rename mods/skinsdb/textures/{character_1902.png => character.1902.png} (100%) rename mods/skinsdb/textures/{character_1903.png => character.1903.png} (100%) rename mods/skinsdb/textures/{character_1904.png => character.1904.png} (100%) rename mods/skinsdb/textures/{character_1905.png => character.1905.png} (100%) rename mods/skinsdb/textures/{character_1906.png => character.1906.png} (100%) rename mods/skinsdb/textures/{character_1907.png => character.1907.png} (100%) rename mods/skinsdb/textures/{character_1908.png => character.1908.png} (100%) rename mods/skinsdb/textures/{character_1909.png => character.1909.png} (100%) rename mods/skinsdb/textures/{character_191.png => character.191.png} (100%) rename mods/skinsdb/textures/{character_1910.png => character.1910.png} (100%) rename mods/skinsdb/textures/{character_1911.png => character.1911.png} (100%) rename mods/skinsdb/textures/{character_1912.png => character.1912.png} (100%) rename mods/skinsdb/textures/{character_1913.png => character.1913.png} (100%) rename mods/skinsdb/textures/{character_1914.png => character.1914.png} (100%) rename mods/skinsdb/textures/{character_1915.png => character.1915.png} (100%) rename mods/skinsdb/textures/{character_1916.png => character.1916.png} (100%) rename mods/skinsdb/textures/{character_1917.png => character.1917.png} (100%) rename mods/skinsdb/textures/{character_1918.png => character.1918.png} (100%) rename mods/skinsdb/textures/{character_1919.png => character.1919.png} (100%) rename mods/skinsdb/textures/{character_192.png => character.192.png} (100%) rename mods/skinsdb/textures/{character_1920.png => character.1920.png} (100%) rename mods/skinsdb/textures/{character_1921.png => character.1921.png} (100%) rename mods/skinsdb/textures/{character_1922.png => character.1922.png} (100%) rename mods/skinsdb/textures/{character_1923.png => character.1923.png} (100%) rename mods/skinsdb/textures/{character_1924.png => character.1924.png} (100%) rename mods/skinsdb/textures/{character_1925.png => character.1925.png} (100%) rename mods/skinsdb/textures/{character_1926.png => character.1926.png} (100%) rename mods/skinsdb/textures/{character_1927.png => character.1927.png} (100%) rename mods/skinsdb/textures/{character_1928.png => character.1928.png} (100%) rename mods/skinsdb/textures/{character_1929.png => character.1929.png} (100%) rename mods/skinsdb/textures/{character_193.png => character.193.png} (100%) rename mods/skinsdb/textures/{character_1930.png => character.1930.png} (100%) rename mods/skinsdb/textures/{character_1931.png => character.1931.png} (100%) rename mods/skinsdb/textures/{character_1932.png => character.1932.png} (100%) rename mods/skinsdb/textures/{character_1933.png => character.1933.png} (100%) rename mods/skinsdb/textures/{character_1934.png => character.1934.png} (100%) rename mods/skinsdb/textures/{character_1935.png => character.1935.png} (100%) rename mods/skinsdb/textures/{character_1937.png => character.1937.png} (100%) rename mods/skinsdb/textures/{character_1938.png => character.1938.png} (100%) rename mods/skinsdb/textures/{character_1939.png => character.1939.png} (100%) rename mods/skinsdb/textures/{character_194.png => character.194.png} (100%) rename mods/skinsdb/textures/{character_1940.png => character.1940.png} (100%) rename mods/skinsdb/textures/{character_1941.png => character.1941.png} (100%) rename mods/skinsdb/textures/{character_1942.png => character.1942.png} (100%) rename mods/skinsdb/textures/{character_1943.png => character.1943.png} (100%) rename mods/skinsdb/textures/{character_1944.png => character.1944.png} (100%) rename mods/skinsdb/textures/{character_1945.png => character.1945.png} (100%) rename mods/skinsdb/textures/{character_1946.png => character.1946.png} (100%) rename mods/skinsdb/textures/{character_1947.png => character.1947.png} (100%) rename mods/skinsdb/textures/{character_1948.png => character.1948.png} (100%) rename mods/skinsdb/textures/{character_1949.png => character.1949.png} (100%) rename mods/skinsdb/textures/{character_195.png => character.195.png} (100%) rename mods/skinsdb/textures/{character_1950.png => character.1950.png} (100%) rename mods/skinsdb/textures/{character_1951.png => character.1951.png} (100%) rename mods/skinsdb/textures/{character_1952.png => character.1952.png} (100%) rename mods/skinsdb/textures/{character_1953.png => character.1953.png} (100%) rename mods/skinsdb/textures/{character_1954.png => character.1954.png} (100%) rename mods/skinsdb/textures/{character_1955.png => character.1955.png} (100%) rename mods/skinsdb/textures/{character_1956.png => character.1956.png} (100%) rename mods/skinsdb/textures/{character_1957.png => character.1957.png} (100%) rename mods/skinsdb/textures/{character_1958.png => character.1958.png} (100%) rename mods/skinsdb/textures/{character_1959.png => character.1959.png} (100%) rename mods/skinsdb/textures/{character_196.png => character.196.png} (100%) rename mods/skinsdb/textures/{character_1960.png => character.1960.png} (100%) rename mods/skinsdb/textures/{character_1961.png => character.1961.png} (100%) rename mods/skinsdb/textures/{character_1962.png => character.1962.png} (100%) rename mods/skinsdb/textures/{character_1963.png => character.1963.png} (100%) rename mods/skinsdb/textures/{character_1964.png => character.1964.png} (100%) rename mods/skinsdb/textures/{character_1965.png => character.1965.png} (100%) rename mods/skinsdb/textures/{character_1966.png => character.1966.png} (100%) rename mods/skinsdb/textures/{character_1967.png => character.1967.png} (100%) rename mods/skinsdb/textures/{character_1968.png => character.1968.png} (100%) rename mods/skinsdb/textures/{character_1969.png => character.1969.png} (100%) rename mods/skinsdb/textures/{character_197.png => character.197.png} (100%) rename mods/skinsdb/textures/{character_1970.png => character.1970.png} (100%) rename mods/skinsdb/textures/{character_1971.png => character.1971.png} (100%) rename mods/skinsdb/textures/{character_1972.png => character.1972.png} (100%) rename mods/skinsdb/textures/{character_1973.png => character.1973.png} (100%) rename mods/skinsdb/textures/{character_1974.png => character.1974.png} (100%) rename mods/skinsdb/textures/{character_1975.png => character.1975.png} (100%) rename mods/skinsdb/textures/{character_1976.png => character.1976.png} (100%) rename mods/skinsdb/textures/{character_1977.png => character.1977.png} (100%) rename mods/skinsdb/textures/{character_1978.png => character.1978.png} (100%) rename mods/skinsdb/textures/{character_1979.png => character.1979.png} (100%) rename mods/skinsdb/textures/{character_198.png => character.198.png} (100%) rename mods/skinsdb/textures/{character_1980.png => character.1980.png} (100%) rename mods/skinsdb/textures/{character_1981.png => character.1981.png} (100%) rename mods/skinsdb/textures/{character_1982.png => character.1982.png} (100%) rename mods/skinsdb/textures/{character_1983.png => character.1983.png} (100%) rename mods/skinsdb/textures/{character_1984.png => character.1984.png} (100%) rename mods/skinsdb/textures/{character_1985.png => character.1985.png} (100%) rename mods/skinsdb/textures/{character_1986.png => character.1986.png} (100%) rename mods/skinsdb/textures/{character_1987.png => character.1987.png} (100%) rename mods/skinsdb/textures/{character_1988.png => character.1988.png} (100%) rename mods/skinsdb/textures/{character_1989.png => character.1989.png} (100%) rename mods/skinsdb/textures/{character_199.png => character.199.png} (100%) rename mods/skinsdb/textures/{character_1990.png => character.1990.png} (100%) rename mods/skinsdb/textures/{character_1991.png => character.1991.png} (100%) rename mods/skinsdb/textures/{character_1992.png => character.1992.png} (100%) rename mods/skinsdb/textures/{character_1993.png => character.1993.png} (100%) rename mods/skinsdb/textures/{character_1994.png => character.1994.png} (100%) rename mods/skinsdb/textures/{character_1995.png => character.1995.png} (100%) rename mods/skinsdb/textures/{character_1996.png => character.1996.png} (100%) rename mods/skinsdb/textures/{character_1997.png => character.1997.png} (100%) rename mods/skinsdb/textures/{character_1998.png => character.1998.png} (100%) rename mods/skinsdb/textures/{character_1999.png => character.1999.png} (100%) rename mods/skinsdb/textures/{character_2.png => character.2.png} (100%) rename mods/skinsdb/textures/{character_20.png => character.20.png} (100%) rename mods/skinsdb/textures/{character_200.png => character.200.png} (100%) rename mods/skinsdb/textures/{character_2000.png => character.2000.png} (100%) rename mods/skinsdb/textures/{character_2001.png => character.2001.png} (100%) rename mods/skinsdb/textures/{character_2002.png => character.2002.png} (100%) rename mods/skinsdb/textures/{character_2003.png => character.2003.png} (100%) rename mods/skinsdb/textures/{character_2004.png => character.2004.png} (100%) rename mods/skinsdb/textures/{character_2005.png => character.2005.png} (100%) rename mods/skinsdb/textures/{character_2006.png => character.2006.png} (100%) rename mods/skinsdb/textures/{character_2007.png => character.2007.png} (100%) rename mods/skinsdb/textures/{character_2008.png => character.2008.png} (100%) rename mods/skinsdb/textures/{character_2009.png => character.2009.png} (100%) rename mods/skinsdb/textures/{character_201.png => character.201.png} (100%) rename mods/skinsdb/textures/{character_2010.png => character.2010.png} (100%) rename mods/skinsdb/textures/{character_2011.png => character.2011.png} (100%) rename mods/skinsdb/textures/{character_2012.png => character.2012.png} (100%) rename mods/skinsdb/textures/{character_2013.png => character.2013.png} (100%) rename mods/skinsdb/textures/{character_2014.png => character.2014.png} (100%) rename mods/skinsdb/textures/{character_2015.png => character.2015.png} (100%) rename mods/skinsdb/textures/{character_2016.png => character.2016.png} (100%) rename mods/skinsdb/textures/{character_2017.png => character.2017.png} (100%) rename mods/skinsdb/textures/{character_2018.png => character.2018.png} (100%) rename mods/skinsdb/textures/{character_2019.png => character.2019.png} (100%) rename mods/skinsdb/textures/{character_2020.png => character.2020.png} (100%) rename mods/skinsdb/textures/{character_2021.png => character.2021.png} (100%) rename mods/skinsdb/textures/{character_2022.png => character.2022.png} (100%) rename mods/skinsdb/textures/{character_2023.png => character.2023.png} (100%) rename mods/skinsdb/textures/{character_2024.png => character.2024.png} (100%) rename mods/skinsdb/textures/{character_2025.png => character.2025.png} (100%) rename mods/skinsdb/textures/{character_2026.png => character.2026.png} (100%) rename mods/skinsdb/textures/{character_2027.png => character.2027.png} (100%) rename mods/skinsdb/textures/{character_2028.png => character.2028.png} (100%) rename mods/skinsdb/textures/{character_2029.png => character.2029.png} (100%) rename mods/skinsdb/textures/{character_203.png => character.203.png} (100%) rename mods/skinsdb/textures/{character_2030.png => character.2030.png} (100%) rename mods/skinsdb/textures/{character_2031.png => character.2031.png} (100%) rename mods/skinsdb/textures/{character_2032.png => character.2032.png} (100%) rename mods/skinsdb/textures/{character_2033.png => character.2033.png} (100%) rename mods/skinsdb/textures/{character_2034.png => character.2034.png} (100%) rename mods/skinsdb/textures/{character_2035.png => character.2035.png} (100%) rename mods/skinsdb/textures/{character_2036.png => character.2036.png} (100%) rename mods/skinsdb/textures/{character_2037.png => character.2037.png} (100%) rename mods/skinsdb/textures/{character_2038.png => character.2038.png} (100%) rename mods/skinsdb/textures/{character_2039.png => character.2039.png} (100%) rename mods/skinsdb/textures/{character_2040.png => character.2040.png} (100%) rename mods/skinsdb/textures/{character_2041.png => character.2041.png} (100%) rename mods/skinsdb/textures/{character_2042.png => character.2042.png} (100%) rename mods/skinsdb/textures/{character_2043.png => character.2043.png} (100%) rename mods/skinsdb/textures/{character_2044.png => character.2044.png} (100%) rename mods/skinsdb/textures/{character_2045.png => character.2045.png} (100%) rename mods/skinsdb/textures/{character_2046.png => character.2046.png} (100%) rename mods/skinsdb/textures/{character_2047.png => character.2047.png} (100%) rename mods/skinsdb/textures/{character_2048.png => character.2048.png} (100%) rename mods/skinsdb/textures/{character_2049.png => character.2049.png} (100%) rename mods/skinsdb/textures/{character_205.png => character.205.png} (100%) rename mods/skinsdb/textures/{character_2050.png => character.2050.png} (100%) rename mods/skinsdb/textures/{character_2051.png => character.2051.png} (100%) rename mods/skinsdb/textures/{character_2052.png => character.2052.png} (100%) rename mods/skinsdb/textures/{character_2053.png => character.2053.png} (100%) rename mods/skinsdb/textures/{character_2054.png => character.2054.png} (100%) rename mods/skinsdb/textures/{character_2055.png => character.2055.png} (100%) rename mods/skinsdb/textures/{character_2056.png => character.2056.png} (100%) rename mods/skinsdb/textures/{character_2057.png => character.2057.png} (100%) rename mods/skinsdb/textures/{character_2058.png => character.2058.png} (100%) rename mods/skinsdb/textures/{character_2059.png => character.2059.png} (100%) rename mods/skinsdb/textures/{character_206.png => character.206.png} (100%) rename mods/skinsdb/textures/{character_2060.png => character.2060.png} (100%) rename mods/skinsdb/textures/{character_2061.png => character.2061.png} (100%) rename mods/skinsdb/textures/{character_2062.png => character.2062.png} (100%) rename mods/skinsdb/textures/{character_2063.png => character.2063.png} (100%) rename mods/skinsdb/textures/{character_2064.png => character.2064.png} (100%) rename mods/skinsdb/textures/{character_2065.png => character.2065.png} (100%) rename mods/skinsdb/textures/{character_2066.png => character.2066.png} (100%) rename mods/skinsdb/textures/{character_2067.png => character.2067.png} (100%) rename mods/skinsdb/textures/{character_2068.png => character.2068.png} (100%) rename mods/skinsdb/textures/{character_2069.png => character.2069.png} (100%) rename mods/skinsdb/textures/{character_207.png => character.207.png} (100%) rename mods/skinsdb/textures/{character_2070.png => character.2070.png} (100%) rename mods/skinsdb/textures/{character_2071.png => character.2071.png} (100%) rename mods/skinsdb/textures/{character_2072.png => character.2072.png} (100%) rename mods/skinsdb/textures/{character_2073.png => character.2073.png} (100%) rename mods/skinsdb/textures/{character_2074.png => character.2074.png} (100%) rename mods/skinsdb/textures/{character_2075.png => character.2075.png} (100%) rename mods/skinsdb/textures/{character_2076.png => character.2076.png} (100%) rename mods/skinsdb/textures/{character_2077.png => character.2077.png} (100%) rename mods/skinsdb/textures/{character_2078.png => character.2078.png} (100%) rename mods/skinsdb/textures/{character_2079.png => character.2079.png} (100%) rename mods/skinsdb/textures/{character_208.png => character.208.png} (100%) rename mods/skinsdb/textures/{character_2080.png => character.2080.png} (100%) rename mods/skinsdb/textures/{character_2081.png => character.2081.png} (100%) rename mods/skinsdb/textures/{character_2082.png => character.2082.png} (100%) rename mods/skinsdb/textures/{character_2083.png => character.2083.png} (100%) rename mods/skinsdb/textures/{character_2084.png => character.2084.png} (100%) rename mods/skinsdb/textures/{character_2085.png => character.2085.png} (100%) rename mods/skinsdb/textures/{character_2086.png => character.2086.png} (100%) rename mods/skinsdb/textures/{character_2087.png => character.2087.png} (100%) rename mods/skinsdb/textures/{character_2088.png => character.2088.png} (100%) rename mods/skinsdb/textures/{character_2089.png => character.2089.png} (100%) rename mods/skinsdb/textures/{character_209.png => character.209.png} (100%) rename mods/skinsdb/textures/{character_2090.png => character.2090.png} (100%) rename mods/skinsdb/textures/{character_2091.png => character.2091.png} (100%) rename mods/skinsdb/textures/{character_2092.png => character.2092.png} (100%) rename mods/skinsdb/textures/{character_2093.png => character.2093.png} (100%) rename mods/skinsdb/textures/{character_2094.png => character.2094.png} (100%) rename mods/skinsdb/textures/{character_2095.png => character.2095.png} (100%) rename mods/skinsdb/textures/{character_2096.png => character.2096.png} (100%) rename mods/skinsdb/textures/{character_2097.png => character.2097.png} (100%) rename mods/skinsdb/textures/{character_2098.png => character.2098.png} (100%) rename mods/skinsdb/textures/{character_2099.png => character.2099.png} (100%) rename mods/skinsdb/textures/{character_21.png => character.21.png} (100%) rename mods/skinsdb/textures/{character_210.png => character.210.png} (100%) rename mods/skinsdb/textures/{character_2100.png => character.2100.png} (100%) rename mods/skinsdb/textures/{character_2101.png => character.2101.png} (100%) rename mods/skinsdb/textures/{character_2102.png => character.2102.png} (100%) rename mods/skinsdb/textures/{character_2103.png => character.2103.png} (100%) rename mods/skinsdb/textures/{character_2104.png => character.2104.png} (100%) rename mods/skinsdb/textures/{character_2105.png => character.2105.png} (100%) rename mods/skinsdb/textures/{character_2106.png => character.2106.png} (100%) rename mods/skinsdb/textures/{character_2107.png => character.2107.png} (100%) rename mods/skinsdb/textures/{character_2108.png => character.2108.png} (100%) rename mods/skinsdb/textures/{character_2109.png => character.2109.png} (100%) rename mods/skinsdb/textures/{character_211.png => character.211.png} (100%) rename mods/skinsdb/textures/{character_2110.png => character.2110.png} (100%) rename mods/skinsdb/textures/{character_2111.png => character.2111.png} (100%) rename mods/skinsdb/textures/{character_2112.png => character.2112.png} (100%) rename mods/skinsdb/textures/{character_2114.png => character.2114.png} (100%) rename mods/skinsdb/textures/{character_2115.png => character.2115.png} (100%) rename mods/skinsdb/textures/{character_2116.png => character.2116.png} (100%) rename mods/skinsdb/textures/{character_2117.png => character.2117.png} (100%) rename mods/skinsdb/textures/{character_2118.png => character.2118.png} (100%) rename mods/skinsdb/textures/{character_2119.png => character.2119.png} (100%) rename mods/skinsdb/textures/{character_212.png => character.212.png} (100%) rename mods/skinsdb/textures/{character_2120.png => character.2120.png} (100%) rename mods/skinsdb/textures/{character_2121.png => character.2121.png} (100%) rename mods/skinsdb/textures/{character_2122.png => character.2122.png} (100%) rename mods/skinsdb/textures/{character_2123.png => character.2123.png} (100%) rename mods/skinsdb/textures/{character_2124.png => character.2124.png} (100%) rename mods/skinsdb/textures/{character_2125.png => character.2125.png} (100%) rename mods/skinsdb/textures/{character_2126.png => character.2126.png} (100%) rename mods/skinsdb/textures/{character_2127.png => character.2127.png} (100%) rename mods/skinsdb/textures/{character_2128.png => character.2128.png} (100%) rename mods/skinsdb/textures/{character_2129.png => character.2129.png} (100%) rename mods/skinsdb/textures/{character_213.png => character.213.png} (100%) rename mods/skinsdb/textures/{character_2130.png => character.2130.png} (100%) rename mods/skinsdb/textures/{character_2131.png => character.2131.png} (100%) rename mods/skinsdb/textures/{character_2132.png => character.2132.png} (100%) rename mods/skinsdb/textures/{character_2133.png => character.2133.png} (100%) rename mods/skinsdb/textures/{character_2134.png => character.2134.png} (100%) rename mods/skinsdb/textures/{character_2135.png => character.2135.png} (100%) rename mods/skinsdb/textures/{character_2136.png => character.2136.png} (100%) rename mods/skinsdb/textures/{character_2137.png => character.2137.png} (100%) rename mods/skinsdb/textures/{character_2138.png => character.2138.png} (100%) rename mods/skinsdb/textures/{character_2139.png => character.2139.png} (100%) rename mods/skinsdb/textures/{character_214.png => character.214.png} (100%) rename mods/skinsdb/textures/{character_2140.png => character.2140.png} (100%) rename mods/skinsdb/textures/{character_2141.png => character.2141.png} (100%) rename mods/skinsdb/textures/{character_2142.png => character.2142.png} (100%) rename mods/skinsdb/textures/{character_2143.png => character.2143.png} (100%) rename mods/skinsdb/textures/{character_2144.png => character.2144.png} (100%) rename mods/skinsdb/textures/{character_2145.png => character.2145.png} (100%) rename mods/skinsdb/textures/{character_2146.png => character.2146.png} (100%) rename mods/skinsdb/textures/{character_2147.png => character.2147.png} (100%) rename mods/skinsdb/textures/{character_2148.png => character.2148.png} (100%) rename mods/skinsdb/textures/{character_2149.png => character.2149.png} (100%) rename mods/skinsdb/textures/{character_215.png => character.215.png} (100%) rename mods/skinsdb/textures/{character_2150.png => character.2150.png} (100%) rename mods/skinsdb/textures/{character_2151.png => character.2151.png} (100%) rename mods/skinsdb/textures/{character_2152.png => character.2152.png} (100%) rename mods/skinsdb/textures/{character_2153.png => character.2153.png} (100%) create mode 100644 mods/skinsdb/textures/character.2154.png create mode 100644 mods/skinsdb/textures/character.2155.png create mode 100644 mods/skinsdb/textures/character.2156.png create mode 100644 mods/skinsdb/textures/character.2157.png create mode 100644 mods/skinsdb/textures/character.2158.png create mode 100644 mods/skinsdb/textures/character.2159.png rename mods/skinsdb/textures/{character_216.png => character.216.png} (100%) create mode 100644 mods/skinsdb/textures/character.2160.png create mode 100644 mods/skinsdb/textures/character.2161.png create mode 100644 mods/skinsdb/textures/character.2162.png create mode 100644 mods/skinsdb/textures/character.2163.png create mode 100644 mods/skinsdb/textures/character.2164.png create mode 100644 mods/skinsdb/textures/character.2165.png create mode 100644 mods/skinsdb/textures/character.2166.png create mode 100644 mods/skinsdb/textures/character.2167.png create mode 100644 mods/skinsdb/textures/character.2168.png create mode 100644 mods/skinsdb/textures/character.2169.png rename mods/skinsdb/textures/{character_217.png => character.217.png} (100%) create mode 100644 mods/skinsdb/textures/character.2170.png create mode 100644 mods/skinsdb/textures/character.2171.png create mode 100644 mods/skinsdb/textures/character.2172.png create mode 100644 mods/skinsdb/textures/character.2173.png create mode 100644 mods/skinsdb/textures/character.2174.png create mode 100644 mods/skinsdb/textures/character.2175.png create mode 100644 mods/skinsdb/textures/character.2176.png create mode 100644 mods/skinsdb/textures/character.2177.png create mode 100644 mods/skinsdb/textures/character.2178.png create mode 100644 mods/skinsdb/textures/character.2179.png rename mods/skinsdb/textures/{character_218.png => character.218.png} (100%) create mode 100644 mods/skinsdb/textures/character.2180.png create mode 100644 mods/skinsdb/textures/character.2181.png create mode 100644 mods/skinsdb/textures/character.2182.png create mode 100644 mods/skinsdb/textures/character.2183.png create mode 100644 mods/skinsdb/textures/character.2184.png create mode 100644 mods/skinsdb/textures/character.2185.png create mode 100644 mods/skinsdb/textures/character.2186.png create mode 100644 mods/skinsdb/textures/character.2187.png create mode 100644 mods/skinsdb/textures/character.2188.png create mode 100644 mods/skinsdb/textures/character.2189.png rename mods/skinsdb/textures/{character_219.png => character.219.png} (100%) create mode 100644 mods/skinsdb/textures/character.2190.png create mode 100644 mods/skinsdb/textures/character.2191.png create mode 100644 mods/skinsdb/textures/character.2192.png create mode 100644 mods/skinsdb/textures/character.2193.png create mode 100644 mods/skinsdb/textures/character.2194.png create mode 100644 mods/skinsdb/textures/character.2195.png create mode 100644 mods/skinsdb/textures/character.2196.png create mode 100644 mods/skinsdb/textures/character.2197.png create mode 100644 mods/skinsdb/textures/character.2198.png create mode 100644 mods/skinsdb/textures/character.2199.png rename mods/skinsdb/textures/{character_22.png => character.22.png} (100%) rename mods/skinsdb/textures/{character_220.png => character.220.png} (100%) create mode 100644 mods/skinsdb/textures/character.2200.png create mode 100644 mods/skinsdb/textures/character.2201.png create mode 100644 mods/skinsdb/textures/character.2202.png create mode 100644 mods/skinsdb/textures/character.2203.png create mode 100644 mods/skinsdb/textures/character.2204.png create mode 100644 mods/skinsdb/textures/character.2205.png create mode 100644 mods/skinsdb/textures/character.2206.png create mode 100644 mods/skinsdb/textures/character.2207.png create mode 100644 mods/skinsdb/textures/character.2208.png create mode 100644 mods/skinsdb/textures/character.2209.png rename mods/skinsdb/textures/{character_221.png => character.221.png} (100%) create mode 100644 mods/skinsdb/textures/character.2210.png create mode 100644 mods/skinsdb/textures/character.2211.png create mode 100644 mods/skinsdb/textures/character.2212.png create mode 100644 mods/skinsdb/textures/character.2213.png create mode 100644 mods/skinsdb/textures/character.2214.png create mode 100644 mods/skinsdb/textures/character.2215.png create mode 100644 mods/skinsdb/textures/character.2216.png create mode 100644 mods/skinsdb/textures/character.2217.png create mode 100644 mods/skinsdb/textures/character.2218.png create mode 100644 mods/skinsdb/textures/character.2219.png rename mods/skinsdb/textures/{character_222.png => character.222.png} (100%) create mode 100644 mods/skinsdb/textures/character.2220.png create mode 100644 mods/skinsdb/textures/character.2221.png create mode 100644 mods/skinsdb/textures/character.2222.png create mode 100644 mods/skinsdb/textures/character.2223.png create mode 100644 mods/skinsdb/textures/character.2224.png create mode 100644 mods/skinsdb/textures/character.2225.png create mode 100644 mods/skinsdb/textures/character.2226.png create mode 100644 mods/skinsdb/textures/character.2227.png create mode 100644 mods/skinsdb/textures/character.2228.png create mode 100644 mods/skinsdb/textures/character.2229.png rename mods/skinsdb/textures/{character_223.png => character.223.png} (100%) create mode 100644 mods/skinsdb/textures/character.2230.png create mode 100644 mods/skinsdb/textures/character.2231.png create mode 100644 mods/skinsdb/textures/character.2232.png create mode 100644 mods/skinsdb/textures/character.2233.png create mode 100644 mods/skinsdb/textures/character.2234.png create mode 100644 mods/skinsdb/textures/character.2235.png create mode 100644 mods/skinsdb/textures/character.2236.png create mode 100644 mods/skinsdb/textures/character.2237.png create mode 100644 mods/skinsdb/textures/character.2238.png create mode 100644 mods/skinsdb/textures/character.2239.png rename mods/skinsdb/textures/{character_224.png => character.224.png} (100%) create mode 100644 mods/skinsdb/textures/character.2240.png create mode 100644 mods/skinsdb/textures/character.2241.png create mode 100644 mods/skinsdb/textures/character.2242.png create mode 100644 mods/skinsdb/textures/character.2243.png create mode 100644 mods/skinsdb/textures/character.2244.png create mode 100644 mods/skinsdb/textures/character.2245.png create mode 100644 mods/skinsdb/textures/character.2246.png create mode 100644 mods/skinsdb/textures/character.2247.png create mode 100644 mods/skinsdb/textures/character.2248.png create mode 100644 mods/skinsdb/textures/character.2249.png rename mods/skinsdb/textures/{character_225.png => character.225.png} (100%) create mode 100644 mods/skinsdb/textures/character.2250.png create mode 100644 mods/skinsdb/textures/character.2251.png create mode 100644 mods/skinsdb/textures/character.2252.png create mode 100644 mods/skinsdb/textures/character.2253.png create mode 100644 mods/skinsdb/textures/character.2254.png create mode 100644 mods/skinsdb/textures/character.2255.png create mode 100644 mods/skinsdb/textures/character.2256.png create mode 100644 mods/skinsdb/textures/character.2257.png create mode 100644 mods/skinsdb/textures/character.2258.png create mode 100644 mods/skinsdb/textures/character.2259.png create mode 100644 mods/skinsdb/textures/character.2260.png create mode 100644 mods/skinsdb/textures/character.2261.png create mode 100644 mods/skinsdb/textures/character.2262.png create mode 100644 mods/skinsdb/textures/character.2263.png create mode 100644 mods/skinsdb/textures/character.2264.png create mode 100644 mods/skinsdb/textures/character.2277.png create mode 100644 mods/skinsdb/textures/character.2278.png create mode 100644 mods/skinsdb/textures/character.2279.png rename mods/skinsdb/textures/{character_228.png => character.228.png} (100%) create mode 100644 mods/skinsdb/textures/character.2280.png create mode 100644 mods/skinsdb/textures/character.2281.png create mode 100644 mods/skinsdb/textures/character.2282.png create mode 100644 mods/skinsdb/textures/character.2283.png create mode 100644 mods/skinsdb/textures/character.2284.png create mode 100644 mods/skinsdb/textures/character.2285.png create mode 100644 mods/skinsdb/textures/character.2286.png create mode 100644 mods/skinsdb/textures/character.2287.png create mode 100644 mods/skinsdb/textures/character.2288.png create mode 100644 mods/skinsdb/textures/character.2289.png rename mods/skinsdb/textures/{character_229.png => character.229.png} (100%) create mode 100644 mods/skinsdb/textures/character.2290.png create mode 100644 mods/skinsdb/textures/character.2291.png create mode 100644 mods/skinsdb/textures/character.2292.png create mode 100644 mods/skinsdb/textures/character.2293.png create mode 100644 mods/skinsdb/textures/character.2294.png create mode 100644 mods/skinsdb/textures/character.2295.png create mode 100644 mods/skinsdb/textures/character.2296.png create mode 100644 mods/skinsdb/textures/character.2297.png create mode 100644 mods/skinsdb/textures/character.2298.png create mode 100644 mods/skinsdb/textures/character.2299.png rename mods/skinsdb/textures/{character_230.png => character.230.png} (100%) create mode 100644 mods/skinsdb/textures/character.2300.png create mode 100644 mods/skinsdb/textures/character.2301.png create mode 100644 mods/skinsdb/textures/character.2302.png create mode 100644 mods/skinsdb/textures/character.2303.png create mode 100644 mods/skinsdb/textures/character.2304.png create mode 100644 mods/skinsdb/textures/character.2305.png create mode 100644 mods/skinsdb/textures/character.2306.png create mode 100644 mods/skinsdb/textures/character.2307.png create mode 100644 mods/skinsdb/textures/character.2308.png create mode 100644 mods/skinsdb/textures/character.2309.png rename mods/skinsdb/textures/{character_231.png => character.231.png} (100%) create mode 100644 mods/skinsdb/textures/character.2310.png create mode 100644 mods/skinsdb/textures/character.2311.png create mode 100644 mods/skinsdb/textures/character.2312.png create mode 100644 mods/skinsdb/textures/character.2313.png create mode 100644 mods/skinsdb/textures/character.2314.png create mode 100644 mods/skinsdb/textures/character.2315.png create mode 100644 mods/skinsdb/textures/character.2316.png create mode 100644 mods/skinsdb/textures/character.2317.png create mode 100644 mods/skinsdb/textures/character.2318.png create mode 100644 mods/skinsdb/textures/character.2319.png rename mods/skinsdb/textures/{character_232.png => character.232.png} (100%) create mode 100644 mods/skinsdb/textures/character.2320.png create mode 100644 mods/skinsdb/textures/character.2321.png create mode 100644 mods/skinsdb/textures/character.2322.png create mode 100644 mods/skinsdb/textures/character.2323.png create mode 100644 mods/skinsdb/textures/character.2324.png create mode 100644 mods/skinsdb/textures/character.2325.png create mode 100644 mods/skinsdb/textures/character.2326.png create mode 100644 mods/skinsdb/textures/character.2327.png create mode 100644 mods/skinsdb/textures/character.2328.png create mode 100644 mods/skinsdb/textures/character.2329.png rename mods/skinsdb/textures/{character_233.png => character.233.png} (100%) create mode 100644 mods/skinsdb/textures/character.2330.png create mode 100644 mods/skinsdb/textures/character.2331.png create mode 100644 mods/skinsdb/textures/character.2332.png create mode 100644 mods/skinsdb/textures/character.2333.png create mode 100644 mods/skinsdb/textures/character.2334.png create mode 100644 mods/skinsdb/textures/character.2335.png create mode 100644 mods/skinsdb/textures/character.2336.png create mode 100644 mods/skinsdb/textures/character.2337.png create mode 100644 mods/skinsdb/textures/character.2338.png create mode 100644 mods/skinsdb/textures/character.2339.png rename mods/skinsdb/textures/{character_234.png => character.234.png} (100%) create mode 100644 mods/skinsdb/textures/character.2340.png create mode 100644 mods/skinsdb/textures/character.2341.png create mode 100644 mods/skinsdb/textures/character.2342.png create mode 100644 mods/skinsdb/textures/character.2343.png create mode 100644 mods/skinsdb/textures/character.2344.png create mode 100644 mods/skinsdb/textures/character.2345.png create mode 100644 mods/skinsdb/textures/character.2346.png create mode 100644 mods/skinsdb/textures/character.2347.png create mode 100644 mods/skinsdb/textures/character.2348.png create mode 100644 mods/skinsdb/textures/character.2349.png rename mods/skinsdb/textures/{character_235.png => character.235.png} (100%) create mode 100644 mods/skinsdb/textures/character.2350.png create mode 100644 mods/skinsdb/textures/character.2351.png rename mods/skinsdb/textures/{character_237.png => character.237.png} (100%) rename mods/skinsdb/textures/{character_239.png => character.239.png} (100%) rename mods/skinsdb/textures/{character_24.png => character.24.png} (100%) rename mods/skinsdb/textures/{character_241.png => character.241.png} (100%) rename mods/skinsdb/textures/{character_242.png => character.242.png} (100%) rename mods/skinsdb/textures/{character_243.png => character.243.png} (100%) rename mods/skinsdb/textures/{character_244.png => character.244.png} (100%) rename mods/skinsdb/textures/{character_245.png => character.245.png} (100%) rename mods/skinsdb/textures/{character_246.png => character.246.png} (100%) rename mods/skinsdb/textures/{character_247.png => character.247.png} (100%) rename mods/skinsdb/textures/{character_248.png => character.248.png} (100%) rename mods/skinsdb/textures/{character_249.png => character.249.png} (100%) rename mods/skinsdb/textures/{character_25.png => character.25.png} (100%) rename mods/skinsdb/textures/{character_250.png => character.250.png} (100%) rename mods/skinsdb/textures/{character_251.png => character.251.png} (100%) rename mods/skinsdb/textures/{character_252.png => character.252.png} (100%) rename mods/skinsdb/textures/{character_253.png => character.253.png} (100%) rename mods/skinsdb/textures/{character_254.png => character.254.png} (100%) rename mods/skinsdb/textures/{character_255.png => character.255.png} (100%) rename mods/skinsdb/textures/{character_256.png => character.256.png} (100%) rename mods/skinsdb/textures/{character_257.png => character.257.png} (100%) rename mods/skinsdb/textures/{character_258.png => character.258.png} (100%) rename mods/skinsdb/textures/{character_259.png => character.259.png} (100%) rename mods/skinsdb/textures/{character_26.png => character.26.png} (100%) rename mods/skinsdb/textures/{character_260.png => character.260.png} (100%) rename mods/skinsdb/textures/{character_261.png => character.261.png} (100%) rename mods/skinsdb/textures/{character_262.png => character.262.png} (100%) rename mods/skinsdb/textures/{character_263.png => character.263.png} (100%) rename mods/skinsdb/textures/{character_264.png => character.264.png} (100%) rename mods/skinsdb/textures/{character_265.png => character.265.png} (100%) rename mods/skinsdb/textures/{character_266.png => character.266.png} (100%) rename mods/skinsdb/textures/{character_267.png => character.267.png} (100%) rename mods/skinsdb/textures/{character_268.png => character.268.png} (100%) rename mods/skinsdb/textures/{character_269.png => character.269.png} (100%) rename mods/skinsdb/textures/{character_27.png => character.27.png} (100%) rename mods/skinsdb/textures/{character_270.png => character.270.png} (100%) rename mods/skinsdb/textures/{character_271.png => character.271.png} (100%) rename mods/skinsdb/textures/{character_272.png => character.272.png} (100%) rename mods/skinsdb/textures/{character_273.png => character.273.png} (100%) rename mods/skinsdb/textures/{character_274.png => character.274.png} (100%) rename mods/skinsdb/textures/{character_275.png => character.275.png} (100%) rename mods/skinsdb/textures/{character_276.png => character.276.png} (100%) rename mods/skinsdb/textures/{character_277.png => character.277.png} (100%) rename mods/skinsdb/textures/{character_278.png => character.278.png} (100%) rename mods/skinsdb/textures/{character_279.png => character.279.png} (100%) rename mods/skinsdb/textures/{character_28.png => character.28.png} (100%) rename mods/skinsdb/textures/{character_280.png => character.280.png} (100%) rename mods/skinsdb/textures/{character_281.png => character.281.png} (100%) rename mods/skinsdb/textures/{character_282.png => character.282.png} (100%) rename mods/skinsdb/textures/{character_283.png => character.283.png} (100%) rename mods/skinsdb/textures/{character_284.png => character.284.png} (100%) rename mods/skinsdb/textures/{character_285.png => character.285.png} (100%) rename mods/skinsdb/textures/{character_286.png => character.286.png} (100%) rename mods/skinsdb/textures/{character_287.png => character.287.png} (100%) rename mods/skinsdb/textures/{character_288.png => character.288.png} (100%) rename mods/skinsdb/textures/{character_289.png => character.289.png} (100%) rename mods/skinsdb/textures/{character_29.png => character.29.png} (100%) rename mods/skinsdb/textures/{character_290.png => character.290.png} (100%) rename mods/skinsdb/textures/{character_291.png => character.291.png} (100%) rename mods/skinsdb/textures/{character_292.png => character.292.png} (100%) rename mods/skinsdb/textures/{character_295.png => character.295.png} (100%) rename mods/skinsdb/textures/{character_297.png => character.297.png} (100%) rename mods/skinsdb/textures/{character_299.png => character.299.png} (100%) rename mods/skinsdb/textures/{character_3.png => character.3.png} (100%) rename mods/skinsdb/textures/{character_30.png => character.30.png} (100%) rename mods/skinsdb/textures/{character_300.png => character.300.png} (100%) rename mods/skinsdb/textures/{character_301.png => character.301.png} (100%) rename mods/skinsdb/textures/{character_302.png => character.302.png} (100%) rename mods/skinsdb/textures/{character_303.png => character.303.png} (100%) rename mods/skinsdb/textures/{character_304.png => character.304.png} (100%) rename mods/skinsdb/textures/{character_305.png => character.305.png} (100%) rename mods/skinsdb/textures/{character_306.png => character.306.png} (100%) rename mods/skinsdb/textures/{character_307.png => character.307.png} (100%) rename mods/skinsdb/textures/{character_308.png => character.308.png} (100%) rename mods/skinsdb/textures/{character_309.png => character.309.png} (100%) rename mods/skinsdb/textures/{character_31.png => character.31.png} (100%) rename mods/skinsdb/textures/{character_310.png => character.310.png} (100%) rename mods/skinsdb/textures/{character_311.png => character.311.png} (100%) rename mods/skinsdb/textures/{character_312.png => character.312.png} (100%) rename mods/skinsdb/textures/{character_313.png => character.313.png} (100%) rename mods/skinsdb/textures/{character_314.png => character.314.png} (100%) rename mods/skinsdb/textures/{character_315.png => character.315.png} (100%) rename mods/skinsdb/textures/{character_316.png => character.316.png} (100%) rename mods/skinsdb/textures/{character_317.png => character.317.png} (100%) rename mods/skinsdb/textures/{character_318.png => character.318.png} (100%) rename mods/skinsdb/textures/{character_319.png => character.319.png} (100%) rename mods/skinsdb/textures/{character_320.png => character.320.png} (100%) rename mods/skinsdb/textures/{character_321.png => character.321.png} (100%) rename mods/skinsdb/textures/{character_322.png => character.322.png} (100%) rename mods/skinsdb/textures/{character_323.png => character.323.png} (100%) rename mods/skinsdb/textures/{character_324.png => character.324.png} (100%) rename mods/skinsdb/textures/{character_325.png => character.325.png} (100%) rename mods/skinsdb/textures/{character_326.png => character.326.png} (100%) rename mods/skinsdb/textures/{character_327.png => character.327.png} (100%) rename mods/skinsdb/textures/{character_328.png => character.328.png} (100%) rename mods/skinsdb/textures/{character_329.png => character.329.png} (100%) rename mods/skinsdb/textures/{character_330.png => character.330.png} (100%) rename mods/skinsdb/textures/{character_331.png => character.331.png} (100%) rename mods/skinsdb/textures/{character_332.png => character.332.png} (100%) rename mods/skinsdb/textures/{character_333.png => character.333.png} (100%) rename mods/skinsdb/textures/{character_334.png => character.334.png} (100%) rename mods/skinsdb/textures/{character_335.png => character.335.png} (100%) rename mods/skinsdb/textures/{character_336.png => character.336.png} (100%) rename mods/skinsdb/textures/{character_337.png => character.337.png} (100%) rename mods/skinsdb/textures/{character_338.png => character.338.png} (100%) rename mods/skinsdb/textures/{character_339.png => character.339.png} (100%) rename mods/skinsdb/textures/{character_34.png => character.34.png} (100%) rename mods/skinsdb/textures/{character_340.png => character.340.png} (100%) rename mods/skinsdb/textures/{character_341.png => character.341.png} (100%) rename mods/skinsdb/textures/{character_342.png => character.342.png} (100%) rename mods/skinsdb/textures/{character_344.png => character.344.png} (100%) rename mods/skinsdb/textures/{character_349.png => character.349.png} (100%) rename mods/skinsdb/textures/{character_35.png => character.35.png} (100%) rename mods/skinsdb/textures/{character_352.png => character.352.png} (100%) rename mods/skinsdb/textures/{character_353.png => character.353.png} (100%) rename mods/skinsdb/textures/{character_356.png => character.356.png} (100%) rename mods/skinsdb/textures/{character_357.png => character.357.png} (100%) rename mods/skinsdb/textures/{character_359.png => character.359.png} (100%) rename mods/skinsdb/textures/{character_36.png => character.36.png} (100%) rename mods/skinsdb/textures/{character_361.png => character.361.png} (100%) rename mods/skinsdb/textures/{character_362.png => character.362.png} (100%) rename mods/skinsdb/textures/{character_363.png => character.363.png} (100%) rename mods/skinsdb/textures/{character_364.png => character.364.png} (100%) rename mods/skinsdb/textures/{character_365.png => character.365.png} (100%) rename mods/skinsdb/textures/{character_366.png => character.366.png} (100%) rename mods/skinsdb/textures/{character_367.png => character.367.png} (100%) rename mods/skinsdb/textures/{character_368.png => character.368.png} (100%) rename mods/skinsdb/textures/{character_369.png => character.369.png} (100%) rename mods/skinsdb/textures/{character_37.png => character.37.png} (100%) rename mods/skinsdb/textures/{character_370.png => character.370.png} (100%) rename mods/skinsdb/textures/{character_371.png => character.371.png} (100%) rename mods/skinsdb/textures/{character_372.png => character.372.png} (100%) rename mods/skinsdb/textures/{character_373.png => character.373.png} (100%) rename mods/skinsdb/textures/{character_374.png => character.374.png} (100%) rename mods/skinsdb/textures/{character_375.png => character.375.png} (100%) rename mods/skinsdb/textures/{character_376.png => character.376.png} (100%) rename mods/skinsdb/textures/{character_377.png => character.377.png} (100%) rename mods/skinsdb/textures/{character_378.png => character.378.png} (100%) rename mods/skinsdb/textures/{character_379.png => character.379.png} (100%) rename mods/skinsdb/textures/{character_380.png => character.380.png} (100%) rename mods/skinsdb/textures/{character_381.png => character.381.png} (100%) rename mods/skinsdb/textures/{character_382.png => character.382.png} (100%) rename mods/skinsdb/textures/{character_383.png => character.383.png} (100%) rename mods/skinsdb/textures/{character_384.png => character.384.png} (100%) rename mods/skinsdb/textures/{character_385.png => character.385.png} (100%) rename mods/skinsdb/textures/{character_387.png => character.387.png} (100%) rename mods/skinsdb/textures/{character_389.png => character.389.png} (100%) rename mods/skinsdb/textures/{character_390.png => character.390.png} (100%) rename mods/skinsdb/textures/{character_392.png => character.392.png} (100%) rename mods/skinsdb/textures/{character_393.png => character.393.png} (100%) rename mods/skinsdb/textures/{character_396.png => character.396.png} (100%) rename mods/skinsdb/textures/{character_399.png => character.399.png} (100%) rename mods/skinsdb/textures/{character_4.png => character.4.png} (100%) rename mods/skinsdb/textures/{character_400.png => character.400.png} (100%) rename mods/skinsdb/textures/{character_401.png => character.401.png} (100%) rename mods/skinsdb/textures/{character_402.png => character.402.png} (100%) rename mods/skinsdb/textures/{character_403.png => character.403.png} (100%) rename mods/skinsdb/textures/{character_404.png => character.404.png} (100%) rename mods/skinsdb/textures/{character_405.png => character.405.png} (100%) rename mods/skinsdb/textures/{character_406.png => character.406.png} (100%) rename mods/skinsdb/textures/{character_407.png => character.407.png} (100%) rename mods/skinsdb/textures/{character_408.png => character.408.png} (100%) rename mods/skinsdb/textures/{character_409.png => character.409.png} (100%) rename mods/skinsdb/textures/{character_410.png => character.410.png} (100%) rename mods/skinsdb/textures/{character_411.png => character.411.png} (100%) rename mods/skinsdb/textures/{character_412.png => character.412.png} (100%) rename mods/skinsdb/textures/{character_413.png => character.413.png} (100%) rename mods/skinsdb/textures/{character_414.png => character.414.png} (100%) rename mods/skinsdb/textures/{character_415.png => character.415.png} (100%) rename mods/skinsdb/textures/{character_416.png => character.416.png} (100%) rename mods/skinsdb/textures/{character_417.png => character.417.png} (100%) rename mods/skinsdb/textures/{character_418.png => character.418.png} (100%) rename mods/skinsdb/textures/{character_419.png => character.419.png} (100%) rename mods/skinsdb/textures/{character_420.png => character.420.png} (100%) rename mods/skinsdb/textures/{character_421.png => character.421.png} (100%) rename mods/skinsdb/textures/{character_428.png => character.428.png} (100%) rename mods/skinsdb/textures/{character_429.png => character.429.png} (100%) rename mods/skinsdb/textures/{character_430.png => character.430.png} (100%) rename mods/skinsdb/textures/{character_431.png => character.431.png} (100%) rename mods/skinsdb/textures/{character_432.png => character.432.png} (100%) rename mods/skinsdb/textures/{character_433.png => character.433.png} (100%) rename mods/skinsdb/textures/{character_434.png => character.434.png} (100%) rename mods/skinsdb/textures/{character_435.png => character.435.png} (100%) rename mods/skinsdb/textures/{character_436.png => character.436.png} (100%) rename mods/skinsdb/textures/{character_437.png => character.437.png} (100%) rename mods/skinsdb/textures/{character_438.png => character.438.png} (100%) rename mods/skinsdb/textures/{character_439.png => character.439.png} (100%) rename mods/skinsdb/textures/{character_440.png => character.440.png} (100%) rename mods/skinsdb/textures/{character_441.png => character.441.png} (100%) rename mods/skinsdb/textures/{character_442.png => character.442.png} (100%) rename mods/skinsdb/textures/{character_443.png => character.443.png} (100%) rename mods/skinsdb/textures/{character_444.png => character.444.png} (100%) rename mods/skinsdb/textures/{character_445.png => character.445.png} (100%) rename mods/skinsdb/textures/{character_446.png => character.446.png} (100%) rename mods/skinsdb/textures/{character_447.png => character.447.png} (100%) rename mods/skinsdb/textures/{character_448.png => character.448.png} (100%) rename mods/skinsdb/textures/{character_449.png => character.449.png} (100%) rename mods/skinsdb/textures/{character_450.png => character.450.png} (100%) rename mods/skinsdb/textures/{character_451.png => character.451.png} (100%) rename mods/skinsdb/textures/{character_452.png => character.452.png} (100%) rename mods/skinsdb/textures/{character_453.png => character.453.png} (100%) rename mods/skinsdb/textures/{character_454.png => character.454.png} (100%) rename mods/skinsdb/textures/{character_456.png => character.456.png} (100%) rename mods/skinsdb/textures/{character_457.png => character.457.png} (100%) rename mods/skinsdb/textures/{character_458.png => character.458.png} (100%) rename mods/skinsdb/textures/{character_459.png => character.459.png} (100%) rename mods/skinsdb/textures/{character_460.png => character.460.png} (100%) rename mods/skinsdb/textures/{character_461.png => character.461.png} (100%) rename mods/skinsdb/textures/{character_462.png => character.462.png} (100%) rename mods/skinsdb/textures/{character_463.png => character.463.png} (100%) rename mods/skinsdb/textures/{character_464.png => character.464.png} (100%) rename mods/skinsdb/textures/{character_465.png => character.465.png} (100%) rename mods/skinsdb/textures/{character_466.png => character.466.png} (100%) rename mods/skinsdb/textures/{character_467.png => character.467.png} (100%) rename mods/skinsdb/textures/{character_468.png => character.468.png} (100%) rename mods/skinsdb/textures/{character_469.png => character.469.png} (100%) rename mods/skinsdb/textures/{character_470.png => character.470.png} (100%) rename mods/skinsdb/textures/{character_471.png => character.471.png} (100%) rename mods/skinsdb/textures/{character_473.png => character.473.png} (100%) rename mods/skinsdb/textures/{character_474.png => character.474.png} (100%) rename mods/skinsdb/textures/{character_475.png => character.475.png} (100%) rename mods/skinsdb/textures/{character_476.png => character.476.png} (100%) rename mods/skinsdb/textures/{character_477.png => character.477.png} (100%) rename mods/skinsdb/textures/{character_478.png => character.478.png} (100%) rename mods/skinsdb/textures/{character_479.png => character.479.png} (100%) rename mods/skinsdb/textures/{character_480.png => character.480.png} (100%) rename mods/skinsdb/textures/{character_482.png => character.482.png} (100%) rename mods/skinsdb/textures/{character_483.png => character.483.png} (100%) rename mods/skinsdb/textures/{character_484.png => character.484.png} (100%) rename mods/skinsdb/textures/{character_485.png => character.485.png} (100%) rename mods/skinsdb/textures/{character_486.png => character.486.png} (100%) rename mods/skinsdb/textures/{character_487.png => character.487.png} (100%) rename mods/skinsdb/textures/{character_488.png => character.488.png} (100%) rename mods/skinsdb/textures/{character_489.png => character.489.png} (100%) rename mods/skinsdb/textures/{character_490.png => character.490.png} (100%) rename mods/skinsdb/textures/{character_491.png => character.491.png} (100%) rename mods/skinsdb/textures/{character_492.png => character.492.png} (100%) rename mods/skinsdb/textures/{character_493.png => character.493.png} (100%) rename mods/skinsdb/textures/{character_494.png => character.494.png} (100%) rename mods/skinsdb/textures/{character_495.png => character.495.png} (100%) rename mods/skinsdb/textures/{character_496.png => character.496.png} (100%) rename mods/skinsdb/textures/{character_497.png => character.497.png} (100%) rename mods/skinsdb/textures/{character_498.png => character.498.png} (100%) rename mods/skinsdb/textures/{character_5.png => character.5.png} (100%) rename mods/skinsdb/textures/{character_50.png => character.50.png} (100%) rename mods/skinsdb/textures/{character_500.png => character.500.png} (100%) rename mods/skinsdb/textures/{character_501.png => character.501.png} (100%) rename mods/skinsdb/textures/{character_502.png => character.502.png} (100%) rename mods/skinsdb/textures/{character_503.png => character.503.png} (100%) rename mods/skinsdb/textures/{character_504.png => character.504.png} (100%) rename mods/skinsdb/textures/{character_505.png => character.505.png} (100%) rename mods/skinsdb/textures/{character_507.png => character.507.png} (100%) rename mods/skinsdb/textures/{character_510.png => character.510.png} (100%) rename mods/skinsdb/textures/{character_511.png => character.511.png} (100%) rename mods/skinsdb/textures/{character_512.png => character.512.png} (100%) rename mods/skinsdb/textures/{character_513.png => character.513.png} (100%) rename mods/skinsdb/textures/{character_514.png => character.514.png} (100%) rename mods/skinsdb/textures/{character_515.png => character.515.png} (100%) rename mods/skinsdb/textures/{character_516.png => character.516.png} (100%) rename mods/skinsdb/textures/{character_517.png => character.517.png} (100%) rename mods/skinsdb/textures/{character_518.png => character.518.png} (100%) rename mods/skinsdb/textures/{character_519.png => character.519.png} (100%) rename mods/skinsdb/textures/{character_52.png => character.52.png} (100%) rename mods/skinsdb/textures/{character_520.png => character.520.png} (100%) rename mods/skinsdb/textures/{character_521.png => character.521.png} (100%) rename mods/skinsdb/textures/{character_522.png => character.522.png} (100%) rename mods/skinsdb/textures/{character_523.png => character.523.png} (100%) rename mods/skinsdb/textures/{character_524.png => character.524.png} (100%) rename mods/skinsdb/textures/{character_525.png => character.525.png} (100%) rename mods/skinsdb/textures/{character_526.png => character.526.png} (100%) rename mods/skinsdb/textures/{character_527.png => character.527.png} (100%) rename mods/skinsdb/textures/{character_528.png => character.528.png} (100%) rename mods/skinsdb/textures/{character_529.png => character.529.png} (100%) rename mods/skinsdb/textures/{character_530.png => character.530.png} (100%) rename mods/skinsdb/textures/{character_531.png => character.531.png} (100%) rename mods/skinsdb/textures/{character_532.png => character.532.png} (100%) rename mods/skinsdb/textures/{character_533.png => character.533.png} (100%) rename mods/skinsdb/textures/{character_534.png => character.534.png} (100%) rename mods/skinsdb/textures/{character_535.png => character.535.png} (100%) rename mods/skinsdb/textures/{character_536.png => character.536.png} (100%) rename mods/skinsdb/textures/{character_537.png => character.537.png} (100%) rename mods/skinsdb/textures/{character_539.png => character.539.png} (100%) rename mods/skinsdb/textures/{character_54.png => character.54.png} (100%) rename mods/skinsdb/textures/{character_540.png => character.540.png} (100%) rename mods/skinsdb/textures/{character_541.png => character.541.png} (100%) rename mods/skinsdb/textures/{character_542.png => character.542.png} (100%) rename mods/skinsdb/textures/{character_543.png => character.543.png} (100%) rename mods/skinsdb/textures/{character_544.png => character.544.png} (100%) rename mods/skinsdb/textures/{character_545.png => character.545.png} (100%) rename mods/skinsdb/textures/{character_546.png => character.546.png} (100%) rename mods/skinsdb/textures/{character_547.png => character.547.png} (100%) rename mods/skinsdb/textures/{character_548.png => character.548.png} (100%) rename mods/skinsdb/textures/{character_549.png => character.549.png} (100%) rename mods/skinsdb/textures/{character_55.png => character.55.png} (100%) rename mods/skinsdb/textures/{character_550.png => character.550.png} (100%) rename mods/skinsdb/textures/{character_551.png => character.551.png} (100%) rename mods/skinsdb/textures/{character_552.png => character.552.png} (100%) rename mods/skinsdb/textures/{character_553.png => character.553.png} (100%) rename mods/skinsdb/textures/{character_554.png => character.554.png} (100%) rename mods/skinsdb/textures/{character_555.png => character.555.png} (100%) rename mods/skinsdb/textures/{character_556.png => character.556.png} (100%) rename mods/skinsdb/textures/{character_558.png => character.558.png} (100%) rename mods/skinsdb/textures/{character_559.png => character.559.png} (100%) rename mods/skinsdb/textures/{character_560.png => character.560.png} (100%) rename mods/skinsdb/textures/{character_561.png => character.561.png} (100%) rename mods/skinsdb/textures/{character_562.png => character.562.png} (100%) rename mods/skinsdb/textures/{character_563.png => character.563.png} (100%) rename mods/skinsdb/textures/{character_564.png => character.564.png} (100%) rename mods/skinsdb/textures/{character_565.png => character.565.png} (100%) rename mods/skinsdb/textures/{character_567.png => character.567.png} (100%) rename mods/skinsdb/textures/{character_57.png => character.57.png} (100%) rename mods/skinsdb/textures/{character_570.png => character.570.png} (100%) rename mods/skinsdb/textures/{character_571.png => character.571.png} (100%) rename mods/skinsdb/textures/{character_572.png => character.572.png} (100%) rename mods/skinsdb/textures/{character_573.png => character.573.png} (100%) rename mods/skinsdb/textures/{character_575.png => character.575.png} (100%) rename mods/skinsdb/textures/{character_576.png => character.576.png} (100%) rename mods/skinsdb/textures/{character_577.png => character.577.png} (100%) rename mods/skinsdb/textures/{character_578.png => character.578.png} (100%) rename mods/skinsdb/textures/{character_579.png => character.579.png} (100%) rename mods/skinsdb/textures/{character_580.png => character.580.png} (100%) rename mods/skinsdb/textures/{character_581.png => character.581.png} (100%) rename mods/skinsdb/textures/{character_582.png => character.582.png} (100%) rename mods/skinsdb/textures/{character_583.png => character.583.png} (100%) rename mods/skinsdb/textures/{character_584.png => character.584.png} (100%) rename mods/skinsdb/textures/{character_585.png => character.585.png} (100%) rename mods/skinsdb/textures/{character_586.png => character.586.png} (100%) rename mods/skinsdb/textures/{character_587.png => character.587.png} (100%) rename mods/skinsdb/textures/{character_588.png => character.588.png} (100%) rename mods/skinsdb/textures/{character_589.png => character.589.png} (100%) rename mods/skinsdb/textures/{character_590.png => character.590.png} (100%) rename mods/skinsdb/textures/{character_591.png => character.591.png} (100%) rename mods/skinsdb/textures/{character_592.png => character.592.png} (100%) rename mods/skinsdb/textures/{character_593.png => character.593.png} (100%) rename mods/skinsdb/textures/{character_594.png => character.594.png} (100%) rename mods/skinsdb/textures/{character_595.png => character.595.png} (100%) rename mods/skinsdb/textures/{character_596.png => character.596.png} (100%) rename mods/skinsdb/textures/{character_597.png => character.597.png} (100%) rename mods/skinsdb/textures/{character_598.png => character.598.png} (100%) rename mods/skinsdb/textures/{character_599.png => character.599.png} (100%) rename mods/skinsdb/textures/{character_6.png => character.6.png} (100%) rename mods/skinsdb/textures/{character_600.png => character.600.png} (100%) rename mods/skinsdb/textures/{character_601.png => character.601.png} (100%) rename mods/skinsdb/textures/{character_602.png => character.602.png} (100%) rename mods/skinsdb/textures/{character_603.png => character.603.png} (100%) rename mods/skinsdb/textures/{character_604.png => character.604.png} (100%) rename mods/skinsdb/textures/{character_605.png => character.605.png} (100%) rename mods/skinsdb/textures/{character_606.png => character.606.png} (100%) rename mods/skinsdb/textures/{character_607.png => character.607.png} (100%) rename mods/skinsdb/textures/{character_608.png => character.608.png} (100%) rename mods/skinsdb/textures/{character_609.png => character.609.png} (100%) rename mods/skinsdb/textures/{character_61.png => character.61.png} (100%) rename mods/skinsdb/textures/{character_610.png => character.610.png} (100%) rename mods/skinsdb/textures/{character_611.png => character.611.png} (100%) rename mods/skinsdb/textures/{character_612.png => character.612.png} (100%) rename mods/skinsdb/textures/{character_613.png => character.613.png} (100%) rename mods/skinsdb/textures/{character_614.png => character.614.png} (100%) rename mods/skinsdb/textures/{character_615.png => character.615.png} (100%) rename mods/skinsdb/textures/{character_616.png => character.616.png} (100%) rename mods/skinsdb/textures/{character_618.png => character.618.png} (100%) rename mods/skinsdb/textures/{character_619.png => character.619.png} (100%) rename mods/skinsdb/textures/{character_620.png => character.620.png} (100%) rename mods/skinsdb/textures/{character_621.png => character.621.png} (100%) rename mods/skinsdb/textures/{character_622.png => character.622.png} (100%) rename mods/skinsdb/textures/{character_623.png => character.623.png} (100%) rename mods/skinsdb/textures/{character_624.png => character.624.png} (100%) rename mods/skinsdb/textures/{character_625.png => character.625.png} (100%) rename mods/skinsdb/textures/{character_626.png => character.626.png} (100%) rename mods/skinsdb/textures/{character_627.png => character.627.png} (100%) rename mods/skinsdb/textures/{character_628.png => character.628.png} (100%) rename mods/skinsdb/textures/{character_629.png => character.629.png} (100%) rename mods/skinsdb/textures/{character_630.png => character.630.png} (100%) rename mods/skinsdb/textures/{character_631.png => character.631.png} (100%) rename mods/skinsdb/textures/{character_632.png => character.632.png} (100%) rename mods/skinsdb/textures/{character_633.png => character.633.png} (100%) rename mods/skinsdb/textures/{character_634.png => character.634.png} (100%) rename mods/skinsdb/textures/{character_635.png => character.635.png} (100%) rename mods/skinsdb/textures/{character_636.png => character.636.png} (100%) rename mods/skinsdb/textures/{character_637.png => character.637.png} (100%) rename mods/skinsdb/textures/{character_638.png => character.638.png} (100%) rename mods/skinsdb/textures/{character_639.png => character.639.png} (100%) rename mods/skinsdb/textures/{character_640.png => character.640.png} (100%) rename mods/skinsdb/textures/{character_641.png => character.641.png} (100%) rename mods/skinsdb/textures/{character_642.png => character.642.png} (100%) rename mods/skinsdb/textures/{character_643.png => character.643.png} (100%) rename mods/skinsdb/textures/{character_644.png => character.644.png} (100%) rename mods/skinsdb/textures/{character_645.png => character.645.png} (100%) rename mods/skinsdb/textures/{character_646.png => character.646.png} (100%) rename mods/skinsdb/textures/{character_647.png => character.647.png} (100%) rename mods/skinsdb/textures/{character_648.png => character.648.png} (100%) rename mods/skinsdb/textures/{character_649.png => character.649.png} (100%) rename mods/skinsdb/textures/{character_650.png => character.650.png} (100%) rename mods/skinsdb/textures/{character_651.png => character.651.png} (100%) rename mods/skinsdb/textures/{character_652.png => character.652.png} (100%) rename mods/skinsdb/textures/{character_656.png => character.656.png} (100%) rename mods/skinsdb/textures/{character_657.png => character.657.png} (100%) rename mods/skinsdb/textures/{character_658.png => character.658.png} (100%) rename mods/skinsdb/textures/{character_659.png => character.659.png} (100%) rename mods/skinsdb/textures/{character_660.png => character.660.png} (100%) rename mods/skinsdb/textures/{character_661.png => character.661.png} (100%) rename mods/skinsdb/textures/{character_662.png => character.662.png} (100%) rename mods/skinsdb/textures/{character_663.png => character.663.png} (100%) rename mods/skinsdb/textures/{character_664.png => character.664.png} (100%) rename mods/skinsdb/textures/{character_666.png => character.666.png} (100%) rename mods/skinsdb/textures/{character_667.png => character.667.png} (100%) rename mods/skinsdb/textures/{character_668.png => character.668.png} (100%) rename mods/skinsdb/textures/{character_669.png => character.669.png} (100%) rename mods/skinsdb/textures/{character_670.png => character.670.png} (100%) rename mods/skinsdb/textures/{character_671.png => character.671.png} (100%) rename mods/skinsdb/textures/{character_672.png => character.672.png} (100%) rename mods/skinsdb/textures/{character_673.png => character.673.png} (100%) rename mods/skinsdb/textures/{character_674.png => character.674.png} (100%) rename mods/skinsdb/textures/{character_675.png => character.675.png} (100%) rename mods/skinsdb/textures/{character_676.png => character.676.png} (100%) rename mods/skinsdb/textures/{character_677.png => character.677.png} (100%) rename mods/skinsdb/textures/{character_678.png => character.678.png} (100%) rename mods/skinsdb/textures/{character_679.png => character.679.png} (100%) rename mods/skinsdb/textures/{character_680.png => character.680.png} (100%) rename mods/skinsdb/textures/{character_681.png => character.681.png} (100%) rename mods/skinsdb/textures/{character_682.png => character.682.png} (100%) rename mods/skinsdb/textures/{character_683.png => character.683.png} (100%) rename mods/skinsdb/textures/{character_684.png => character.684.png} (100%) rename mods/skinsdb/textures/{character_685.png => character.685.png} (100%) rename mods/skinsdb/textures/{character_686.png => character.686.png} (100%) rename mods/skinsdb/textures/{character_687.png => character.687.png} (100%) rename mods/skinsdb/textures/{character_688.png => character.688.png} (100%) rename mods/skinsdb/textures/{character_689.png => character.689.png} (100%) rename mods/skinsdb/textures/{character_69.png => character.69.png} (100%) rename mods/skinsdb/textures/{character_690.png => character.690.png} (100%) rename mods/skinsdb/textures/{character_691.png => character.691.png} (100%) rename mods/skinsdb/textures/{character_692.png => character.692.png} (100%) rename mods/skinsdb/textures/{character_693.png => character.693.png} (100%) rename mods/skinsdb/textures/{character_694.png => character.694.png} (100%) rename mods/skinsdb/textures/{character_695.png => character.695.png} (100%) rename mods/skinsdb/textures/{character_696.png => character.696.png} (100%) rename mods/skinsdb/textures/{character_697.png => character.697.png} (100%) rename mods/skinsdb/textures/{character_698.png => character.698.png} (100%) rename mods/skinsdb/textures/{character_699.png => character.699.png} (100%) rename mods/skinsdb/textures/{character_7.png => character.7.png} (100%) rename mods/skinsdb/textures/{character_70.png => character.70.png} (100%) rename mods/skinsdb/textures/{character_700.png => character.700.png} (100%) rename mods/skinsdb/textures/{character_701.png => character.701.png} (100%) rename mods/skinsdb/textures/{character_702.png => character.702.png} (100%) rename mods/skinsdb/textures/{character_703.png => character.703.png} (100%) rename mods/skinsdb/textures/{character_704.png => character.704.png} (100%) rename mods/skinsdb/textures/{character_705.png => character.705.png} (100%) rename mods/skinsdb/textures/{character_706.png => character.706.png} (100%) rename mods/skinsdb/textures/{character_707.png => character.707.png} (100%) rename mods/skinsdb/textures/{character_708.png => character.708.png} (100%) rename mods/skinsdb/textures/{character_709.png => character.709.png} (100%) rename mods/skinsdb/textures/{character_71.png => character.71.png} (100%) rename mods/skinsdb/textures/{character_710.png => character.710.png} (100%) rename mods/skinsdb/textures/{character_711.png => character.711.png} (100%) rename mods/skinsdb/textures/{character_712.png => character.712.png} (100%) rename mods/skinsdb/textures/{character_713.png => character.713.png} (100%) rename mods/skinsdb/textures/{character_714.png => character.714.png} (100%) rename mods/skinsdb/textures/{character_715.png => character.715.png} (100%) rename mods/skinsdb/textures/{character_716.png => character.716.png} (100%) rename mods/skinsdb/textures/{character_717.png => character.717.png} (100%) rename mods/skinsdb/textures/{character_718.png => character.718.png} (100%) rename mods/skinsdb/textures/{character_72.png => character.72.png} (100%) rename mods/skinsdb/textures/{character_720.png => character.720.png} (100%) rename mods/skinsdb/textures/{character_721.png => character.721.png} (100%) rename mods/skinsdb/textures/{character_723.png => character.723.png} (100%) rename mods/skinsdb/textures/{character_724.png => character.724.png} (100%) rename mods/skinsdb/textures/{character_725.png => character.725.png} (100%) rename mods/skinsdb/textures/{character_726.png => character.726.png} (100%) rename mods/skinsdb/textures/{character_727.png => character.727.png} (100%) rename mods/skinsdb/textures/{character_728.png => character.728.png} (100%) rename mods/skinsdb/textures/{character_729.png => character.729.png} (100%) rename mods/skinsdb/textures/{character_73.png => character.73.png} (100%) rename mods/skinsdb/textures/{character_730.png => character.730.png} (100%) rename mods/skinsdb/textures/{character_731.png => character.731.png} (100%) rename mods/skinsdb/textures/{character_732.png => character.732.png} (100%) rename mods/skinsdb/textures/{character_734.png => character.734.png} (100%) rename mods/skinsdb/textures/{character_735.png => character.735.png} (100%) rename mods/skinsdb/textures/{character_736.png => character.736.png} (100%) rename mods/skinsdb/textures/{character_737.png => character.737.png} (100%) rename mods/skinsdb/textures/{character_738.png => character.738.png} (100%) rename mods/skinsdb/textures/{character_739.png => character.739.png} (100%) rename mods/skinsdb/textures/{character_74.png => character.74.png} (100%) rename mods/skinsdb/textures/{character_740.png => character.740.png} (100%) rename mods/skinsdb/textures/{character_741.png => character.741.png} (100%) rename mods/skinsdb/textures/{character_742.png => character.742.png} (100%) rename mods/skinsdb/textures/{character_743.png => character.743.png} (100%) rename mods/skinsdb/textures/{character_744.png => character.744.png} (100%) rename mods/skinsdb/textures/{character_745.png => character.745.png} (100%) rename mods/skinsdb/textures/{character_746.png => character.746.png} (100%) rename mods/skinsdb/textures/{character_747.png => character.747.png} (100%) rename mods/skinsdb/textures/{character_748.png => character.748.png} (100%) rename mods/skinsdb/textures/{character_749.png => character.749.png} (100%) rename mods/skinsdb/textures/{character_75.png => character.75.png} (100%) rename mods/skinsdb/textures/{character_750.png => character.750.png} (100%) rename mods/skinsdb/textures/{character_751.png => character.751.png} (100%) rename mods/skinsdb/textures/{character_752.png => character.752.png} (100%) rename mods/skinsdb/textures/{character_753.png => character.753.png} (100%) rename mods/skinsdb/textures/{character_754.png => character.754.png} (100%) rename mods/skinsdb/textures/{character_755.png => character.755.png} (100%) rename mods/skinsdb/textures/{character_756.png => character.756.png} (100%) rename mods/skinsdb/textures/{character_757.png => character.757.png} (100%) rename mods/skinsdb/textures/{character_758.png => character.758.png} (100%) rename mods/skinsdb/textures/{character_759.png => character.759.png} (100%) rename mods/skinsdb/textures/{character_76.png => character.76.png} (100%) rename mods/skinsdb/textures/{character_760.png => character.760.png} (100%) rename mods/skinsdb/textures/{character_761.png => character.761.png} (100%) rename mods/skinsdb/textures/{character_762.png => character.762.png} (100%) rename mods/skinsdb/textures/{character_763.png => character.763.png} (100%) rename mods/skinsdb/textures/{character_764.png => character.764.png} (100%) rename mods/skinsdb/textures/{character_765.png => character.765.png} (100%) rename mods/skinsdb/textures/{character_766.png => character.766.png} (100%) rename mods/skinsdb/textures/{character_767.png => character.767.png} (100%) rename mods/skinsdb/textures/{character_768.png => character.768.png} (100%) rename mods/skinsdb/textures/{character_769.png => character.769.png} (100%) rename mods/skinsdb/textures/{character_77.png => character.77.png} (100%) rename mods/skinsdb/textures/{character_770.png => character.770.png} (100%) rename mods/skinsdb/textures/{character_771.png => character.771.png} (100%) rename mods/skinsdb/textures/{character_772.png => character.772.png} (100%) rename mods/skinsdb/textures/{character_773.png => character.773.png} (100%) rename mods/skinsdb/textures/{character_774.png => character.774.png} (100%) rename mods/skinsdb/textures/{character_775.png => character.775.png} (100%) rename mods/skinsdb/textures/{character_776.png => character.776.png} (100%) rename mods/skinsdb/textures/{character_777.png => character.777.png} (100%) rename mods/skinsdb/textures/{character_778.png => character.778.png} (100%) rename mods/skinsdb/textures/{character_779.png => character.779.png} (100%) rename mods/skinsdb/textures/{character_78.png => character.78.png} (100%) rename mods/skinsdb/textures/{character_780.png => character.780.png} (100%) rename mods/skinsdb/textures/{character_781.png => character.781.png} (100%) rename mods/skinsdb/textures/{character_782.png => character.782.png} (100%) rename mods/skinsdb/textures/{character_783.png => character.783.png} (100%) rename mods/skinsdb/textures/{character_784.png => character.784.png} (100%) rename mods/skinsdb/textures/{character_785.png => character.785.png} (100%) rename mods/skinsdb/textures/{character_786.png => character.786.png} (100%) rename mods/skinsdb/textures/{character_787.png => character.787.png} (100%) rename mods/skinsdb/textures/{character_788.png => character.788.png} (100%) rename mods/skinsdb/textures/{character_789.png => character.789.png} (100%) rename mods/skinsdb/textures/{character_790.png => character.790.png} (100%) rename mods/skinsdb/textures/{character_791.png => character.791.png} (100%) rename mods/skinsdb/textures/{character_792.png => character.792.png} (100%) rename mods/skinsdb/textures/{character_793.png => character.793.png} (100%) rename mods/skinsdb/textures/{character_794.png => character.794.png} (100%) rename mods/skinsdb/textures/{character_795.png => character.795.png} (100%) rename mods/skinsdb/textures/{character_796.png => character.796.png} (100%) rename mods/skinsdb/textures/{character_797.png => character.797.png} (100%) rename mods/skinsdb/textures/{character_798.png => character.798.png} (100%) rename mods/skinsdb/textures/{character_799.png => character.799.png} (100%) rename mods/skinsdb/textures/{character_8.png => character.8.png} (100%) rename mods/skinsdb/textures/{character_80.png => character.80.png} (100%) rename mods/skinsdb/textures/{character_800.png => character.800.png} (100%) rename mods/skinsdb/textures/{character_801.png => character.801.png} (100%) rename mods/skinsdb/textures/{character_802.png => character.802.png} (100%) rename mods/skinsdb/textures/{character_803.png => character.803.png} (100%) rename mods/skinsdb/textures/{character_804.png => character.804.png} (100%) rename mods/skinsdb/textures/{character_805.png => character.805.png} (100%) rename mods/skinsdb/textures/{character_806.png => character.806.png} (100%) rename mods/skinsdb/textures/{character_807.png => character.807.png} (100%) rename mods/skinsdb/textures/{character_808.png => character.808.png} (100%) rename mods/skinsdb/textures/{character_809.png => character.809.png} (100%) rename mods/skinsdb/textures/{character_81.png => character.81.png} (100%) rename mods/skinsdb/textures/{character_810.png => character.810.png} (100%) rename mods/skinsdb/textures/{character_811.png => character.811.png} (100%) rename mods/skinsdb/textures/{character_812.png => character.812.png} (100%) rename mods/skinsdb/textures/{character_813.png => character.813.png} (100%) rename mods/skinsdb/textures/{character_814.png => character.814.png} (100%) rename mods/skinsdb/textures/{character_815.png => character.815.png} (100%) rename mods/skinsdb/textures/{character_816.png => character.816.png} (100%) rename mods/skinsdb/textures/{character_817.png => character.817.png} (100%) rename mods/skinsdb/textures/{character_818.png => character.818.png} (100%) rename mods/skinsdb/textures/{character_819.png => character.819.png} (100%) rename mods/skinsdb/textures/{character_82.png => character.82.png} (100%) rename mods/skinsdb/textures/{character_821.png => character.821.png} (100%) rename mods/skinsdb/textures/{character_822.png => character.822.png} (100%) rename mods/skinsdb/textures/{character_823.png => character.823.png} (100%) rename mods/skinsdb/textures/{character_824.png => character.824.png} (100%) rename mods/skinsdb/textures/{character_827.png => character.827.png} (100%) rename mods/skinsdb/textures/{character_828.png => character.828.png} (100%) rename mods/skinsdb/textures/{character_829.png => character.829.png} (100%) rename mods/skinsdb/textures/{character_83.png => character.83.png} (100%) rename mods/skinsdb/textures/{character_830.png => character.830.png} (100%) rename mods/skinsdb/textures/{character_831.png => character.831.png} (100%) rename mods/skinsdb/textures/{character_832.png => character.832.png} (100%) rename mods/skinsdb/textures/{character_833.png => character.833.png} (100%) rename mods/skinsdb/textures/{character_834.png => character.834.png} (100%) rename mods/skinsdb/textures/{character_835.png => character.835.png} (100%) rename mods/skinsdb/textures/{character_836.png => character.836.png} (100%) rename mods/skinsdb/textures/{character_837.png => character.837.png} (100%) rename mods/skinsdb/textures/{character_838.png => character.838.png} (100%) rename mods/skinsdb/textures/{character_839.png => character.839.png} (100%) rename mods/skinsdb/textures/{character_84.png => character.84.png} (100%) rename mods/skinsdb/textures/{character_841.png => character.841.png} (100%) rename mods/skinsdb/textures/{character_843.png => character.843.png} (100%) rename mods/skinsdb/textures/{character_844.png => character.844.png} (100%) rename mods/skinsdb/textures/{character_845.png => character.845.png} (100%) rename mods/skinsdb/textures/{character_846.png => character.846.png} (100%) rename mods/skinsdb/textures/{character_847.png => character.847.png} (100%) rename mods/skinsdb/textures/{character_848.png => character.848.png} (100%) rename mods/skinsdb/textures/{character_85.png => character.85.png} (100%) rename mods/skinsdb/textures/{character_850.png => character.850.png} (100%) rename mods/skinsdb/textures/{character_851.png => character.851.png} (100%) rename mods/skinsdb/textures/{character_852.png => character.852.png} (100%) rename mods/skinsdb/textures/{character_853.png => character.853.png} (100%) rename mods/skinsdb/textures/{character_855.png => character.855.png} (100%) rename mods/skinsdb/textures/{character_856.png => character.856.png} (100%) rename mods/skinsdb/textures/{character_857.png => character.857.png} (100%) rename mods/skinsdb/textures/{character_859.png => character.859.png} (100%) rename mods/skinsdb/textures/{character_860.png => character.860.png} (100%) rename mods/skinsdb/textures/{character_861.png => character.861.png} (100%) rename mods/skinsdb/textures/{character_862.png => character.862.png} (100%) rename mods/skinsdb/textures/{character_863.png => character.863.png} (100%) rename mods/skinsdb/textures/{character_864.png => character.864.png} (100%) rename mods/skinsdb/textures/{character_865.png => character.865.png} (100%) rename mods/skinsdb/textures/{character_866.png => character.866.png} (100%) rename mods/skinsdb/textures/{character_869.png => character.869.png} (100%) rename mods/skinsdb/textures/{character_87.png => character.87.png} (100%) rename mods/skinsdb/textures/{character_870.png => character.870.png} (100%) rename mods/skinsdb/textures/{character_871.png => character.871.png} (100%) rename mods/skinsdb/textures/{character_874.png => character.874.png} (100%) rename mods/skinsdb/textures/{character_877.png => character.877.png} (100%) rename mods/skinsdb/textures/{character_878.png => character.878.png} (100%) rename mods/skinsdb/textures/{character_879.png => character.879.png} (100%) rename mods/skinsdb/textures/{character_88.png => character.88.png} (100%) rename mods/skinsdb/textures/{character_880.png => character.880.png} (100%) rename mods/skinsdb/textures/{character_881.png => character.881.png} (100%) rename mods/skinsdb/textures/{character_882.png => character.882.png} (100%) rename mods/skinsdb/textures/{character_883.png => character.883.png} (100%) rename mods/skinsdb/textures/{character_884.png => character.884.png} (100%) rename mods/skinsdb/textures/{character_885.png => character.885.png} (100%) rename mods/skinsdb/textures/{character_886.png => character.886.png} (100%) rename mods/skinsdb/textures/{character_887.png => character.887.png} (100%) rename mods/skinsdb/textures/{character_888.png => character.888.png} (100%) rename mods/skinsdb/textures/{character_889.png => character.889.png} (100%) rename mods/skinsdb/textures/{character_89.png => character.89.png} (100%) rename mods/skinsdb/textures/{character_890.png => character.890.png} (100%) rename mods/skinsdb/textures/{character_891.png => character.891.png} (100%) rename mods/skinsdb/textures/{character_893.png => character.893.png} (100%) rename mods/skinsdb/textures/{character_894.png => character.894.png} (100%) rename mods/skinsdb/textures/{character_895.png => character.895.png} (100%) rename mods/skinsdb/textures/{character_896.png => character.896.png} (100%) rename mods/skinsdb/textures/{character_897.png => character.897.png} (100%) rename mods/skinsdb/textures/{character_898.png => character.898.png} (100%) rename mods/skinsdb/textures/{character_899.png => character.899.png} (100%) rename mods/skinsdb/textures/{character_9.png => character.9.png} (100%) rename mods/skinsdb/textures/{character_900.png => character.900.png} (100%) rename mods/skinsdb/textures/{character_901.png => character.901.png} (100%) rename mods/skinsdb/textures/{character_902.png => character.902.png} (100%) rename mods/skinsdb/textures/{character_903.png => character.903.png} (100%) rename mods/skinsdb/textures/{character_904.png => character.904.png} (100%) rename mods/skinsdb/textures/{character_905.png => character.905.png} (100%) rename mods/skinsdb/textures/{character_906.png => character.906.png} (100%) rename mods/skinsdb/textures/{character_907.png => character.907.png} (100%) rename mods/skinsdb/textures/{character_908.png => character.908.png} (100%) rename mods/skinsdb/textures/{character_909.png => character.909.png} (100%) rename mods/skinsdb/textures/{character_910.png => character.910.png} (100%) rename mods/skinsdb/textures/{character_911.png => character.911.png} (100%) rename mods/skinsdb/textures/{character_912.png => character.912.png} (100%) rename mods/skinsdb/textures/{character_913.png => character.913.png} (100%) rename mods/skinsdb/textures/{character_914.png => character.914.png} (100%) rename mods/skinsdb/textures/{character_915.png => character.915.png} (100%) rename mods/skinsdb/textures/{character_916.png => character.916.png} (100%) rename mods/skinsdb/textures/{character_917.png => character.917.png} (100%) rename mods/skinsdb/textures/{character_918.png => character.918.png} (100%) rename mods/skinsdb/textures/{character_919.png => character.919.png} (100%) rename mods/skinsdb/textures/{character_92.png => character.92.png} (100%) rename mods/skinsdb/textures/{character_920.png => character.920.png} (100%) rename mods/skinsdb/textures/{character_921.png => character.921.png} (100%) rename mods/skinsdb/textures/{character_922.png => character.922.png} (100%) rename mods/skinsdb/textures/{character_923.png => character.923.png} (100%) rename mods/skinsdb/textures/{character_924.png => character.924.png} (100%) rename mods/skinsdb/textures/{character_925.png => character.925.png} (100%) rename mods/skinsdb/textures/{character_926.png => character.926.png} (100%) rename mods/skinsdb/textures/{character_927.png => character.927.png} (100%) rename mods/skinsdb/textures/{character_928.png => character.928.png} (100%) rename mods/skinsdb/textures/{character_929.png => character.929.png} (100%) rename mods/skinsdb/textures/{character_93.png => character.93.png} (100%) rename mods/skinsdb/textures/{character_930.png => character.930.png} (100%) rename mods/skinsdb/textures/{character_931.png => character.931.png} (100%) rename mods/skinsdb/textures/{character_932.png => character.932.png} (100%) rename mods/skinsdb/textures/{character_933.png => character.933.png} (100%) rename mods/skinsdb/textures/{character_934.png => character.934.png} (100%) rename mods/skinsdb/textures/{character_935.png => character.935.png} (100%) rename mods/skinsdb/textures/{character_936.png => character.936.png} (100%) rename mods/skinsdb/textures/{character_937.png => character.937.png} (100%) rename mods/skinsdb/textures/{character_938.png => character.938.png} (100%) rename mods/skinsdb/textures/{character_939.png => character.939.png} (100%) rename mods/skinsdb/textures/{character_940.png => character.940.png} (100%) rename mods/skinsdb/textures/{character_941.png => character.941.png} (100%) rename mods/skinsdb/textures/{character_942.png => character.942.png} (100%) rename mods/skinsdb/textures/{character_943.png => character.943.png} (100%) rename mods/skinsdb/textures/{character_944.png => character.944.png} (100%) rename mods/skinsdb/textures/{character_945.png => character.945.png} (100%) rename mods/skinsdb/textures/{character_946.png => character.946.png} (100%) rename mods/skinsdb/textures/{character_947.png => character.947.png} (100%) rename mods/skinsdb/textures/{character_948.png => character.948.png} (100%) rename mods/skinsdb/textures/{character_949.png => character.949.png} (100%) rename mods/skinsdb/textures/{character_95.png => character.95.png} (100%) rename mods/skinsdb/textures/{character_950.png => character.950.png} (100%) rename mods/skinsdb/textures/{character_951.png => character.951.png} (100%) rename mods/skinsdb/textures/{character_952.png => character.952.png} (100%) rename mods/skinsdb/textures/{character_953.png => character.953.png} (100%) rename mods/skinsdb/textures/{character_954.png => character.954.png} (100%) rename mods/skinsdb/textures/{character_955.png => character.955.png} (100%) rename mods/skinsdb/textures/{character_956.png => character.956.png} (100%) rename mods/skinsdb/textures/{character_957.png => character.957.png} (100%) rename mods/skinsdb/textures/{character_958.png => character.958.png} (100%) rename mods/skinsdb/textures/{character_959.png => character.959.png} (100%) rename mods/skinsdb/textures/{character_96.png => character.96.png} (100%) rename mods/skinsdb/textures/{character_960.png => character.960.png} (100%) rename mods/skinsdb/textures/{character_961.png => character.961.png} (100%) rename mods/skinsdb/textures/{character_962.png => character.962.png} (100%) rename mods/skinsdb/textures/{character_963.png => character.963.png} (100%) rename mods/skinsdb/textures/{character_964.png => character.964.png} (100%) rename mods/skinsdb/textures/{character_965.png => character.965.png} (100%) rename mods/skinsdb/textures/{character_966.png => character.966.png} (100%) rename mods/skinsdb/textures/{character_967.png => character.967.png} (100%) rename mods/skinsdb/textures/{character_968.png => character.968.png} (100%) rename mods/skinsdb/textures/{character_969.png => character.969.png} (100%) rename mods/skinsdb/textures/{character_970.png => character.970.png} (100%) rename mods/skinsdb/textures/{character_971.png => character.971.png} (100%) rename mods/skinsdb/textures/{character_972.png => character.972.png} (100%) rename mods/skinsdb/textures/{character_973.png => character.973.png} (100%) rename mods/skinsdb/textures/{character_974.png => character.974.png} (100%) rename mods/skinsdb/textures/{character_975.png => character.975.png} (100%) rename mods/skinsdb/textures/{character_976.png => character.976.png} (100%) rename mods/skinsdb/textures/{character_977.png => character.977.png} (100%) rename mods/skinsdb/textures/{character_978.png => character.978.png} (100%) rename mods/skinsdb/textures/{character_979.png => character.979.png} (100%) rename mods/skinsdb/textures/{character_98.png => character.98.png} (100%) rename mods/skinsdb/textures/{character_980.png => character.980.png} (100%) rename mods/skinsdb/textures/{character_981.png => character.981.png} (100%) rename mods/skinsdb/textures/{character_982.png => character.982.png} (100%) rename mods/skinsdb/textures/{character_983.png => character.983.png} (100%) rename mods/skinsdb/textures/{character_984.png => character.984.png} (100%) rename mods/skinsdb/textures/{character_985.png => character.985.png} (100%) rename mods/skinsdb/textures/{character_986.png => character.986.png} (100%) rename mods/skinsdb/textures/{character_987.png => character.987.png} (100%) rename mods/skinsdb/textures/{character_988.png => character.988.png} (100%) rename mods/skinsdb/textures/{character_989.png => character.989.png} (100%) rename mods/skinsdb/textures/{character_99.png => character.99.png} (100%) rename mods/skinsdb/textures/{character_990.png => character.990.png} (100%) rename mods/skinsdb/textures/{character_991.png => character.991.png} (100%) rename mods/skinsdb/textures/{character_992.png => character.992.png} (100%) rename mods/skinsdb/textures/{character_993.png => character.993.png} (100%) rename mods/skinsdb/textures/{character_994.png => character.994.png} (100%) rename mods/skinsdb/textures/{character_995.png => character.995.png} (100%) rename mods/skinsdb/textures/{character_996.png => character.996.png} (100%) rename mods/skinsdb/textures/{character_997.png => character.997.png} (100%) rename mods/skinsdb/textures/{character_998.png => character.998.png} (100%) rename mods/skinsdb/textures/{character_999.png => character.999.png} (100%) create mode 100644 mods/skinsdb/unittest.lua delete mode 100644 mods/smartshop/depends.txt delete mode 100644 mods/smartshop/description.txt create mode 100644 mods/smartshop/mod.conf create mode 100644 mods/spectator_mode/settingtypes.txt create mode 100644 mods/spectator_mode/spec/fixtures/beerchat.lua create mode 100644 mods/spectator_mode/spec/fixtures/mineunit_extensions.lua create mode 100644 mods/spectator_mode/spec/fixtures/player_api.lua create mode 100644 mods/spectator_mode/spec/init_spec.lua create mode 100644 mods/spectator_mode/spec/mineunit.conf create mode 100644 mods/stairs/README.md delete mode 100644 mods/stairs/README.txt delete mode 100644 mods/stairs/depends.txt delete mode 100644 mods/stairs/description.txt create mode 100644 mods/stairs/license.txt create mode 100644 mods/stairs/locale/stairs.de.tr create mode 100644 mods/stairs/locale/stairs.eo.tr create mode 100644 mods/stairs/locale/stairs.es.tr create mode 100644 mods/stairs/locale/stairs.fr.tr create mode 100644 mods/stairs/locale/stairs.id.tr create mode 100644 mods/stairs/locale/stairs.it.tr create mode 100644 mods/stairs/locale/stairs.ja.tr create mode 100644 mods/stairs/locale/stairs.jbo.tr create mode 100644 mods/stairs/locale/stairs.ms.tr create mode 100644 mods/stairs/locale/stairs.pl.tr create mode 100644 mods/stairs/locale/stairs.pt_BR.tr create mode 100644 mods/stairs/locale/stairs.ru.tr create mode 100644 mods/stairs/locale/stairs.sk.tr create mode 100644 mods/stairs/locale/stairs.sv.tr create mode 100644 mods/stairs/locale/stairs.uk.tr create mode 100644 mods/stairs/locale/stairs.zh_CN.tr create mode 100644 mods/stairs/locale/stairs.zh_TW.tr create mode 100644 mods/stairs/locale/template.txt create mode 100644 mods/stairs/settingtypes.txt delete mode 100644 mods/stairs/sounds/wool_coat_movement.ogg create mode 100644 mods/stairs/textures/stairs_glass_quarter.png create mode 100644 mods/stairs/textures/stairs_obsidian_glass_quarter.png delete mode 100644 mods/stamina/depends.txt delete mode 100644 mods/stamina/description.txt create mode 100644 mods/stamina/license.txt create mode 100644 mods/stamina/lucky_block.lua create mode 100644 mods/stamina/sounds/stamina_sip.1.ogg create mode 100644 mods/stamina/sounds/stamina_sip.2.ogg delete mode 100644 mods/stamina/sounds/stamina_sip.ogg delete mode 100644 mods/techpack/gravelsieve/depends.txt delete mode 100644 mods/techpack/gravelsieve/description.txt create mode 100644 mods/techpack/gravelsieve/locale/gravelsieve.zh_CN.tr create mode 100644 mods/techpack/gravelsieve/locale/gravelsieve.zh_TW.tr delete mode 100644 mods/techpack/lcdlib/depends.txt delete mode 100644 mods/techpack/safer_lua/depends.txt delete mode 100644 mods/techpack/safer_lua/description.txt delete mode 100644 mods/techpack/sl_controller/depends.txt delete mode 100644 mods/techpack/sl_controller/description.txt delete mode 100644 mods/techpack/smartline/depends.txt delete mode 100644 mods/techpack/smartline/description.txt create mode 100644 mods/techpack/smartline/locale/smartline.zh_CN.tr create mode 100644 mods/techpack/smartline/locale/smartline.zh_TW.tr delete mode 100644 mods/techpack/techpack_stairway/depends.txt delete mode 100644 mods/techpack/techpack_stairway/description.txt create mode 100644 mods/techpack/techpack_stairway/locale/techpack_stairway.zh_CN.tr create mode 100644 mods/techpack/techpack_stairway/locale/techpack_stairway.zh_TW.tr delete mode 100644 mods/techpack/techpack_warehouse/depends.txt delete mode 100644 mods/techpack/techpack_warehouse/description.txt create mode 100644 mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_CN.tr create mode 100644 mods/techpack/techpack_warehouse/locale/techpack_warehouse.zh_TW.tr delete mode 100644 mods/techpack/tubelib/depends.txt delete mode 100644 mods/techpack/tubelib/description.txt create mode 100644 mods/techpack/tubelib/locale/tubelib.zh_CN.tr create mode 100644 mods/techpack/tubelib/locale/tubelib.zh_TW.tr delete mode 100644 mods/techpack/tubelib_addons1/depends.txt delete mode 100644 mods/techpack/tubelib_addons1/description.txt create mode 100644 mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_CN.tr create mode 100644 mods/techpack/tubelib_addons1/locale/tubelib_addons1.zh_TW.tr delete mode 100644 mods/techpack/tubelib_addons2/depends.txt delete mode 100644 mods/techpack/tubelib_addons2/description.txt create mode 100644 mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_CN.tr create mode 100644 mods/techpack/tubelib_addons2/locale/tubelib_addons2.zh_TW.tr delete mode 100644 mods/techpack/tubelib_addons3/depends.txt delete mode 100644 mods/techpack/tubelib_addons3/description.txt create mode 100644 mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_CN.tr create mode 100644 mods/techpack/tubelib_addons3/locale/tubelib_addons3.zh_TW.tr create mode 100644 mods/trash_can/.luacheckrc create mode 100644 mods/trash_can/locale/template.txt create mode 100644 mods/trash_can/locale/trash_can.eo.tr create mode 100644 mods/trash_can/locale/trash_can.fr.tr create mode 100644 mods/trash_can/locale/trash_can.zh_CN.tr create mode 100644 mods/trash_can/locale/trash_can.zh_TW.tr delete mode 100755 mods/ts_furniture/depends.txt delete mode 100755 mods/ts_furniture/description.txt create mode 100644 mods/ts_furniture/locale/ts_furniture.fr.tr create mode 100644 mods/ts_workshop/.luacheckrc delete mode 100755 mods/ts_workshop/depends.txt delete mode 100755 mods/ts_workshop/description.txt delete mode 100644 mods/tubelib2/depends.txt delete mode 100644 mods/tubelib2/description.txt create mode 100644 mods/tubelib2/i18n.py delete mode 100644 mods/tubelib2/intllib.lua delete mode 100644 mods/tubelib2/locale/de.mo delete mode 100644 mods/tubelib2/locale/de.po delete mode 100644 mods/tubelib2/locale/template.pot create mode 100644 mods/tubelib2/locale/template.txt create mode 100644 mods/tubelib2/locale/tubelib2.de.tr create mode 100644 mods/tubelib2/locale/tubelib2.zh_CN.tr create mode 100644 mods/tubelib2/locale/tubelib2.zh_TW.tr create mode 100644 mods/unified_inventory/legacy.lua delete mode 100644 mods/unified_inventory/sounds/birds.ogg delete mode 100644 mods/unified_inventory/sounds/owl.ogg create mode 100644 mods/unified_inventory/sounds/ui_click.ogg create mode 100644 mods/unified_inventory/sounds/ui_morning.ogg create mode 100644 mods/unified_inventory/sounds/ui_owl.ogg create mode 100644 mods/unified_inventory/textures/ui_teleport.png create mode 100644 mods/unifiedbricks/.luacheckrc delete mode 100644 mods/unifiedbricks/depends.txt delete mode 100644 mods/unifiedbricks/description.txt delete mode 100644 mods/unifiedbricks/textures/unifiedbricks_mortar2.png delete mode 100644 mods/unifiedbricks/textures/unifiedbricks_mortar3.png delete mode 100644 mods/unifiedbricks/textures/unifiedbricks_mortar4.png create mode 100644 mods/unifieddyes/.luacheckrc create mode 100644 mods/vehicle_mash/locale/template.txt create mode 100644 mods/vehicle_mash/locale/vehicle_mash.es.tr delete mode 100755 mods/vehicle_mash/models/car_126r.x delete mode 100755 mods/vehicle_mash/models/car_f1.x delete mode 100644 mods/vehicle_mash/textures/car_126r.png delete mode 100755 mods/vehicle_mash/textures/car_126r_inventory.png delete mode 100755 mods/vehicle_mash/textures/car_126r_wield.png delete mode 100644 mods/vehicle_mash/textures/car_f1.png delete mode 100755 mods/vehicle_mash/textures/car_f1_inventory.png delete mode 100755 mods/vehicle_mash/textures/car_f1_wield.png create mode 100644 mods/windmill/bower.json create mode 100644 mods/windmill/mod.conf create mode 100644 mods/wine/agave.lua delete mode 100644 mods/wine/depends.txt create mode 100644 mods/wine/drinks.lua create mode 100644 mods/wine/lucky_block.lua delete mode 100644 mods/wine/screenshot.jpg create mode 100644 mods/wine/screenshot.png create mode 100644 mods/wine/textures/wine_barrel_fs_bg.png create mode 100644 mods/wine/textures/wine_barrel_icon.png create mode 100644 mods/wine/textures/wine_barrel_icon_bg.png create mode 100644 mods/wine/textures/wine_barrel_water.png delete mode 100644 mods/wine/textures/wine_champagne_raw_glass.png create mode 100644 mods/wine/textures/wine_cointreau_bottle.png create mode 100644 mods/wine/textures/wine_cointreau_glass.png create mode 100644 mods/wine/textures/wine_drinking_glass.png create mode 100644 mods/wine/textures/wine_kefir_bottle.png create mode 100644 mods/wine/textures/wine_kefir_glass.png create mode 100644 mods/wine/textures/wine_margarita_glass.png create mode 100644 mods/wine/textures/wine_sparkling_agave_juice_bottle.png create mode 100644 mods/wine/textures/wine_sparkling_agave_juice_glass.png create mode 100644 mods/wine/textures/wine_sparkling_apple_juice_bottle.png create mode 100644 mods/wine/textures/wine_sparkling_apple_juice_glass.png create mode 100644 mods/wine/textures/wine_sparkling_blackberry_juice_bottle.png create mode 100644 mods/wine/textures/wine_sparkling_blackberry_juice_glass.png create mode 100644 mods/wine/textures/wine_sparkling_carrot_juice_bottle.png create mode 100644 mods/wine/textures/wine_sparkling_carrot_juice_glass.png delete mode 100644 mods/wool/depends.txt create mode 100644 mods/wool/license.txt create mode 100644 mods/wool/locale/template.txt create mode 100644 mods/wool/locale/wool.de.tr create mode 100644 mods/wool/locale/wool.eo.tr create mode 100644 mods/wool/locale/wool.es.tr create mode 100644 mods/wool/locale/wool.fr.tr create mode 100644 mods/wool/locale/wool.id.tr create mode 100644 mods/wool/locale/wool.it.tr create mode 100644 mods/wool/locale/wool.ja.tr create mode 100644 mods/wool/locale/wool.jbo.tr create mode 100644 mods/wool/locale/wool.ms.tr create mode 100644 mods/wool/locale/wool.pl.tr create mode 100644 mods/wool/locale/wool.pt_BR.tr create mode 100644 mods/wool/locale/wool.ru.tr create mode 100644 mods/wool/locale/wool.sk.tr create mode 100644 mods/wool/locale/wool.sv.tr create mode 100644 mods/wool/locale/wool.uk.tr create mode 100644 mods/wool/locale/wool.zh_CN.tr create mode 100644 mods/wool/locale/wool.zh_TW.tr create mode 100644 mods/xban2/LICENSE create mode 100644 mods/xcompat/.luacheckrc create mode 100644 mods/xcompat/LICENSE create mode 100644 mods/xcompat/README.md create mode 100644 mods/xcompat/doc/functions.md create mode 100644 mods/xcompat/doc/gameid.md create mode 100644 mods/xcompat/doc/materials.md create mode 100644 mods/xcompat/doc/player.md create mode 100644 mods/xcompat/doc/sounds.md create mode 100644 mods/xcompat/doc/textures.md create mode 100644 mods/xcompat/gitattributes create mode 100644 mods/xcompat/init.lua create mode 100644 mods/xcompat/mod.conf create mode 100644 mods/xcompat/mtt.lua create mode 100644 mods/xcompat/src/commands.lua create mode 100644 mods/xcompat/src/functions.lua create mode 100644 mods/xcompat/src/gameid.lua create mode 100644 mods/xcompat/src/materials.lua create mode 100644 mods/xcompat/src/materials/farlands_reloaded.lua create mode 100644 mods/xcompat/src/materials/hades_revisited.lua create mode 100644 mods/xcompat/src/materials/mineclonia.lua create mode 100644 mods/xcompat/src/materials/minetest.lua create mode 100644 mods/xcompat/src/player.lua create mode 100644 mods/xcompat/src/player/farlands_reloaded.lua create mode 100644 mods/xcompat/src/player/mineclonia.lua create mode 100644 mods/xcompat/src/player/minetest.lua create mode 100644 mods/xcompat/src/player/xcompat_agnostic.lua create mode 100644 mods/xcompat/src/sounds.lua create mode 100644 mods/xcompat/src/sounds/exile.lua create mode 100644 mods/xcompat/src/sounds/farlands_reloaded.lua create mode 100644 mods/xcompat/src/sounds/forgotten_lands.lua create mode 100644 mods/xcompat/src/sounds/hades_revisited.lua create mode 100644 mods/xcompat/src/sounds/ksurvive2.lua create mode 100644 mods/xcompat/src/sounds/mineclonia.lua create mode 100644 mods/xcompat/src/sounds/minetest.lua create mode 100644 mods/xcompat/src/sounds/xcompat_agnostic.lua create mode 100644 mods/xcompat/src/textures.lua create mode 100644 mods/xcompat/src/textures/farlands_reloaded.lua create mode 100644 mods/xcompat/src/textures/minetest.lua create mode 100644 mods/xcompat/src/textures/xcompat_agnostic.lua create mode 100644 mods/xcompat/src/utilities.lua create mode 100644 mods/xcompat/test/nodelist/farlands_reloaded.txt create mode 100644 mods/xcompat/test/nodelist/hades_revisited.txt create mode 100644 mods/xcompat/test/nodelist/mineclonia.txt create mode 100644 mods/xcompat/test/nodelist/minetest.txt create mode 100644 mods/xcompat/test/nodelist/voxelibre.txt diff --git a/README.md b/README.md index d1958e21..258880bb 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ reset-map-and-players --> reset map and players databases __Requirements:__ -Ubuntu 20.04 (works in LXD) +Ubuntu 20.04/22.04 (works in LXD) Be in the project directory via cd before you run any scripts! diff --git a/config-file-example b/config-file-example index a32698ae..0e536e3f 100644 --- a/config-file-example +++ b/config-file-example @@ -1,4 +1,5 @@ -mt_version="5.4.1" +mt_version="5.10.0" +mt_game_version="5.8.0" first_install=y ufw_enable=y ufw_ssh_port_for_accept=22 diff --git a/mods-download b/mods-download index ef611d78..68571703 100755 --- a/mods-download +++ b/mods-download @@ -3,6 +3,10 @@ rm -rf mods mkdir mods cd mods + +git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/digilines.git +git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mesecons.git +git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/xcompat.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/3d_armor.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/unified_inventory.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/unifiedbricks.git @@ -69,32 +73,32 @@ git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-m git clone --recurse-submodules --depth 1 --branch master https://github.com/cheapie/plasticbox.git git clone --recurse-submodules --depth 1 --branch master https://github.com/torusJKL/charcoal.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Sokomine/windmill.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/farming.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/protector.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/playerplus.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_npc.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_redo.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_water.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_monster.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_animal.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mob_horse.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bows.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/builtin_item.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bonemeal.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/stamina.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/wine.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bees.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/wool.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/regrow.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/ambience.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bakedclay.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/stairs.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/anvils.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/carts.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/doors.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/pie.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/castle.git -git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_sky.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/farming.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/protector.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/playerplus.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_npc.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_redo.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_water.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_monster.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_animal.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mob_horse.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bows.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/builtin_item.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bonemeal.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/stamina.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/wine.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bees.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/wool.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/regrow.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/ambience.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/bakedclay.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/stairs.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/anvils.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/carts.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/doors.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/pie.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/castle.git +git clone --recurse-submodules --depth 1 --branch master https://codeberg.org/tenplus1/mobs_sky.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Uberi/Minetest-WorldEdit.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/realchess.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Grizzly-Adam/BBQ.git @@ -146,6 +150,8 @@ echo "This fix can be removed after some time" sed -i 's/run_at_every_load = false,/run_at_every_load = true,/' homedecor_modpack/homedecor_kitchen/init.lua fi +sed -i 's/homedecor/homedecor?/' plasticbox/depends.txt + #update skins-db cd skinsdb/updater python3 update_skins.py diff --git a/mods-list b/mods-list index 97fb8ef7..9ca92004 100644 --- a/mods-list +++ b/mods-list @@ -16,7 +16,6 @@ load_mod_letters = true load_mod_trafficlight = true load_mod_jukebox = true load_mod_tubelib_addons1 = true -load_mod_plasmascreen = true load_mod_mobs_npc = true load_mod_my_future_doors = true load_mod_itemframes = true @@ -29,7 +28,6 @@ load_mod_builtin_item = true load_mod_homedecor_exterior = true load_mod_flowerpot = true load_mod_3d_armor_stand = true -load_mod_junglegrass = true load_mod_mobs_crocs = true load_mod_homedecor_electrical = true load_mod_homedecor_doors_and_gates = true @@ -75,7 +73,6 @@ load_mod_bbq = true load_mod_wieldview = true load_mod_death_compass = true load_mod_facade = true -load_mod_inbox = true load_mod_cloud_items = true load_mod_bows = true load_mod_3dmushrooms = true @@ -273,3 +270,50 @@ load_mod_home_vending_machines = true load_mod_pl_sunflowers = true load_mod_pl_seaweed = true load_mod_pl_waterlilies = true +load_mod_homedecor_inbox = true +load_mod_armor_steel = true +load_mod_armor_nether = true +load_mod_armor_mithril = true +load_mod_armor_gold = true +load_mod_armor_diamond = true +load_mod_armor_cactus = true +load_mod_armor_bronze = true +load_mod_armor_admin = true +load_mod_armor_crystal = true +load_mod_homedecor_plasmascreen = true +load_mod_armor_wood = true +load_mod_xcompat = true +load_mod_mesecons_wires = true +load_mod_mesecons_walllever = true +load_mod_mesecons_torch = true +load_mod_mesecons_solarpanel = true +load_mod_mesecons_random = true +load_mod_mesecons_pressureplates = true +load_mod_mesecons_powerplant = true +load_mod_mesecons_pistons = true +load_mod_mesecons_mvps = true +load_mod_mesecons_luacontroller = true +load_mod_mesecons_movestones = true +load_mod_mesecons_lightstone = true +load_mod_mesecons_lamp = true +load_mod_mesecons_insulated = true +load_mod_mesecons_gates = true +load_mod_mesecons_extrawires = true +load_mod_mesecons_detector = true +load_mod_mesecons_delayer = true +load_mod_mesecons_commandblock = true +load_mod_mesecons_button = true +load_mod_mesecons_blinkyplant = true +load_mod_digilines = true +load_mod_mesecons_microcontroller = true +load_mod_mesecons_gamecompat = true +load_mod_mesecons_alias = true +load_mod_mesecons_receiver = true +load_mod_mesecons_fpga = true +load_mod_mesecons = true +load_mod_mesecons_materials = true +load_mod_mesecons_hydroturbine = true +load_mod_mesecons_switch = true +load_mod_mesecons_stickyblocks = true +load_mod_mesecons_noteblock = true +load_mod_mesecons_doors = true diff --git a/mods/3d_armor/.ldoc/crafting.luadoc b/mods/3d_armor/.ldoc/crafting.luadoc new file mode 100644 index 00000000..7f24674b --- /dev/null +++ b/mods/3d_armor/.ldoc/crafting.luadoc @@ -0,0 +1,39 @@ + +--- 3D Armor Crafting +-- +-- @topic crafting + + +--- Craft recipes for helmets, chestplates, leggings, boots, & shields. +-- +-- @craft armor +-- @usage +-- Key: +-- - m: material +-- - wood: group:wood +-- - cactus: default:cactus +-- - steel: default:steel_ingot +-- - bronze: default:bronze_ingot +-- - diamond: default:diamond +-- - gold: default:gold_ingot +-- - mithril: moreores:mithril_ingot +-- - crystal: ethereal:crystal_ingot +-- - nether: nether:nether_ingot +-- +-- helmet: chestplate: leggings: +-- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+-- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ +-- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ +-- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ +-- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ +-- +-- boots: shield: +-- ┌───┬───┬───┠┌───┬───┬───┠+-- │ │ │ │ │ m │ m │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ +-- │ m │ │ m │ │ m │ m │ m │ +-- ├───┼───┼───┤ ├───┼───┼───┤ +-- │ m │ │ m │ │ │ m │ │ +-- └───┴───┴───┘ └───┴───┴───┘ diff --git a/mods/3d_armor/.ldoc/gendoc.sh b/mods/3d_armor/.ldoc/gendoc.sh index df70dc85..5c84a145 100755 --- a/mods/3d_armor/.ldoc/gendoc.sh +++ b/mods/3d_armor/.ldoc/gendoc.sh @@ -31,7 +31,7 @@ rm -rf "${d_export}" # generate items, settings, & crafts topics temp files echo -e "\ngenerating temp files ..." -for script in "src" "settings" "crafts"; do +for script in src settings; do script="${d_ldoc}/parse_${script}.py" if test ! -f "${script}"; then echo "ERROR: script doesn't exist: ${script}" @@ -48,7 +48,7 @@ done echo # generate new doc files -"${cmd_ldoc}" --UNSAFE_NO_SANDBOX -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$? +"${cmd_ldoc}" --unsafe_no_sandbox -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$? # check exit status if test ${retval} -ne 0; then @@ -57,7 +57,7 @@ if test ${retval} -ne 0; then fi echo -e "\ncleaning temp files ..." -rm -vf "${d_ldoc}/"*.luadoc +find "${d_ldoc}" -type f -name "*.luadoc" ! -name "crafting.luadoc" -exec rm -vf {} + # HACK: ldoc does not seem to like the "shields:" prefix echo -e "\ncompensating for LDoc's issue with \"shields:\" prefix ..." @@ -72,7 +72,7 @@ sed -i \ printf "\ncopying textures ..." mkdir -p "${d_data}" texture_count=0 -for d_mod in "3d_armor" "shields"; do +for d_mod in armor_* shields; do printf "\rcopying textures from ${d_mod} ...\n" for png in $(find "${d_root}/${d_mod}/textures" -maxdepth 1 -type f -name "*.png"); do if test -f "${d_data}/$(basename ${png})"; then diff --git a/mods/3d_armor/.ldoc/parse_crafts.py b/mods/3d_armor/.ldoc/parse_crafts.py deleted file mode 100755 index ea0af471..00000000 --- a/mods/3d_armor/.ldoc/parse_crafts.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -# This script will parse source files for craft recipes. - -import sys, os, codecs, errno - - -path = os.path.realpath(__file__) -script = os.path.basename(path) -d_root = os.path.dirname(os.path.dirname(path)) -d_ldoc = os.path.join(d_root, ".ldoc") - -craftfile = os.path.realpath(os.path.join(d_root, "3d_armor/armor.lua")) -if not os.path.isfile(craftfile): - print("ERROR: craft file does not exist for parsing: {}".format(craftfile)) - sys.exit(errnor.ENOENT) - -buffer = codecs.open(craftfile, "r", "utf-8") -if not buffer: - print("ERROR: could not open file for reading: {}".format(craftfile)) - sys.exit(errno.EIO) - -data_in = buffer.read() -buffer.close() - -craft = "" - -data_in = data_in.replace("\r\n", "\n").replace("\r", "\n") -for sect in data_in.split("\n---"): - if "@craft armor" in sect: - sect = "---{}".format(sect) - for li in sect.split("\n"): - if li.startswith("--"): - craft = "{}\n{}".format(craft, li) - -outfile = os.path.join(d_ldoc, "crafting.luadoc") - -buffer = codecs.open(outfile, "w", "utf-8") -if not buffer: - print("ERROR: could not open file for writing: {}".format(outfile)) - sys.exit(errno.EIO) - -buffer.write("\n--- 3D Armor Crafting\n--\n-- @topic crafting\n\n{}\n".format(craft)) -buffer.close() - -print("crafts exported to\t{}".format(outfile)) diff --git a/mods/3d_armor/.luacheckrc b/mods/3d_armor/.luacheckrc index 88349afc..6b769d66 100644 --- a/mods/3d_armor/.luacheckrc +++ b/mods/3d_armor/.luacheckrc @@ -18,6 +18,7 @@ read_globals = { -- deps "default", + "player_api", "minetest", "unified_inventory", "wardrobe", diff --git a/mods/3d_armor/3d_armor/LICENSE.txt b/mods/3d_armor/3d_armor/LICENSE.txt deleted file mode 100644 index f253f299..00000000 --- a/mods/3d_armor/3d_armor/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -[mod] 3d Armor [3d_armor] -========================= - -License Source Code -------------------- - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -License Textures ----------------- - -Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0 diff --git a/mods/3d_armor/3d_armor/README.md b/mods/3d_armor/3d_armor/README.md index 32fc07ef..b023784a 100644 --- a/mods/3d_armor/3d_armor/README.md +++ b/mods/3d_armor/3d_armor/README.md @@ -6,7 +6,7 @@ |-[Armor Configuration](#armor-configuration) |||- - [3d_Armor Item Storage](#3d_armor-item-storage) |- - [disable_specific_materials](#to-disable-individual-armor-materials) |||- - [Armor Registration](#armor-registration) |- - [armor_init_delay](#initialization-glitches-when-a-player-first-joins) |||- - [Registering Armor Groups](#registering-armor-groups) -|- - [armor_init_times](#number-of-initialization-attempts) |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor) +|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor) |- - [armor_bones_delay](#armor-not-in-bones-due-to-server-lag) |||- - - [Elements](#elements) |- - [armor_update_time](#how-often-player-armor-items-are-updated) |||- - - [Attributes](#attributes) |- - [armor_drop](#drop-armor-when-a-player-dies) |||- - - [Physics](#physics) @@ -19,7 +19,7 @@ |- - [armor_fire_protect](#enable-fire-protection) |||- - - [armor:remove_all](#armor-remove_all) |- - [armor_punch_damage](#enable-punch-damage-effects) |||- - - [armor:equip](#armor-equip) |- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories) |||- - - [armor:unequip](#armor-unequip) -|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - - [armor:update_skin](#armor-update_skin) +| |||- - - [armor:update_skin](#armor-update_skin) |-[Credits](#credits) |||- - [Callbacks](#Callbacks) | |||- - - [Item callbacks](#item-callbacks) | |||- - - [Global callbacks](#global-callbacks) @@ -60,11 +60,6 @@ Change the following default settings by going to Main Menu>>Settings(Tab)>>All armor_init_delay = 2 -### Number of initialization attempts - **Increase to prevent glitches - Use in conjunction with armor_init_delay if initialization problems persist.** - - armor_init_times = 10 - ### Armor not in bones due to server lag **Increase to help resolve** @@ -254,7 +249,7 @@ The above allows armor to block/prevent new damage types but you also need to as ## Groups used by 3d_Armor 3d_armor has many default groups already registered, these are categorized under 4 main headings - **Elements:** armor_head, armor_torso, armor_legs, armor_feet - - **Attributes:** armor_heal, armor_fire, armor_water + - **Attributes:** armor_heal, armor_fire, armor_water, armor_feather - **Physics:** physics_jump, physics_speed, physics_gravity - **Durability:** armor_use, flammable @@ -334,6 +329,9 @@ The below Diamond chestplate has a 12% chance to completely block all damage (ar damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, }) +#### Armor_feather +***"Armor_feather"*** will slow a player when falling. This only has one level or state, which is armor_feather=1 + ### Physics The physics attributes supported by 3d_armor are ***physics_jump, physics_speed and physics_gravity***. Although 3d_armor supports the use of this with no other mods it is recommended that the mod [player_monoids](https://forum.minetest.net/viewtopic.php?t=14895) is used to help with intermod compatability. diff --git a/mods/3d_armor/3d_armor/api.lua b/mods/3d_armor/3d_armor/api.lua index 112d208d..065f1f9f 100644 --- a/mods/3d_armor/3d_armor/api.lua +++ b/mods/3d_armor/3d_armor/api.lua @@ -112,7 +112,7 @@ armor = { timer = 0, elements = {"head", "torso", "legs", "feet"}, physics = {"jump", "speed", "gravity"}, - attributes = {"heal", "fire", "water"}, + attributes = {"heal", "fire", "water", "feather"}, formspec = "image[2.5,0;2,4;armor_preview]".. default.gui_bg.. default.gui_bg_img.. @@ -162,7 +162,6 @@ armor = { armor.config = { init_delay = 2, - init_times = 10, bones_delay = 1, update_time = 1, drop = minetest.get_modpath("bones") ~= nil, @@ -183,6 +182,7 @@ armor.config = { water_protect = true, fire_protect = minetest.get_modpath("ethereal") ~= nil, fire_protect_torch = minetest.get_modpath("ethereal") ~= nil, + feather_fall = true, punch_damage = true, } @@ -352,7 +352,7 @@ armor.update_player_visuals = function(self, player) end local name = player:get_player_name() if self.textures[name] then - default.player_set_textures(player, { + player_api.set_textures(player, { self.textures[name].skin, self.textures[name].armor, self.textures[name].wielditem, @@ -373,7 +373,7 @@ armor.set_player_armor = function(self, player) local state = 0 local count = 0 local preview = armor:get_preview(name) - local texture = "3d_armor_trans.png" + local texture = "blank.png" local physics = {} local attributes = {} local levels = {} @@ -415,7 +415,7 @@ armor.set_player_armor = function(self, player) end -- DEPRECATED, use armor_groups instead if def.groups["armor_radiation"] and levels["radiation"] then - levels["radiation"] = def.groups["armor_radiation"] + levels["radiation"] = levels["radiation"] + def.groups["armor_radiation"] end end local item = stack:get_name() @@ -490,10 +490,13 @@ armor.set_player_armor = function(self, player) armor_monoid.monoid:add_change(player, change, "3d_armor:armor") else -- Preserve immortal group (damage disabled for player) - local immortal = player:get_armor_groups().immortal + local player_groups = player:get_armor_groups() + local immortal = player_groups.immortal if immortal and immortal ~= 0 then groups.immortal = 1 end + -- Preserve fall_damage_add_percent group (fall damage modifier) + groups.fall_damage_add_percent = player_groups.fall_damage_add_percent player:set_armor_groups(groups) end if use_player_monoids then @@ -627,6 +630,9 @@ end armor.damage = function(self, player, index, stack, use) local old_stack = ItemStack(stack) local worn_armor = armor:get_weared_armor_elements(player) + if not worn_armor then + return + end local armor_worn_cnt = 0 for k,v in pairs(worn_armor) do armor_worn_cnt = armor_worn_cnt + 1 @@ -677,6 +683,10 @@ armor.equip = function(self, player, itemstack) for i=1, armor_inv:get_size("armor") do local stack = armor_inv:get_stack("armor", i) if self:get_element(stack:get_name()) == armor_element then + --prevents equiping an armor that would unequip a cursed armor. + if minetest.get_item_group(stack:get_name(), "cursed") ~= 0 then + return itemstack + end index = i self:unequip(player, armor_element) break @@ -709,11 +719,14 @@ armor.unequip = function(self, player, armor_element) if self:get_element(stack:get_name()) == armor_element then armor_inv:set_stack("armor", i, "") minetest.after(0, function() - local inv = player:get_inventory() - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - else - minetest.add_item(player:get_pos(), stack) + local pplayer = minetest.get_player_by_name(name) + if pplayer then -- player is still online + local inv = pplayer:get_inventory() + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + minetest.add_item(pplayer:get_pos(), stack) + end end end) self:run_callbacks("on_unequip", player, i, stack) @@ -798,9 +811,6 @@ end -- @tparam[opt] bool listring Use `listring` formspec element (default: `false`). -- @treturn string Formspec formatted string. armor.get_armor_formspec = function(self, name, listring) - if armor.def[name].init_time == 0 then - return "label[0,0;Armor not initialized!]" - end local formspec = armor.formspec.. "list[detached:"..name.."_armor;armor;0,0.5;2,3;]" if listring == true then @@ -929,6 +939,10 @@ armor.get_valid_player = function(self, player, msg) minetest.log("warning", ("3d_armor%s: Player reference is nil"):format(msg)) return end + if type(player) ~= "userdata" then + -- Fake player, fail silently + return + end local name = player:get_player_name() if not name then minetest.log("warning", ("3d_armor%s: Player name is nil"):format(msg)) diff --git a/mods/3d_armor/3d_armor/armor.conf.example b/mods/3d_armor/3d_armor/armor.conf.example index af403968..ee63812a 100644 --- a/mods/3d_armor/3d_armor/armor.conf.example +++ b/mods/3d_armor/3d_armor/armor.conf.example @@ -35,10 +35,6 @@ ARMOR_FIRE_NODES = { -- Increase this if you get initialization glitches when a player first joins. ARMOR_INIT_DELAY = 1 --- Number of initialization attempts. --- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist. -ARMOR_INIT_TIMES = 1 - -- Increase this if armor is not getting into bones due to server lag. ARMOR_BONES_DELAY = 1 diff --git a/mods/3d_armor/3d_armor/armor.lua b/mods/3d_armor/3d_armor/armor.lua deleted file mode 100644 index 7a364ad7..00000000 --- a/mods/3d_armor/3d_armor/armor.lua +++ /dev/null @@ -1,1027 +0,0 @@ - ---- Registered armors. --- --- @topic armor - - --- support for i18n -local S = armor.get_translator - - ---- Admin Helmet --- --- @helmet 3d_armor:helmet_admin --- @img 3d_armor_inv_helmet_admin.png --- @grp armor_head 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp armor_water 1 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:helmet_admin", { - description = S("Admin Helmet"), - inventory_image = "3d_armor_inv_helmet_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - ---- Admin Chestplate --- --- @chestplate 3d_armor:chestplate_admin --- @img 3d_armor_inv_chestplate_admin.png --- @grp armor_torso 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:chestplate_admin", { - description = S("Admin Chestplate"), - inventory_image = "3d_armor_inv_chestplate_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_torso=1, armor_heal=100, armor_use=0, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - ---- Admin Leggings --- --- @leggings 3d_armor:leggings_admin --- @img 3d_armor_inv_leggings_admin.png --- @grp armor_legs 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:leggings_admin", { - description = S("Admin Leggings"), - inventory_image = "3d_armor_inv_leggings_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_legs=1, armor_heal=100, armor_use=0, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - ---- Admin Boots --- --- @boots 3d_armor:boots_admin --- @img 3d_armor_inv_boots_admin.png --- @grp armor_feet 1 --- @grp armor_heal 100 --- @grp armor_use 0 --- @grp not_in_creative_inventory 1 --- @armorgrp fleshy 100 -armor:register_armor("3d_armor:boots_admin", { - description = S("Admin Boots"), - inventory_image = "3d_armor_inv_boots_admin.png", - armor_groups = {fleshy=100}, - groups = {armor_feet=1, armor_heal=100, armor_use=0, - not_in_creative_inventory=1}, - on_drop = function(itemstack, dropper, pos) - return - end, -}) - -minetest.register_alias("adminboots", "3d_armor:boots_admin") -minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") -minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") -minetest.register_alias("adminleggings", "3d_armor:leggings_admin") - - ---- Wood --- --- Requires setting `armor_material_wood`. --- --- @section wood - -if armor.materials.wood then - --- Wood Helmet - -- - -- @helmet 3d_armor:helmet_wood - -- @img 3d_armor_inv_helmet_wood.png - -- @grp armor_head 1 - -- @grp armor_heal 0 - -- @grp armor_use 2000 - -- @grp flammable 1 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:helmet_wood", { - description = S("Wood Helmet"), - inventory_image = "3d_armor_inv_helmet_wood.png", - groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - }) - --- Wood Chestplate - -- - -- @chestplate 3d_armor:chestplate_wood - -- @img 3d_armor_inv_chestplate_wood.png - -- @grp armor_torso 1 - -- @grp armor_heal 0 - -- @grp armor_use 2000 - -- @grp flammable 1 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:chestplate_wood", { - description = S("Wood Chestplate"), - inventory_image = "3d_armor_inv_chestplate_wood.png", - groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - }) - --- Wood Leggings - -- - -- @leggings 3d_armor:leggings_wood - -- @img 3d_armor_inv_leggings_wood.png - -- @grp armor_legs 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @grp flammable 1 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:leggings_wood", { - description = S("Wood Leggings"), - inventory_image = "3d_armor_inv_leggings_wood.png", - groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - }) - --- Wood Boots - -- - -- @boots 3d_armor:boots_wood - -- @img 3d_armor_inv_boots_wood.png - -- @grp armor_feet 1 - -- @grp armor_heal 0 - -- @grp armor_use 2000 - -- @grp flammable 1 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 3 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:boots_wood", { - description = S("Wood Boots"), - inventory_image = "3d_armor_inv_boots_wood.png", - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, - groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1}, - }) - local wood_armor_fuel = { - helmet = 6, - chestplate = 8, - leggings = 7, - boots = 5 - } - for armor, burn in pairs(wood_armor_fuel) do - minetest.register_craft({ - type = "fuel", - recipe = "3d_armor:" .. armor .. "_wood", - burntime = burn, - }) - end -end - - ---- Cactus --- --- Requires setting `armor_material_cactus`. --- --- @section cactus - -if armor.materials.cactus then - --- Cactus Helmet - -- - -- @helmet 3d_armor:helmet_cactus - -- @img 3d_armor_inv_helmet_cactus.png - -- @grp armor_head 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:helmet_cactus", { - description = S("Cactus Helmet"), - inventory_image = "3d_armor_inv_helmet_cactus.png", - groups = {armor_head=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - --- Cactus Chestplate - -- - -- @chestplate 3d_armor:chestplate_cactus - -- @img 3d_armor_inv_chestplate_cactus.png - -- @grp armor_torso 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:chestplate_cactus", { - description = S("Cactus Chestplate"), - inventory_image = "3d_armor_inv_chestplate_cactus.png", - groups = {armor_torso=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - --- Cactus Leggings - -- - -- @leggings 3d_armor:leggings_cactus - -- @img 3d_armor_inv_leggings_cactus.png - -- @grp armor_legs 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:leggings_cactus", { - description = S("Cactus Leggings"), - inventory_image = "3d_armor_inv_leggings_cactus.png", - groups = {armor_legs=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - --- Cactus Boots - -- - -- @boots 3d_armor:boots_cactus - -- @img 3d_armor_inv_boots_cactus.png - -- @grp armor_feet 1 - -- @grp armor_heal 0 - -- @grp armor_use 1000 - -- @armorgrp fleshy 5 - -- @damagegrp cracky 3 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 2 - -- @damagegrp level 1 - armor:register_armor("3d_armor:boots_cactus", { - description = S("Cactus Boots"), - inventory_image = "3d_armor_inv_boots_cactus.png", - groups = {armor_feet=1, armor_heal=0, armor_use=1000}, - armor_groups = {fleshy=5}, - damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, - }) - local cactus_armor_fuel = { - helmet = 14, - chestplate = 16, - leggings = 15, - boots = 13 - } - for armor, burn in pairs(cactus_armor_fuel) do - minetest.register_craft({ - type = "fuel", - recipe = "3d_armor:" .. armor .. "_cactus", - burntime = burn, - }) - end -end - - ---- Steel --- --- Requires setting `armor_material_steel`. --- --- @section steel - -if armor.materials.steel then - --- Steel Helmet - -- - -- @helmet 3d_armor:helmet_steel - -- @img 3d_armor_inv_helmet_steel.png - -- @grp armor_head 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed -0.01 - -- @grp physica_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:helmet_steel", { - description = S("Steel Helmet"), - inventory_image = "3d_armor_inv_helmet_steel.png", - groups = {armor_head=1, armor_heal=0, armor_use=800, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) - --- Steel Chestplate - -- - -- @chestplate 3d_armor:chestplate_steel - -- @img 3d_armor_inv_chestplate_steel.png - -- @grp armor_torso 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed - -- @grp physics_gravity - -- @armorgrp fleshy - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:chestplate_steel", { - description = S("Steel Chestplate"), - inventory_image = "3d_armor_inv_chestplate_steel.png", - groups = {armor_torso=1, armor_heal=0, armor_use=800, - physics_speed=-0.04, physics_gravity=0.04}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) - --- Steel Leggings - -- - -- @leggings 3d_armor:leggings_steel - -- @img 3d_armor_inv_leggings_steel.png - -- @grp armor_legs 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed -0.03 - -- @grp physics_gravity 0.03 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:leggings_steel", { - description = S("Steel Leggings"), - inventory_image = "3d_armor_inv_leggings_steel.png", - groups = {armor_legs=1, armor_heal=0, armor_use=800, - physics_speed=-0.03, physics_gravity=0.03}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) - --- Steel Boots - -- - -- @boots 3d_armor:boots_steel - -- @img 3d_armor_inv_boots_steel.png - -- @grp armor_feet 1 - -- @grp armor_heal 0 - -- @grp armor_use 800 - -- @grp physics_speed -0.01 - -- @grp physics_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 2 - -- @damagegrp snappy 3 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:boots_steel", { - description = S("Steel Boots"), - inventory_image = "3d_armor_inv_boots_steel.png", - groups = {armor_feet=1, armor_heal=0, armor_use=800, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, - }) -end - - ---- Bronze --- --- Requires setting `armor_material_bronze`. --- --- @section bronze - -if armor.materials.bronze then - --- Bronze Helmet - -- - -- @helmet 3d_armor:helmet_bronze - -- @img 3d_armor_inv_helmet_bronze.png - -- @grp armor_head 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.01 - -- @grp physics_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:helmet_bronze", { - description = S("Bronze Helmet"), - inventory_image = "3d_armor_inv_helmet_bronze.png", - groups = {armor_head=1, armor_heal=6, armor_use=400, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) - --- Bronze Chestplate - -- - -- @chestplate 3d_armor:chestplate_bronze - -- @img 3d_armor_inv_chestplate_bronze.png - -- @grp armor_torso 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.04 - -- @grp physics_gravity 0.04 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:chestplate_bronze", { - description = S("Bronze Chestplate"), - inventory_image = "3d_armor_inv_chestplate_bronze.png", - groups = {armor_torso=1, armor_heal=6, armor_use=400, - physics_speed=-0.04, physics_gravity=0.04}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) - --- Bronze Leggings - -- - -- @leggings 3d_armor:leggings_bronze - -- @img 3d_armor_inv_leggings_bronze.png - -- @grp armor_legs 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.03 - -- @grp physics_gravity 0.03 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:leggings_bronze", { - description = S("Bronze Leggings"), - inventory_image = "3d_armor_inv_leggings_bronze.png", - groups = {armor_legs=1, armor_heal=6, armor_use=400, - physics_speed=-0.03, physics_gravity=0.03}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) - --- Bronze Boots - -- - -- @boots 3d_armor:boots_bronze - -- @img 3d_armor_inv_boots_bronze.png - -- @grp armor_feet 1 - -- @grp armor_heal 6 - -- @grp armor_use 400 - -- @grp physics_speed -0.01 - -- @grp physics_gravity 0.01 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 1 - -- @damagegrp level 2 - armor:register_armor("3d_armor:boots_bronze", { - description = S("Bronze Boots"), - inventory_image = "3d_armor_inv_boots_bronze.png", - groups = {armor_feet=1, armor_heal=6, armor_use=400, - physics_speed=-0.01, physics_gravity=0.01}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, - }) -end - - ---- Diamond --- --- Requires setting `armor_material_diamond`. --- --- @section diamond - -if armor.materials.diamond then - --- Diamond Helmet - -- - -- @helmet 3d_armor:helmet_diamond - -- @img 3d_armor_inv_helmet_diamond.png - -- @grp armor_head 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_diamond", { - description = S("Diamond Helmet"), - inventory_image = "3d_armor_inv_helmet_diamond.png", - groups = {armor_head=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) - --- Diamond Chestplate - -- - -- @chestplate 3d_armor:chestplate_diamond - -- @img 3d_armor_inv_chestplate_diamond.png - -- @grp armor_torso 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_diamond", { - description = S("Diamond Chestplate"), - inventory_image = "3d_armor_inv_chestplate_diamond.png", - groups = {armor_torso=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) - --- Diamond Leggings - -- - -- @leggings 3d_armor:leggings_diamond - -- @img 3d_armor_inv_leggings_diamond.png - -- @grp armor_legs 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_diamond", { - description = S("Diamond Leggings"), - inventory_image = "3d_armor_inv_leggings_diamond.png", - groups = {armor_legs=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) - --- Diamond Boots - -- - -- @boots 3d_armor:boots_diamond - -- @img 3d_armor_inv_boots_diamond.png - -- @grp armor_feet 1 - -- @grp armor_heal 12 - -- @grp armor_use 200 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp choppy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_diamond", { - description = S("Diamond Boots"), - inventory_image = "3d_armor_inv_boots_diamond.png", - groups = {armor_feet=1, armor_heal=12, armor_use=200}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, - }) -end - - ---- Gold --- --- Requires `armor_material_gold`. --- --- @section gold - -if armor.materials.gold then - --- Gold Helmet - -- - -- @helmet 3d_armor:helmet_gold - -- @img 3d_armor_inv_helmet_gold.png - -- @grp armor_head 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.02 - -- @grp physics_gravity 0.02 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:helmet_gold", { - description = S("Gold Helmet"), - inventory_image = "3d_armor_inv_helmet_gold.png", - groups = {armor_head=1, armor_heal=6, armor_use=300, - physics_speed=-0.02, physics_gravity=0.02}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) - --- Gold Chestplate - -- - -- @chestplate 3d_armor:chestplate_gold - -- @img 3d_armor_inv_chestplate_gold.png - -- @grp armor_torso 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.05 - -- @grp physics_gravity 0.05 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:chestplate_gold", { - description = S("Gold Chestplate"), - inventory_image = "3d_armor_inv_chestplate_gold.png", - groups = {armor_torso=1, armor_heal=6, armor_use=300, - physics_speed=-0.05, physics_gravity=0.05}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) - --- Gold Leggings - -- - -- @leggings 3d_armor:leggings_gold - -- @img 3d_armor_inv_leggings_gold.png - -- @grp armor_legs 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.04 - -- @grp physics_gravity 0.04 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:leggings_gold", { - description = S("Gold Leggings"), - inventory_image = "3d_armor_inv_leggings_gold.png", - groups = {armor_legs=1, armor_heal=6, armor_use=300, - physics_speed=-0.04, physics_gravity=0.04}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) - --- Gold Boots - -- - -- @boots 3d_armor:boots_gold - -- @img 3d_armor_inv_boots_gold.png - -- @grp armor_feet 1 - -- @grp armor_heal 6 - -- @grp armor_use 300 - -- @grp physics_speed -0.02 - -- @grp physics_gravity 0.02 - -- @armorgrp fleshy 10 - -- @damagegrp cracky 1 - -- @damagegrp snappy 2 - -- @damagegrp choppy 2 - -- @damagegrp crumbly 3 - -- @damagegrp level 2 - armor:register_armor("3d_armor:boots_gold", { - description = S("Gold Boots"), - inventory_image = "3d_armor_inv_boots_gold.png", - groups = {armor_feet=1, armor_heal=6, armor_use=300, - physics_speed=-0.02, physics_gravity=0.02}, - armor_groups = {fleshy=10}, - damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, - }) -end - - ---- Mithril --- --- Requires `armor_material_mithril`. --- --- @section mithril - -if armor.materials.mithril then - --- Mithril Helmet - -- - -- @helmet 3d_armor:helmet_mithril - -- @img 3d_armor_inv_helmet_mithril.png - -- @grp armor_head 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_mithril", { - description = S("Mithril Helmet"), - inventory_image = "3d_armor_inv_helmet_mithril.png", - groups = {armor_head=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Mithril Chestplate - -- - -- @chestplate 3d_armor:chestplate_mithril - -- @img 3d_armor_inv_chestplate_mithril.png - -- @grp armor_torso 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_mithril", { - description = S("Mithril Chestplate"), - inventory_image = "3d_armor_inv_chestplate_mithril.png", - groups = {armor_torso=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Mithril Leggings - -- - -- @leggings 3d_armor:leggings_mithril - -- @img 3d_armor_inv_leggings_mithril.png - -- @grp armor_legs 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_mithril", { - description = S("Mithril Leggings"), - inventory_image = "3d_armor_inv_leggings_mithril.png", - groups = {armor_legs=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Mithril Boots - -- - -- @boots 3d_armor:boots_mithril - -- @img 3d_armor_inv_boots_mithril.png - -- @grp armor_feet 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_mithril", { - description = S("Mithril Boots"), - inventory_image = "3d_armor_inv_boots_mithril.png", - groups = {armor_feet=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) -end - - ---- Crystal --- --- Requires `armor_material_crystal`. --- --- @section crystal - -if armor.materials.crystal then - --- Crystal Helmet - -- - -- @helmet 3d_armor:helmet_crystal - -- @img 3d_armor_inv_helmet_crystal.png - -- @grp armor_head 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp armor_fire 1 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_crystal", { - description = S("Crystal Helmet"), - inventory_image = "3d_armor_inv_helmet_crystal.png", - groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Crystal Chestplate - -- - -- @chestplate 3d_armor:chestplate_crystal - -- @img 3d_armor_inv_chestplate_crystal.png - -- @grp armor_torso 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp armor_fire 1 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_crystal", { - description = S("Crystal Chestplate"), - inventory_image = "3d_armor_inv_chestplate_crystal.png", - groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Crystal Leggings - -- - -- @leggings 3d_armor:leggings_crystal - -- @img 3d_armor_inv_leggings_crystal.png - -- @grp armor_legs 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp armor_fire 1 - -- @armorgrp fleshy 20 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_crystal", { - description = S("Crystal Leggings"), - inventory_image = "3d_armor_inv_leggings_crystal.png", - groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=20}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) - --- Crystal Boots - -- - -- @boots 3d_armor:boots_crystal - -- @img 3d_armor_inv_boots_crystal.png - -- @grp armor_feet 1 - -- @grp armor_heal 12 - -- @grp armor_use 100 - -- @grp physics_speed 1 - -- @grp physics_jump 0.5 - -- @grp armor_fire 1 - -- @armorgrp fleshy 15 - -- @damagegrp cracky 2 - -- @damagegrp snappy 1 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_crystal", { - description = S("Crystal Boots"), - inventory_image = "3d_armor_inv_boots_crystal.png", - groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1, - physics_jump=0.5, armor_fire=1}, - armor_groups = {fleshy=15}, - damage_groups = {cracky=2, snappy=1, level=3}, - }) -end - - ---- Nether --- --- Requires `armor_material_nether`. --- --- @section nether - -if armor.materials.nether then - --- Nether Helmet - -- - -- @helmet 3d_armor:helmet_nether - -- @img 3d_armor_inv_helmet_nether.png - -- @grp armor_head 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 18 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:helmet_nether", { - description = S("Nether Helmet"), - inventory_image = "3d_armor_inv_helmet_nether.png", - groups = {armor_head=1, armor_heal=14, armor_use=100, armor_fire=1}, - armor_groups = {fleshy=18}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) - --- Nether Chestplate - -- - -- @chestplate 3d_armor:chestplate_nether - -- @img 3d_armor_inv_chestplate_nether.png - -- @grp armor_torso 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 25 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:chestplate_nether", { - description = S("Nether Chestplate"), - inventory_image = "3d_armor_inv_chestplate_nether.png", - groups = {armor_torso=1, armor_heal=14, armor_use=200, armor_fire=1}, - armor_groups = {fleshy=25}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) - --- Nether Leggings - -- - -- @leggings 3d_armor:leggings_nether - -- @img 3d_armor_inv_leggings_nether.png - -- @grp armor_legs 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 25 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:leggings_nether", { - description = S("Nether Leggings"), - inventory_image = "3d_armor_inv_leggings_nether.png", - groups = {armor_legs=1, armor_heal=14, armor_use=200, armor_fire=1}, - armor_groups = {fleshy=25}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) - --- Nether Boots - -- - -- @boots 3d_armor:boots_nether - -- @img 3d_armor_inv_boots_nether.png - -- @grp armor_feet 1 - -- @grp armor_heal 14 - -- @grp armor_use 200 - -- @grp armor_fire 1 - -- @armorgrp fleshy 18 - -- @damagegrp cracky 3 - -- @damagegrp snappy 2 - -- @damagegrp level 3 - armor:register_armor("3d_armor:boots_nether", { - description = S("Nether Boots"), - inventory_image = "3d_armor_inv_boots_nether.png", - groups = {armor_feet=1, armor_heal=14, armor_use=200, armor_fire=1}, - armor_groups = {fleshy=18}, - damage_groups = {cracky=3, snappy=2, level=3}, - }) -end - - ---- Crafting --- --- @section craft - ---- Craft recipes for helmets, chestplates, leggings, boots, & shields. --- --- @craft armor --- @usage --- Key: --- - m: material --- - wood: group:wood --- - cactus: default:cactus --- - steel: default:steel_ingot --- - bronze: default:bronze_ingot --- - diamond: default:diamond --- - gold: default:gold_ingot --- - mithril: moreores:mithril_ingot --- - crystal: ethereal:crystal_ingot --- - nether: nether:nether_ingot --- --- helmet: chestplate: leggings: --- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠--- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ --- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ --- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ --- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ --- --- boots: shield: --- ┌───┬───┬───┠┌───┬───┬───┠--- │ │ │ │ │ m │ m │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ --- │ m │ │ m │ │ m │ m │ m │ --- ├───┼───┼───┤ ├───┼───┼───┤ --- │ m │ │ m │ │ │ m │ │ --- └───┴───┴───┘ └───┴───┴───┘ - -for k, v in pairs(armor.materials) do - minetest.register_craft({ - output = "3d_armor:helmet_"..k, - recipe = { - {v, v, v}, - {v, "", v}, - {"", "", ""}, - }, - }) - minetest.register_craft({ - output = "3d_armor:chestplate_"..k, - recipe = { - {v, "", v}, - {v, v, v}, - {v, v, v}, - }, - }) - minetest.register_craft({ - output = "3d_armor:leggings_"..k, - recipe = { - {v, v, v}, - {v, "", v}, - {v, "", v}, - }, - }) - minetest.register_craft({ - output = "3d_armor:boots_"..k, - recipe = { - {v, "", v}, - {v, "", v}, - }, - }) -end diff --git a/mods/3d_armor/3d_armor/depends.txt b/mods/3d_armor/3d_armor/depends.txt deleted file mode 100644 index ef233db1..00000000 --- a/mods/3d_armor/3d_armor/depends.txt +++ /dev/null @@ -1,9 +0,0 @@ -default -player_monoids? -armor_monoid? -pova? -fire? -ethereal? -bakedclay? -moreores? -nether? diff --git a/mods/3d_armor/3d_armor/description.txt b/mods/3d_armor/3d_armor/description.txt deleted file mode 100644 index b0a9b0a5..00000000 --- a/mods/3d_armor/3d_armor/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds craftable armor that is visible to other players. diff --git a/mods/3d_armor/3d_armor/init.lua b/mods/3d_armor/3d_armor/init.lua index 7577269f..6718b971 100644 --- a/mods/3d_armor/3d_armor/init.lua +++ b/mods/3d_armor/3d_armor/init.lua @@ -2,7 +2,6 @@ local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) local worldpath = minetest.get_worldpath() local last_punch_time = {} -local pending_players = {} local timer = 0 dofile(modpath.."/api.lua") @@ -99,17 +98,7 @@ for _, mod in pairs(skin_mods) do armor.set_skin_mod(mod) end end -if not minetest.get_modpath("moreores") then - armor.materials.mithril = nil -end -if not minetest.get_modpath("ethereal") then - armor.materials.crystal = nil -end -if not minetest.get_modpath("nether") then - armor.materials.nether = nil -end -dofile(modpath.."/armor.lua") -- Armor Initialization @@ -191,11 +180,7 @@ local function validate_armor_inventory(player) end local function init_player_armor(initplayer) - local name = initplayer:get_player_name() - local pos = initplayer:get_pos() - if not name or not pos then - return false - end + local name = assert(initplayer:get_player_name()) local armor_inv = minetest.create_detached_inventory(name.."_armor", { on_put = function(inv, listname, index, stack, player) validate_armor_inventory(player) @@ -234,6 +219,11 @@ local function init_player_armor(initplayer) if player:get_player_name() ~= name then return 0 end + --cursed items cannot be unequiped by the player + local is_cursed = minetest.get_item_group(stack:get_name(), "cursed") ~= 0 + if not minetest.is_creative_enabled(player) and is_cursed then + return 0 + end return stack:get_count() end, allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) @@ -261,7 +251,6 @@ local function init_player_armor(initplayer) end end armor.def[name] = { - init_time = minetest.get_gametime(), level = 0, state = 0, count = 0, @@ -279,8 +268,8 @@ local function init_player_armor(initplayer) local skin = armor:get_player_skin(name) armor.textures[name] = { skin = skin, - armor = "3d_armor_trans.png", - wielditem = "3d_armor_trans.png", + armor = "blank.png", + wielditem = "blank.png", preview = armor.default_skin.."_preview.png", } local texture_path = minetest.get_modpath("player_textures") @@ -294,17 +283,16 @@ local function init_player_armor(initplayer) end end armor:set_player_armor(initplayer) - return true end -- Armor Player Model -default.player_register_model("3d_armor_character.b3d", { +player_api.register_model("3d_armor_character.b3d", { animation_speed = 30, textures = { armor.default_skin..".png", - "3d_armor_trans.png", - "3d_armor_trans.png", + "blank.png", + "blank.png", }, animations = { stand = {x=0, y=79}, @@ -313,6 +301,10 @@ default.player_register_model("3d_armor_character.b3d", { mine = {x=189, y=198}, walk_mine = {x=200, y=219}, sit = {x=81, y=160}, + -- compatibility w/ the emote mod + wave = {x = 192, y = 196, override_local = true}, + point = {x = 196, y = 196, override_local = true}, + freeze = {x = 205, y = 205, override_local = true}, }, }) @@ -330,16 +322,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) minetest.register_on_joinplayer(function(player) - default.player_set_model(player, "3d_armor_character.b3d") - local player_name = player:get_player_name() - - minetest.after(0, function() - -- TODO: Added in 7566ecc - What's the prupose? - local pplayer = minetest.get_player_by_name(player_name) - if pplayer and init_player_armor(pplayer) == false then - pending_players[pplayer] = 0 - end - end) + player_api.set_model(player, "3d_armor_character.b3d") + init_player_armor(player) end) minetest.register_on_leaveplayer(function(player) @@ -348,7 +332,6 @@ minetest.register_on_leaveplayer(function(player) armor.def[name] = nil armor.textures[name] = nil end - pending_players[player] = nil end) if armor.config.drop == true or armor.config.destroy == true then @@ -361,9 +344,12 @@ if armor.config.drop == true or armor.config.destroy == true then for i=1, armor_inv:get_size("armor") do local stack = armor_inv:get_stack("armor", i) if stack:get_count() > 0 then - table.insert(drop, stack) - armor:run_callbacks("on_unequip", player, i, stack) - armor_inv:set_stack("armor", i, nil) + --soulbound armors remain equipped after death + if minetest.get_item_group(stack:get_name(), "soulbound") == 0 then + table.insert(drop, stack) + armor:run_callbacks("on_unequip", player, i, stack) + armor_inv:set_stack("armor", i, nil) + end end end armor:save_armor_inventory(player) @@ -399,8 +385,8 @@ if armor.config.drop == true or armor.config.destroy == true then end) end end) -else -- reset un-dropped armor and it's effects minetest.register_on_respawnplayer(function(player) + -- reset un-dropped armor and it's effects armor:set_player_armor(player) end) end @@ -409,10 +395,14 @@ if armor.config.punch_damage == true then minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities) local name = player:get_player_name() - local hit_ip = hitter:is_player() - if name and hit_ip and minetest.is_protected(player:get_pos(), "") then - return - elseif name then + if hitter then + local hit_ip = hitter:is_player() + if name and hit_ip and minetest.is_protected(player:get_pos(), "") then + return + end + end + + if name then armor:punch(player, hitter, time_from_last_punch, tool_capabilities) last_punch_time[name] = minetest.get_gametime() end @@ -420,43 +410,53 @@ if armor.config.punch_damage == true then end minetest.register_on_player_hpchange(function(player, hp_change, reason) - if player and reason.type ~= "drown" and reason.hunger == nil - and hp_change < 0 then - local name = player:get_player_name() - if name then - local heal = armor.def[name].heal - if heal >= math.random(100) then - hp_change = 0 - end - -- check if armor damage was handled by fire or on_punchplayer - local time = last_punch_time[name] or 0 - if time == 0 or time + 1 < minetest.get_gametime() then - armor:punch(player) - end + if not minetest.is_player(player) then + return hp_change + end + + if reason.type == "drown" or reason.hunger or hp_change >= 0 then + return hp_change + end + + local name = player:get_player_name() + local properties = player:get_properties() + local hp = player:get_hp() + if hp + hp_change < properties.hp_max then + local heal = armor.def[name].heal + if heal >= math.random(100) then + hp_change = 0 + end + -- check if armor damage was handled by fire or on_punchplayer + local time = last_punch_time[name] or 0 + if time == 0 or time + 1 < minetest.get_gametime() then + armor:punch(player) end end + return hp_change end, true) minetest.register_globalstep(function(dtime) timer = timer + dtime + + if armor.config.feather_fall == true then + for _,player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if armor.def[name].feather > 0 then + local vel_y = player:get_velocity().y + if vel_y < -0.5 then + vel_y = -(vel_y * 0.05) + player:add_velocity({x = 0, y = vel_y, z = 0}) + end + end + end + end + if timer <= armor.config.init_delay then return end timer = 0 - for player, count in pairs(pending_players) do - local remove = init_player_armor(player) == true - pending_players[player] = count + 1 - if remove == false and count > armor.config.init_times then - minetest.log("warning", S("3d_armor: Failed to initialize player")) - remove = true - end - if remove == true then - pending_players[player] = nil - end - end - -- water breathing protection, added by TenPlus1 if armor.config.water_protect == true then for _,player in pairs(minetest.get_connected_players()) do @@ -469,22 +469,14 @@ minetest.register_globalstep(function(dtime) end end) --- Fire Protection, added by TenPlus1. if armor.config.fire_protect == true then - -- override any hot nodes that do not already deal damage - for _, row in pairs(armor.fire_nodes) do - if minetest.registered_nodes[row[1]] then - local damage = minetest.registered_nodes[row[1]].damage_per_second - if not damage or damage == 0 then - minetest.override_item(row[1], {damage_per_second = row[3]}) - end - end - end -else - print ("[3d_armor] Fire Nodes disabled") -end -if armor.config.fire_protect == true then + -- make torches hurt + minetest.override_item("default:torch", {damage_per_second = 1}) + minetest.override_item("default:torch_wall", {damage_per_second = 1}) + minetest.override_item("default:torch_ceiling", {damage_per_second = 1}) + + -- check player damage for any hot nodes we may be protected against minetest.register_on_player_hpchange(function(player, hp_change, reason) if reason.type == "node_damage" and reason.node then @@ -493,9 +485,7 @@ if armor.config.fire_protect == true then local name = player:get_player_name() for _,igniter in pairs(armor.fire_nodes) do if reason.node == igniter[1] then - if armor.def[name].fire < igniter[2] then - armor:punch(player, "fire") - else + if armor.def[name].fire >= igniter[2] then hp_change = 0 end end diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.de.tr b/mods/3d_armor/3d_armor/locale/3d_armor.de.tr index 82389192..f5190774 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.de.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.de.tr @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor : Abgetrennter Rüstungsbestand ist nicht gesetzt: @1 -3d_armor: Player name is nil @1=3d_armor : Spielername ist nicht gesetzt: @1 -3d_armor: Player reference is nil @1=3d_armor : Spielerreferenz ist nicht gesetzt: @1 - -### armor.lua ### - -Admin Boots=Adminstiefel -Admin Chestplate=Adminbrustplatte -Admin Helmet=Adminhelm -Admin Leggings=Adminhose -Bronze Boots=Bronzestiefel -Bronze Chestplate=Bronzebrustplatte -Bronze Helmet=Bronzehelm -Bronze Leggings=Bronzehose -Cactus Boots=Kaktusstiefel -Cactus Chestplate=Kaktusbrustplatte -Cactus Helmet=Kaktushelm -Cactus Leggings=Kaktushose -Crystal Boots=Kristallstiefel -Crystal Chestplate=Kristallbrustplatte -Crystal Helmet=Kristallhelm -Crystal Leggings=Kristallhose -Nether Boots=Netherstiefel -Nether Chestplate=Netherbrustplatte -Nether Helmet=Netherhelm -Nether Leggings=Netherhose -Diamond Boots=Diamantstiefel -Diamond Chestplate=Diamantbrustplatte -Diamond Helmet=Diamanthelm -Diamond Leggings=Diamanthose -Gold Boots=Goldstiefel -Gold Chestplate=Goldbrustplatte -Gold Helmet=Goldhelm -Gold Leggings=Goldhose -Mithril Boots=Mithrilstiefel -Mithril Chestplate=Mithrilbrustplatte -Mithril Helmet=Mithrilhelm -Mithril Leggings=Mithrilhose -Steel Boots=Stahlstiefel -Steel Chestplate=Stahlbrustplatte -Steel Helmet=Stahlhelm -Steel Leggings=Stahlhose -Wood Boots=Holzstiefel -Wood Chestplate=Holzbrustplatte -Wood Helmet=Holzhelm -Wood Leggings=Holzhose - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor : Initialisierung des Spielers fehlgeschlagen -Fire=Feuer -Heal=Heilen +Radiation=Strahlung Level=Stufe -Radiation=Strahlen -Your @1 got destroyed!=Deine @1 wurde zerstört! -Your @1 is almost broken!=Deine @1 ist fast kaputt! -[3d_armor] Fire Nodes disabled=[3d_armor] Feuer-Knoten deaktiviert +Heal=Heilung +Fire=Feuer +Your @1 is almost broken!=@1 ist fast kaputt! +Your @1 got destroyed!=@1 wurde zerstört! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr b/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr new file mode 100644 index 00000000..e3e1a2df --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Radiado +Level=Nivelo +Heal=BlokÅanco +Fire=Fajro +Your @1 is almost broken!=Via @1 estas preskaÅ­ rompita! +Your @1 got destroyed!=Via @1 detruiÄis! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.es.tr b/mods/3d_armor/3d_armor/locale/3d_armor.es.tr index 61ff5f98..cf79d05e 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.es.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.es.tr @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: La armadura desconectada es nula @1 -3d_armor: Player name is nil @1=3d_armor: El nombre del jugador es nulo @1 -3d_armor: Player reference is nil @1=3d_armor: La referencia del jugador es nula @1 - -### armor.lua ### - -Admin Boots=Botas de admin -Admin Chestplate=Peto de admin -Admin Helmet=Casco de admin -Admin Leggings=Grebas de admin -Bronze Boots=Botas de bronce -Bronze Chestplate=Peto de bronce -Bronze Helmet=Casco de bronce -Bronze Leggings=Grebas de bronce -Cactus Boots=Botas de cactus -Cactus Chestplate=Peto de cactus -Cactus Helmet=Casco de cactus -Cactus Leggings=Grebas de cactus -Crystal Boots=Botas de cristal -Crystal Chestplate=Peto de cristal -Crystal Helmet=Casco de cristal -Crystal Leggings=Grebas de cristal -Nether Boots=Botas de nether -Nether Chestplate=Peto de nether -Nether Helmet=Casco de nether -Nether Leggings=Grebas de nether -Diamond Boots=Botas de diamante -Diamond Chestplate=Peto de diamante -Diamond Helmet=Casco de diamante -Diamond Leggings=Grebas de diamante -Gold Boots=Botas de oro -Gold Chestplate=Peto de oro -Gold Helmet=Casco de oro -Gold Leggings=Grebas de oro -Mithril Boots=Botas de mitrilo -Mithril Chestplate=Peto de mitrilo -Mithril Helmet=Casco de mitrilo -Mithril Leggings=Grebas de mitrilo -Steel Boots=Botas de acero -Steel Chestplate=Peto de acero -Steel Helmet=Casco de acero -Steel Leggings=Grebas de acero -Wood Boots=Botas de madera -Wood Chestplate=Peto de madera -Wood Helmet=Casco de madera -Wood Leggings=Grebas de madera - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Fallo en la inicialización del jugador -Fire=Fuego -Heal=Salud -Level=Nivel Radiation=Radiación -Your @1 got destroyed!=¡Tu @1 fue destruído! +Level=Nivel +Heal=Salud +Fire=Fuego Your @1 is almost broken!=¡Tu @1 esta a punto de romperse! -[3d_armor] Fire Nodes disabled=[3d_armor] Nodos de fuego desabilitados +Your @1 got destroyed!=¡Tu @1 fue destruído! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr b/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr index 458fb153..5d2a4fa0 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor : Inventaire détaché pour l'armure non trouvé @1 -3d_armor: Player name is nil @1=3d_armor : Nom du joueur non trouvé @1 -3d_armor: Player reference is nil @1=3d_armor : Référence au joueur non trouvée @1 - -### armor.lua ### - -Admin Boots=Bottes d'admin -Admin Chestplate=Cuirasse d'admin -Admin Helmet=Casque d'admin -Admin Leggings=Jambières d'admin -Bronze Boots=Bottes en bronze -Bronze Chestplate=Cuirasse en bronze -Bronze Helmet=Casque en bronze -Bronze Leggings=Jambières en bronze -Cactus Boots=Bottes en cactus -Cactus Chestplate=Cuirasse en cactus -Cactus Helmet=Casque en cactus -Cactus Leggings=Jambières en cactus -Crystal Boots=Bottes en cristal -Crystal Chestplate=Cuirasse en cristal -Crystal Helmet=Casque en cristal -Crystal Leggings=Jambières en cristal -Nether Boots=Bottes en nether -Nether Chestplate=Cuirasse en nether -Nether Helmet=Casque en nether -Nether Leggings=Jambières en nether -Diamond Boots=Bottes en diamant -Diamond Chestplate=Cuirasse en diamant -Diamond Helmet=Casque en diamant -Diamond Leggings=Jambières en diamant -Gold Boots=Bottes en or -Gold Chestplate=Cuirasse en or -Gold Helmet=Casque en or -Gold Leggings=Jambières en or -Mithril Boots=Bottes en mithril -Mithril Chestplate=Cuirasse en mithril -Mithril Helmet=Casque en mithril -Mithril Leggings=Jambières en mithril -Steel Boots=Bottes en acier -Steel Chestplate=Cuirasse en acier -Steel Helmet=Casque en acier -Steel Leggings=Jambières en acier -Wood Boots=Bottes en bois -Wood Chestplate=Cuirasse en bois -Wood Helmet=Casque en bois -Wood Leggings=Jambières en bois - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor : Impossible d'initialiser le joueur -Fire=Fire -Heal=Soins -Level=Niveau Radiation=Radiation -Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! +Level=Niveau +Heal=Soins +Fire=Fire Your @1 is almost broken!=Une partie de votre armure est presque détruite : @1 ! -[3d_armor] Fire Nodes disabled=[3d_armor] NÅ“uds de type feu désactivés +Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.it.tr b/mods/3d_armor/3d_armor/locale/3d_armor.it.tr index fbbd45be..8d1184d9 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.it.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.it.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: L'inventario separato dell'armatura è nullo @1 -3d_armor: Player name is nil @1=3d_armor: Il nome dell'utente è nullo @1 -3d_armor: Player reference is nil @1=3d_armor: Il riferimento all'utente è nullo @1 - -### armor.lua ### - -Admin Boots=Stivali dell'amministratrice/tore -Admin Chestplate=Corazza dell'amministratrice/tore -Admin Helmet=Elmo dell'amministratrice/tore -Admin Leggings=Gambali dell'amministratrice/tore -Bronze Boots=Stivali di bronzo -Bronze Chestplate=Corazza di bronzo -Bronze Helmet=Elmo di bronzo -Bronze Leggings=Gambali di bronzo -Cactus Boots=Stivali di cactus -Cactus Chestplate=Corazza di cactus -Cactus Helmet=Elmo di cactus -Cactus Leggings=Gambali di cactus -Crystal Boots=Stivali di cristallo -Crystal Chestplate=Corazza di cristallo -Crystal Helmet=Elmo di cristallo -Crystal Leggings=Gambali di cristallo -Nether Boots=Stivali di nether -Nether Chestplate=Corazza di nether -Nether Helmet=Elmo di nether -Nether Leggings=Gambali di nether -Diamond Boots=Stivali di diamante -Diamond Chestplate=Corazza di diamante -Diamond Helmet=Elmo di diamante -Diamond Leggings=Gambali di diamante -Gold Boots=Stivali d'oro -Gold Chestplate=Corazza d'oro -Gold Helmet=Elmo d'oro -Gold Leggings=Gambali d'oro -Mithril Boots=Stivali di mithril -Mithril Chestplate=Corazza di mithril -Mithril Helmet=Elmo di mithril -Mithril Leggings=Gambali di mithril -Steel Boots=Stivali d'acciaio -Steel Chestplate=Corazza d'acciaio -Steel Helmet=Elmo d'acciaio -Steel Leggings=Gambali d'acciaio -Wood Boots=Stivali di legno -Wood Chestplate=Corazza di legno -Wood Helmet=Elmo di legno -Wood Leggings=Gambali di legno - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Inizializzazione dell'utente fallita -Fire=Fuoco -Heal=Guarigione -Level=Livello Radiation=Radiazione -Your @1 got destroyed!=@1 in frantumi! +Level=Livello +Heal=Guarigione +Fire=Fuoco Your @1 is almost broken!=@1 quasi in frantumi! -[3d_armor] Fire Nodes disabled=[3d_armor] Nodi fuoco disabilitati - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod caricata ma inutilizzata. -Back=Indietro -Armor=Armatura -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod caricata ma inutilizzata. -Armor stand top=Parte superiore del supporto per armatura -Armor stand=Supporto per armatura -Armor Stand=Supporto per armatura -Locked Armor stand=Supporto per armatura chiuso a chiave -Armor Stand (owned by @1)=Supporto per armatura (di proprietà di @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod caricata ma inutilizzata. -3d Armor=Armatura 3D -Armor not initialized!=Armatura non inizializzata! -Admin Shield=Scudo dell'amministratrice/tore -Wooden Shield=Scudo di legno -Enhanced Wood Shield=Scudo di legno migliorato -Cactus Shield=Scudo di cactus -Enhanced Cactus Shield=Scudo di cactus migliorato -Steel Shield=Scudo d'acciaio -Bronze Shield=Scudo di bronzo -Diamond Shield=Scudo di diamante -Gold Shield=Scudo d'oro -Mithril Shield=Scudo di mithril -Crystal Shield=Scudo di cristallo -Nether Shield=Scudo di nether +Your @1 got destroyed!=@1 in frantumi! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr b/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr index dab20123..8d55a24f 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Inventori perisai terpisah tiada nilai @1 -3d_armor: Player name is nil @1=3d_armor: Nama pemain tiada nilai @1 -3d_armor: Player reference is nil @1=3d_armor: Rujukan pemain tiada nilai @1 - -### armor.lua ### - -Admin Boots=But Pentadbir -Admin Chestplate=Perisai Dada Pentadbir -Admin Helmet=Helmet Pentadbir -Admin Leggings=Perisai Kaki Pentadbir -Bronze Boots=But Gangsa -Bronze Chestplate=Perisai Dada Gangsa -Bronze Helmet=Helmet Gangsa -Bronze Leggings=Perisai Kaki Gangsa -Cactus Boots=But Kaktus -Cactus Chestplate=Perisai Dada Kaktus -Cactus Helmet=Helmet Kaktus -Cactus Leggings=Perisai Kaki Kaktus -Crystal Boots=But Kristal -Crystal Chestplate=Perisai Dada Kristal -Crystal Helmet=Helmet Kristal -Crystal Leggings=Perisai Kaki Kristal -Nether Boots=But Nether -Nether Chestplate=Perisai Dada Nether -Nether Helmet=Helmet Nether -Nether Leggings=Perisai Kaki Nether -Diamond Boots=But Intan -Diamond Chestplate=Perisai Dada Intan -Diamond Helmet=Helmet Intan -Diamond Leggings=Perisai Kaki Intan -Gold Boots=But Emas -Gold Chestplate=Perisai Dada Emas -Gold Helmet=Helmet Emas -Gold Leggings=Perisai Kaki Emas -Mithril Boots=But Mithril -Mithril Chestplate=Perisai Dada Mithril -Mithril Helmet=Helmet Mithril -Mithril Leggings=Perisai Kaki Mithril -Steel Boots=But Keluli -Steel Chestplate=Perisai Dada Keluli -Steel Helmet=Helmet Keluli -Steel Leggings=Perisai Kaki Keluli -Wood Boots=But Kayu -Wood Chestplate=Perisai Dada Kayu -Wood Helmet=Helmet Kayu -Wood Leggings=Perisai Kaki Kayu - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Gagal mengasalkan pemain -Fire=Api -Heal=Pulih -Level=Tahap Radiation=Radiasi -Your @1 got destroyed!=@1 anda telah musnah! +Level=Tahap +Heal=Pulih +Fire=Api Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] Nod-nod Api dilumpuhkan - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mods dimuatkan tetapi tidak digunakan. -Back=Kembali -Armor=Perisai -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan. -Armor stand top=Bhg atas dirian perisai -Armor stand=Dirian perisai -Armor Stand=Dirian Perisai -Locked Armor stand=Dirian perisai Berkunci -Armor Stand (owned by @1)=Dirian Perisai (milik @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mods dimuatkan tetapi tidak digunakan. -3d Armor=Perisai 3d -Armor not initialized!=Perisai tidak diasalkan! -Admin Shield=Perisai Pegang Pentadbir -Wooden Shield=Perisai Pegang Kayu -Enhanced Wood Shield=Perisai Pegang Kayu Kukuh -Cactus Shield=Perisai Pegang Kaktus -Enhanced Cactus Shield=Perisai Pegang Kaktus Kukuh -Steel Shield=Perisai Pegang Keluli -Bronze Shield=Perisai Pegang Gangsa -Diamond Shield=Perisai Pegang Intan -Gold Shield=Perisai Pegang Emas -Mithril Shield=Perisai Pegang Mithril -Crystal Shield=Perisai Pegang Kristal -Nether Shield=Perisai Pegang Nether +Your @1 got destroyed!=@1 anda telah musnah! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr new file mode 100644 index 00000000..2e3815b2 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pl.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=Promieniowanie +Level=Poziom +Heal=Uzdrawianie +Fire=OgieÅ„ +Your @1 is almost broken!=Twój @1 jest prawie zepsuty! +Your @1 got destroyed!=Twój @1 zostaÅ‚ zniszczony! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr index e9e296ed..4ccba88e 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1 -3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1 -3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1 - -### armor.lua ### - -Admin Boots=Botas de Administrador -Admin Chestplate=Peitoral de Administrador -Admin Helmet=Capacete de Administrador -Admin Leggings=Calças de Administrador -Bronze Boots=Botas de Bronze -Bronze Chestplate=Peitoral de Bronze -Bronze Helmet=Capacete de Bronze -Bronze Leggings=Calças de Bronze -Cactus Boots=Botas de Madeira -Cactus Chestplate=Peitoral de Cacto -Cactus Helmet=Capacete de Cacto -Cactus Leggings=Calças de Cacto -Crystal Boots=Botas de Cristal -Crystal Chestplate=Peitoral de Cristal -Crystal Helmet=Capacete de Cristal -Crystal Leggings=Calças de Cristal -Nether Boots=Botas de Nether -Nether Chestplate=Peitoral de Nether -Nether Helmet=Capacete de Nether -Nether Leggings=Calças de Nether -Diamond Boots=Botas de Diamante -Diamond Chestplate=Peitoral de Diamante -Diamond Helmet=Capacete de Diamante -Diamond Leggings=Calças de Diamante -Gold Boots=Botas de Ouro -Gold Chestplate=Peitoral de Ouro -Gold Helmet=Capacete de Ouro -Gold Leggings=Calças de Ouro -Mithril Boots=Botas de Mithril -Mithril Chestplate=Peitoral de Mithril -Mithril Helmet=Capacete de Mithril -Mithril Leggings=Calças de Mithril -Steel Boots=Botas de Aço -Steel Chestplate=Peitoral de Aço -Steel Helmet=Capacete de Aço -Steel Leggings=Calças de Aço -Wood Boots=Botas de Madeira -Wood Chestplate=Peitoral de Madeira -Wood Helmet=Capacete de Madeira -Wood Leggings=Calças de Madeira - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador -Fire=Fogo -Heal=Saúde -Level=Nível Radiation=Radiação -Your @1 got destroyed!=@1 foi destruído(a)! +Level=Nível +Heal=Saúde +Fire=Fogo Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante. -Back=Voltar -Armor=Armadura -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante. -Armor stand top=Topo de estande de armadura -Armor stand=Estande de armadura -Armor Stand=Estande de Armadura -Locked Armor stand=Estande de Armadura Trancada -Armor Stand (owned by @1)=Estande de Armadura (pertente a @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante. -3d Armor=3d Armor -Armor not initialized!=Armadura não inicializada! -Admin Shield=Escudo de Administrador -Wooden Shield=Escudo de Madeira -Enhanced Wood Shield=Escudo de Madeira Melhorado -Cactus Shield=Escudo de Cacto -Enhanced Cactus Shield=Escudo de Cacto Melhorado -Steel Shield=Escudo de Aço -Bronze Shield=Escudo de Bronze -Diamond Shield=Escudo de Diamante -Gold Shield=Escudo de Ouro -Mithril Shield=Escudo de Mithril -Crystal Shield=Escudo de Cristal -Nether Shield=Escudo de Nether +Your @1 got destroyed!=@1 foi destruído(a)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr b/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr index e9e296ed..4ccba88e 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr @@ -1,90 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1 -3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1 -3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1 - -### armor.lua ### - -Admin Boots=Botas de Administrador -Admin Chestplate=Peitoral de Administrador -Admin Helmet=Capacete de Administrador -Admin Leggings=Calças de Administrador -Bronze Boots=Botas de Bronze -Bronze Chestplate=Peitoral de Bronze -Bronze Helmet=Capacete de Bronze -Bronze Leggings=Calças de Bronze -Cactus Boots=Botas de Madeira -Cactus Chestplate=Peitoral de Cacto -Cactus Helmet=Capacete de Cacto -Cactus Leggings=Calças de Cacto -Crystal Boots=Botas de Cristal -Crystal Chestplate=Peitoral de Cristal -Crystal Helmet=Capacete de Cristal -Crystal Leggings=Calças de Cristal -Nether Boots=Botas de Nether -Nether Chestplate=Peitoral de Nether -Nether Helmet=Capacete de Nether -Nether Leggings=Calças de Nether -Diamond Boots=Botas de Diamante -Diamond Chestplate=Peitoral de Diamante -Diamond Helmet=Capacete de Diamante -Diamond Leggings=Calças de Diamante -Gold Boots=Botas de Ouro -Gold Chestplate=Peitoral de Ouro -Gold Helmet=Capacete de Ouro -Gold Leggings=Calças de Ouro -Mithril Boots=Botas de Mithril -Mithril Chestplate=Peitoral de Mithril -Mithril Helmet=Capacete de Mithril -Mithril Leggings=Calças de Mithril -Steel Boots=Botas de Aço -Steel Chestplate=Peitoral de Aço -Steel Helmet=Capacete de Aço -Steel Leggings=Calças de Aço -Wood Boots=Botas de Madeira -Wood Chestplate=Peitoral de Madeira -Wood Helmet=Capacete de Madeira -Wood Leggings=Calças de Madeira - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador -Fire=Fogo -Heal=Saúde -Level=Nível Radiation=Radiação -Your @1 got destroyed!=@1 foi destruído(a)! +Level=Nível +Heal=Saúde +Fire=Fogo Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante. -Back=Voltar -Armor=Armadura -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante. -Armor stand top=Topo de estande de armadura -Armor stand=Estande de armadura -Armor Stand=Estande de Armadura -Locked Armor stand=Estande de Armadura Trancada -Armor Stand (owned by @1)=Estande de Armadura (pertente a @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante. -3d Armor=3d Armor -Armor not initialized!=Armadura não inicializada! -Admin Shield=Escudo de Administrador -Wooden Shield=Escudo de Madeira -Enhanced Wood Shield=Escudo de Madeira Melhorado -Cactus Shield=Escudo de Cacto -Enhanced Cactus Shield=Escudo de Cacto Melhorado -Steel Shield=Escudo de Aço -Bronze Shield=Escudo de Bronze -Diamond Shield=Escudo de Diamante -Gold Shield=Escudo de Ouro -Mithril Shield=Escudo de Mithril -Crystal Shield=Escudo de Cristal -Nether Shield=Escudo de Nether +Your @1 got destroyed!=@1 foi destruído(a)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr b/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr index b817c79e..afbc441a 100644 --- a/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr +++ b/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr @@ -1,85 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1=3d_armor: Отдельный инвентарь брони ÑвлÑетÑÑ nil @1 -3d_armor: Player name is nil @1=3d_armor: Ð˜Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° ÑвлÑетÑÑ nil @1 -3d_armor: Player reference is nil @1=3d_armor: СÑылка игрока ÑвлÑетÑÑ nil @1 - -### armor.lua ### - -Admin Boots=ботинки админа -Admin Chestplate=бронежилет админа -Admin Helmet=шлем админа -Admin Leggings=гамаши админа -Bronze Boots=бронзовые ботинки -Bronze Chestplate=бронзовый бронежилет -Bronze Helmet=бронзовый шлем -Bronze Leggings=бронзовые гамаши -Cactus Boots=кактуÑовые ботинки -Cactus Chestplate=кактуÑовый бронежилет -Cactus Helmet=кактуÑовый шлем -Cactus Leggings=кактуÑовые гамаши -Crystal Boots=криÑталловые ботинки -Crystal Chestplate=криÑталловый бронежилет -Crystal Helmet=криÑталловый шлем -Crystal Leggings=криÑталловые гамаши -Diamond Boots=алмазные ботинки -Diamond Chestplate=алмазный бронежилет -Diamond Helmet=алмазный шлем -Diamond Leggings=алмазные гамаши -Gold Boots=золотые ботинки -Gold Chestplate=золотой бронежилет -Gold Helmet=золотой шлем -Gold Leggings=золотые гамаши -Mithril Boots=мифриловые ботинки -Mithril Chestplate=мифриловый бронежилет -Mithril Helmet=мифриловый шлем -Mithril Leggings=мифриловые гамаши -Steel Boots=Ñтальные ботинки -Steel Chestplate=Ñтальной бронежилет -Steel Helmet=Ñтальной шлем -Steel Leggings=Ñтальные гамаши -Wood Boots=деревÑнные ботинки -Wood Chestplate=деревÑнный бронежилет -Wood Helmet=деревÑнный шлем -Wood Leggings=деревÑнные гамаши - -### init.lua ### - -3d_armor: Failed to initialize player=3d_armor: не Ñмог подготовить игрока -Fire=огонь -Heal=иÑцеление -Level=уровень Radiation=излучение -Your @1 got destroyed!=твой(и) @1 был(и) разрушен(Ñ‹)! +Level=уровень +Heal=иÑцеление +Fire=огонь Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled=[3d_armor] блоки Ð¾Ð³Ð½Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹ - - -##### not used anymore ##### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip: мод загружен но не иÑпользуетÑÑ. -Back=назад -Armor=бронь -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: мод загружен но не иÑпользуетÑÑ. -Armor stand top=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ (верх) -Armor stand=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ -Armor Stand=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ -Locked Armor stand=Ð·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð°Ñ Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ -Armor Stand (owned by @1)=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ (принадлежит @1) -3d_armor_ui: Mod loaded but unused.=3d_armor_ui: мод загружен но не иÑпользуетÑÑ. -3d Armor=3D бронь -Armor not initialized!=бронь не подготовлена! -Admin Shield=щит админа -Wooden Shield=деревÑнный щит -Enhanced Wood Shield=улучшенный деревÑнный щит -Cactus Shield=кактуÑный щит -Enhanced Cactus Shield=улучшенный кактуÑный щит -Steel Shield=Ñтальной щит -Bronze Shield=бронзовый щит -Diamond Shield=алмазный щит -Gold Shield=золотой щит -Mithril Shield=мифриловый щит -Crystal Shield=криÑталловый щит +Your @1 got destroyed!=твой(и) @1 был(и) разрушен(Ñ‹)! diff --git a/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr b/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr new file mode 100644 index 00000000..08b7ee1e --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/3d_armor.sv.tr @@ -0,0 +1,7 @@ +# textdomain: 3d_armor +Radiation=StrÃ¥lning +Level=NivÃ¥ +Heal=Läkning +Fire=Eld +Your @1 is almost broken!=Din @1 är nästan förstörd! +Your @1 got destroyed!=Din @1 blev förstörd! diff --git a/mods/3d_armor/3d_armor/locale/template.txt b/mods/3d_armor/3d_armor/locale/template.txt index 0898a63d..5e4e65c1 100644 --- a/mods/3d_armor/3d_armor/locale/template.txt +++ b/mods/3d_armor/3d_armor/locale/template.txt @@ -1,62 +1,7 @@ # textdomain: 3d_armor - - -### api.lua ### - -3d_armor: Detached armor inventory is nil @1= -3d_armor: Player name is nil @1= -3d_armor: Player reference is nil @1= - -### armor.lua ### - -Admin Boots= -Admin Chestplate= -Admin Helmet= -Admin Leggings= -Bronze Boots= -Bronze Chestplate= -Bronze Helmet= -Bronze Leggings= -Cactus Boots= -Cactus Chestplate= -Cactus Helmet= -Cactus Leggings= -Crystal Boots= -Crystal Chestplate= -Crystal Helmet= -Crystal Leggings= -Nether Boots= -Nether Chestplate= -Nether Helmet= -Nether Leggings= -Diamond Boots= -Diamond Chestplate= -Diamond Helmet= -Diamond Leggings= -Gold Boots= -Gold Chestplate= -Gold Helmet= -Gold Leggings= -Mithril Boots= -Mithril Chestplate= -Mithril Helmet= -Mithril Leggings= -Steel Boots= -Steel Chestplate= -Steel Helmet= -Steel Leggings= -Wood Boots= -Wood Chestplate= -Wood Helmet= -Wood Leggings= - -### init.lua ### - -3d_armor: Failed to initialize player= -Fire= -Heal= -Level= Radiation= -Your @1 got destroyed!= +Level= +Heal= +Fire= Your @1 is almost broken!= -[3d_armor] Fire Nodes disabled= +Your @1 got destroyed!= diff --git a/mods/3d_armor/3d_armor/mod.conf b/mods/3d_armor/3d_armor/mod.conf index 9d2cc681..167c2a18 100644 --- a/mods/3d_armor/3d_armor/mod.conf +++ b/mods/3d_armor/3d_armor/mod.conf @@ -1,4 +1,5 @@ name = 3d_armor -depends = default -optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores, nether +depends = default, player_api +optional_depends = player_monoids, armor_monoid, pova, moreores description = Adds craftable armor that is visible to other players. +min_minetest_version = 5.0 diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_trans.png b/mods/3d_armor/3d_armor/textures/3d_armor_trans.png deleted file mode 100644 index 4a31242b54fceda3cea196c6083d758a5a8b9c74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8W<`RdP`(kYX@0Ff`XSG|)9P4l%T_GBLL@HrF;Vv@$T*WTH3$MMG|WN@iLm WZViVsXX*eoFnGH9xvX - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/3d_armor_ip/depends.txt b/mods/3d_armor/3d_armor_ip/depends.txt deleted file mode 100644 index e96293b9..00000000 --- a/mods/3d_armor/3d_armor_ip/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -3d_armor -inventory_plus? diff --git a/mods/3d_armor/3d_armor_ip/description.txt b/mods/3d_armor/3d_armor_ip/description.txt deleted file mode 100644 index 58b700eb..00000000 --- a/mods/3d_armor/3d_armor_ip/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds 3d_armor page to the inventory plus. diff --git a/mods/3d_armor/3d_armor_ip/init.lua b/mods/3d_armor/3d_armor_ip/init.lua index f0612004..d01365d2 100644 --- a/mods/3d_armor/3d_armor_ip/init.lua +++ b/mods/3d_armor/3d_armor_ip/init.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape if not minetest.global_exists("inventory_plus") then - minetest.log("warning", S("3d_armor_ip: Mod loaded but unused.")) + minetest.log("warning", "3d_armor_ip: Mod loaded but unused.") return end diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr new file mode 100644 index 00000000..f15fd317 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.de.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Zurück +Armor=Rüstung diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr new file mode 100644 index 00000000..f84e706c --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.eo.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Dorso +Armor=Armaĵo diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr index 5f540b12..8a6595f6 100644 --- a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.fr.tr @@ -1,8 +1,3 @@ # textdomain: 3d_armor_ip - - -### init.lua ### - -3d_armor_ip: Mod loaded but unused.=3d_armor_ip : Mod chargé mais inutilisé. -Armor=Armure Back=Retour +Armor=Armure diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr new file mode 100644 index 00000000..4a8f8203 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Voltar +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr new file mode 100644 index 00000000..e2d778bc --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/locale/3d_armor_ip.sv.tr @@ -0,0 +1,3 @@ +# textdomain: 3d_armor_ip +Back=Tillbaka +Armor=Rustning diff --git a/mods/3d_armor/3d_armor_ip/locale/template.txt b/mods/3d_armor/3d_armor_ip/locale/template.txt index 133bce8d..c21c6aaa 100644 --- a/mods/3d_armor/3d_armor_ip/locale/template.txt +++ b/mods/3d_armor/3d_armor_ip/locale/template.txt @@ -1,8 +1,3 @@ # textdomain: 3d_armor_ip - - -### init.lua ### - -3d_armor_ip: Mod loaded but unused.= -Armor= Back= +Armor= diff --git a/mods/3d_armor/3d_armor_sfinv/LICENSE.txt b/mods/3d_armor/3d_armor_sfinv/LICENSE.txt deleted file mode 100644 index 2b2a9f64..00000000 --- a/mods/3d_armor/3d_armor_sfinv/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -[mod] 3d Armor sfinv integration [3d_armor_sfinv] -================================================= - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/3d_armor_sfinv/depends.txt b/mods/3d_armor/3d_armor_sfinv/depends.txt deleted file mode 100644 index c7beedae..00000000 --- a/mods/3d_armor/3d_armor_sfinv/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -3d_armor -sfinv? diff --git a/mods/3d_armor/3d_armor_sfinv/description.txt b/mods/3d_armor/3d_armor_sfinv/description.txt deleted file mode 100644 index 15f4e963..00000000 --- a/mods/3d_armor/3d_armor_sfinv/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds 3d_armor page to the sfinv inventory. diff --git a/mods/3d_armor/3d_armor_sfinv/init.lua b/mods/3d_armor/3d_armor_sfinv/init.lua index 830ebbcb..f99c2440 100644 --- a/mods/3d_armor/3d_armor_sfinv/init.lua +++ b/mods/3d_armor/3d_armor_sfinv/init.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) if not minetest.global_exists("sfinv") then - minetest.log("warning", S("3d_armor_sfinv: Mod loaded but unused.")) + minetest.log("warning", "3d_armor_sfinv: Mod loaded but unused.") return end diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr new file mode 100644 index 00000000..b597332b --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.de.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Rüstung diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr new file mode 100644 index 00000000..7cc47ce8 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armaĵoj diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr index ee72e52b..dd0a0026 100644 --- a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr @@ -1,7 +1,2 @@ # textdomain: 3d_armor_sfinv - - -### init.lua ### - -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv : Mod cargado pero no activado. Armor=Armadura diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr index f25bd115..bdaf2a0a 100644 --- a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr @@ -1,7 +1,2 @@ # textdomain: 3d_armor_sfinv - - -### init.lua ### - -3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv : Mod chargé mais inutilisé. Armor=Armure diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr new file mode 100644 index 00000000..dd0a0026 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Armadura diff --git a/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr new file mode 100644 index 00000000..14972b78 --- /dev/null +++ b/mods/3d_armor/3d_armor_sfinv/locale/3d_armor_sfinv.sv.tr @@ -0,0 +1,2 @@ +# textdomain: 3d_armor_sfinv +Armor=Rustning diff --git a/mods/3d_armor/3d_armor_sfinv/locale/template.txt b/mods/3d_armor/3d_armor_sfinv/locale/template.txt index a3f01b5c..954dcf32 100644 --- a/mods/3d_armor/3d_armor_sfinv/locale/template.txt +++ b/mods/3d_armor/3d_armor_sfinv/locale/template.txt @@ -1,7 +1,2 @@ # textdomain: 3d_armor_sfinv - - -### init.lua ### - -3d_armor_sfinv: Mod loaded but unused.= Armor= diff --git a/mods/3d_armor/3d_armor_stand/LICENSE.txt b/mods/3d_armor/3d_armor_stand/LICENSE.txt deleted file mode 100644 index e3cb55d6..00000000 --- a/mods/3d_armor/3d_armor_stand/LICENSE.txt +++ /dev/null @@ -1,43 +0,0 @@ -[mod] 3d Armor Stand [3d_armor_stand] -===================================== - -License Source Code -------------------- - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Lecense Models --------------- - -Copyright (C) 2016-2019 Stuart Jones - CC BY-SA 3.0 - -UV model mapping by tobyplowy(aka toby109tt) - -License Textures ----------------- - -3d_armor_stand.png -3d_armor_stand_locked.png - -Copyright (C) 2017-2019 tobyplowy - CC BY-SA 3.0 - -3d_armor_stand_feet.png -3d_armor_stand_head.png -3d_armor_stand_legs.png -3d_armor_stand_torso.png - -Copyright (C) 2016-2019 Stuart Jones - CC BY-SA 3.0 diff --git a/mods/3d_armor/3d_armor_stand/depends.txt b/mods/3d_armor/3d_armor_stand/depends.txt deleted file mode 100644 index fdbb2900..00000000 --- a/mods/3d_armor/3d_armor_stand/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -3d_armor - diff --git a/mods/3d_armor/3d_armor_stand/init.lua b/mods/3d_armor/3d_armor_stand/init.lua index 612345b5..83c29d03 100644 --- a/mods/3d_armor/3d_armor_stand/init.lua +++ b/mods/3d_armor/3d_armor_stand/init.lua @@ -62,7 +62,7 @@ local function update_entity(pos) object = minetest.add_entity(pos, "3d_armor_stand:armor_entity") end if object then - local texture = "3d_armor_trans.png" + local texture = "blank.png" local textures = {} local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -134,7 +134,7 @@ local function remove_hidden_node(pos) end minetest.register_node("3d_armor_stand:top", { - description = S("Armor stand top"), + description = S("Armor Stand Top"), paramtype = "light", drawtype = "plantlike", sunlight_propagates = true, @@ -144,12 +144,13 @@ minetest.register_node("3d_armor_stand:top", { buildable_to = false, drop = "", groups = {not_in_creative_inventory = 1}, + is_ground_content = false, on_blast = function() end, - tiles = {"3d_armor_trans.png"}, + tiles = {"blank.png"}, }) minetest.register_node("3d_armor_stand:armor_stand", { - description = S("Armor stand"), + description = S("Armor Stand"), drawtype = "mesh", mesh = "3d_armor_stand.obj", tiles = {"3d_armor_stand.png"}, @@ -165,6 +166,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { }, }, groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -218,7 +220,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { }) minetest.register_node("3d_armor_stand:locked_armor_stand", { - description = S("Locked Armor stand"), + description = S("Locked Armor Stand"), drawtype = "mesh", mesh = "3d_armor_stand.obj", tiles = {"3d_armor_stand_locked.png"}, @@ -234,6 +236,7 @@ minetest.register_node("3d_armor_stand:locked_armor_stand", { }, }, groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -299,27 +302,107 @@ minetest.register_node("3d_armor_stand:locked_armor_stand", { end, }) +minetest.register_node("3d_armor_stand:shared_armor_stand", { + description = S("Shared Armor Stand"), + drawtype = "mesh", + mesh = "3d_armor_stand.obj", + tiles = {"3d_armor_stand_shared.png"}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, + groups = {choppy=2, oddly_breakable_by_hand=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", armor_stand_formspec) + meta:set_string("infotext", S("Shared Armor Stand")) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + inv:set_size("armor_"..element, 1) + end + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + if not inv:is_empty("armor_"..element) then + return false + end + end + return true + end, + after_place_node = function(pos, placer) + minetest.add_entity(pos, "3d_armor_stand:armor_entity") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Shared Armor Stand")) + add_hidden_node(pos, placer) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups[listname] then + return 1 + end + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos) + return 0 + end, + on_metadata_inventory_put = function(pos) + update_entity(pos) + end, + on_metadata_inventory_take = function(pos) + update_entity(pos) + end, + after_destruct = function(pos) + update_entity(pos) + remove_hidden_node(pos) + end, + on_blast = function(pos) + -- Not affected by TNT + end, +}) + minetest.register_entity("3d_armor_stand:armor_entity", { - physical = true, - visual = "mesh", - mesh = "3d_armor_entity.obj", - visual_size = {x=1, y=1}, - collisionbox = {0,0,0,0,0,0}, - textures = {"3d_armor_trans.png"}, - pos = nil, - timer = 0, + initial_properties = { + physical = true, + visual = "mesh", + mesh = "3d_armor_entity.obj", + visual_size = {x=1, y=1}, + collisionbox = {0,0,0,0,0,0}, + textures = {"blank.png"}, + }, + _pos = nil, on_activate = function(self) local pos = self.object:get_pos() if pos then - self.pos = vector.round(pos) + self._pos = vector.round(pos) update_entity(pos) end end, on_blast = function(self, damage) local drops = {} - local node = minetest.get_node(self.pos) + local node = minetest.get_node(self._pos) if node.name == "3d_armor_stand:armor_stand" then - drop_armor(self.pos) + drop_armor(self._pos) self.object:remove() end return false, false, drops @@ -327,7 +410,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", { }) minetest.register_abm({ - nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:armor_stand"}, + nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:shared_armor_stand", "3d_armor_stand:armor_stand"}, interval = 15, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) @@ -353,3 +436,10 @@ minetest.register_craft({ {"3d_armor_stand:armor_stand", "default:steel_ingot"}, } }) + +minetest.register_craft({ + output = "3d_armor_stand:shared_armor_stand", + recipe = { + {"3d_armor_stand:armor_stand", "default:copper_ingot"}, + } +}) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr new file mode 100644 index 00000000..ece548a6 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.de.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Rüstungsständeroberseite +Armor Stand=Rüstungsständer +Locked Armor Stand=Abgeschlossener Rüstungsständer +Armor Stand (owned by @1)=Rüstungsständer (Eigentum von @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr new file mode 100644 index 00000000..47a17aba --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.eo.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Armaĵtenila Supro +Armor Stand=Armaĵtenilo +Locked Armor Stand=Åœlosita Armaĵtenilo +Armor Stand (owned by @1)=Åœlosita Armaĵtenilo (posedata de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr new file mode 100644 index 00000000..32b87078 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.es.tr @@ -0,0 +1,6 @@ +# textdomain: 3d_armor_stand +Armor Stand Top= +Armor Stand=Soporte de armadura +Locked Armor Stand=Soporte de armadura privado +Shared Armor Stand=Soporte de armadura compartido +Armor Stand (owned by @1)=Soporte de armadura (de @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr index 7d4cd381..f92d3778 100644 --- a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.fr.tr @@ -1,10 +1,5 @@ # textdomain: 3d_armor_stand - - -### init.lua ### - +Armor Stand Top=Haut de support d'armure Armor Stand=Support d'armure +Locked Armor Stand=Support d'armure verrouillé Armor Stand (owned by @1)=Support d'armure (propriété de @1) -Armor stand=Support d'armure -Armor stand top=Haut de support d'armure -Locked Armor stand=Support d'armure verrouillé diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr new file mode 100644 index 00000000..0a8fb297 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Topo do suporte de armadura +Armor Stand=Suporte de Armadura +Locked Armor Stand=Suporte de armadura trancado +Armor Stand (owned by @1)=Suporte de Armadura (dono: @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr new file mode 100755 index 00000000..5987eed7 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.ru.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=верх Ñтойки Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ +Armor Stand=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ +Locked Armor Stand=Ñтойка Ð´Ð»Ñ Ð±Ñ€Ð¾Ð½Ð¸ Ñ Ð·Ð°Ð¼ÐºÐ¾Ð¼ +Armor Stand (owned by @1)=Ñтойка Ð´Ð»Ñ Ð±Ð¾Ð½Ð¸ (владелец @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr new file mode 100644 index 00000000..5800a313 --- /dev/null +++ b/mods/3d_armor/3d_armor_stand/locale/3d_armor_stand.sv.tr @@ -0,0 +1,5 @@ +# textdomain: 3d_armor_stand +Armor Stand Top=Rustningställstopp +Armor Stand=Rustningställ +Locked Armor Stand=LÃ¥st rustningställ +Armor Stand (owned by @1)=Rustningställ (ägd av @1) diff --git a/mods/3d_armor/3d_armor_stand/locale/template.txt b/mods/3d_armor/3d_armor_stand/locale/template.txt index 25befcb7..f9fcb5da 100644 --- a/mods/3d_armor/3d_armor_stand/locale/template.txt +++ b/mods/3d_armor/3d_armor_stand/locale/template.txt @@ -1,10 +1,6 @@ # textdomain: 3d_armor_stand - - -### init.lua ### - +Armor Stand Top= Armor Stand= +Locked Armor Stand= +Shared Armor Stand= Armor Stand (owned by @1)= -Armor stand= -Armor stand top= -Locked Armor stand= diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_shared.png new file mode 100644 index 0000000000000000000000000000000000000000..e54b599d3c3c3929765203d361793902716ba86c GIT binary patch literal 1011 zcmV5+mJcnyNiEBNRlarN|m6w;7nVFfLc}1R{o}qq7qN1Xvfl8;R zr>v~3udlDLv9P$fxVyZ%zP`S|!N9`8!od9T$H>UZ$jZvf%goEn%FfKq&Cbio z&(F@!&(F}%(9qJ&(b3V;($mw_)Yj6`*4EYNmPP59N$HwQ>6}mLoKWhWQtF;l>Yh~U zpH=FhSL&cx>Y-TcqFU>vU+k%9?XGa{v3BmWdGNf5@Vtrfy^8U^jq$&Z@xYJqz>x95 zk@CWm^1_tz!^va_2%cK0=>nZ>M00DGTPE!Ct=GbNc z00OH?L_t(o!|jz>Q`;~Ug<~PBKoT597!u1HP`OfY(gI!0*3v+lrs?wk|4gsk=*2IN z?5ECfXDs_<#$UADbKL1vYPh%8-SY?C!G5=Q(DVJO?$i~_C+a*`aeN}B%p|MoTEPB9 zP4ZlcIL(w&a!}Q^0AJ-VbER^bWwBCmx2o%BkgJK(C56bMkX3apU^r19i{ke7_TqYW zHy#Z@N2f4*DaDxpT?^znH$7!N^bQi&+xp-4g3cOp#rEIW|M$D^ZBziO zs3icqtzM_t!5Aab2H<%u0hE#!0MBg+c;TUbD*&NrhwdWW;vAN9gwW#AanN#g^#-0V zFW~v@`|SY>O6m7sFf7+smvDRc35Kf=+rIv7{sfIMU%{|iu9wRdA^7JS)Sn+)0j5y> z9d|kQl# z?>%$3|1NxmKzMj?%-uFrDP626eR_lk@5=(y_1dl%u=Xv+`qCrOmwmKv{*yF~R>x`a zl{Cj^j??}SHw|PO${Ju=*tE1Yz?jIGs?iLzjg76FY+@NCCRpqNn - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/3d_armor_ui/description.txt b/mods/3d_armor/3d_armor_ui/description.txt deleted file mode 100644 index e6bf11c8..00000000 --- a/mods/3d_armor/3d_armor_ui/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds 3d_armor page to the unified inventory. diff --git a/mods/3d_armor/3d_armor_ui/init.lua b/mods/3d_armor/3d_armor_ui/init.lua index 28193e73..6afd13fc 100644 --- a/mods/3d_armor/3d_armor_ui/init.lua +++ b/mods/3d_armor/3d_armor_ui/init.lua @@ -23,7 +23,7 @@ end) unified_inventory.register_button("armor", { type = "image", image = "inventory_plus_armor.png", - tooltip = S("3d Armor") + tooltip = S("3D Armor") }) unified_inventory.register_page("armor", { @@ -33,9 +33,6 @@ unified_inventory.register_page("armor", { local gridy = 0.6 local name = player:get_player_name() - if armor.def[name].init_time == 0 then - return {formspec="label[0,0;"..F(S("Armor not initialized!")).."]"} - end local formspec = perplayer_formspec.standard_inv_bg.. perplayer_formspec.standard_inv.. ui.make_inv_img_grid(gridx, gridy, 2, 3).. diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr new file mode 100644 index 00000000..84e850c1 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.de.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D-Rüstung +Armor not initialized!=Rüstung ist nicht initialisiert! +Armor=Rüstung +Level=Stufe +Heal=Heilung +Fire=Feuer +Radiation=Strahlung diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr new file mode 100644 index 00000000..7c31cbd1 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.eo.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D Armaĵoj +Armor not initialized!=Armaĵoj ne pretigitaj! +Armor=Armaĵo +Level=Nivelo +Heal=Sanigi +Fire=Fajro +Radiation=Radiado diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr index 38e0f05a..358814cb 100644 --- a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.fr.tr @@ -1,12 +1,8 @@ # textdomain: 3d_armor_ui - - -### init.lua ### - -3d Armor=Armure 3d -Armor=Armure +3D Armor=Armure 3D Armor not initialized!=Armure non initialisée ! -Fire=Feu -Heal=Soins +Armor=Armure Level=Niveau +Heal=Soins +Fire=Feu Radiation=Radiation diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr new file mode 100644 index 00000000..761c6ec7 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor=3D Armor +Armor not initialized!=Armadura não inicializada! +Armor=Armadura +Level=Nível +Heal=Vida +Fire=Fogo +Radiation=Radiação diff --git a/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr new file mode 100644 index 00000000..711bf9c3 --- /dev/null +++ b/mods/3d_armor/3d_armor_ui/locale/3d_armor_ui.sv.tr @@ -0,0 +1,8 @@ +# textdomain: 3d_armor_ui +3D Armor= +Armor not initialized!=Rustning har inte initialiserats +Armor=Rustning +Level=NivÃ¥ +Heal=Läkning +Fire=Eld +Radiation=StrÃ¥lning diff --git a/mods/3d_armor/3d_armor_ui/locale/template.txt b/mods/3d_armor/3d_armor_ui/locale/template.txt index 0f7a8cb5..4982060c 100644 --- a/mods/3d_armor/3d_armor_ui/locale/template.txt +++ b/mods/3d_armor/3d_armor_ui/locale/template.txt @@ -1,12 +1,8 @@ # textdomain: 3d_armor_ui - - -### init.lua ### - -3d Armor= -Armor= +3D Armor= Armor not initialized!= -Fire= -Heal= +Armor= Level= +Heal= +Fire= Radiation= diff --git a/mods/3d_armor/LICENSE.md b/mods/3d_armor/LICENSE.md index f7793ffa..4e638395 100644 --- a/mods/3d_armor/LICENSE.md +++ b/mods/3d_armor/LICENSE.md @@ -1,9 +1,9 @@ 3D Armor - Visible Player Armor =============================== -License Source Code: Copyright (C) 2013-2018 Stuart Jones - LGPL v2.1 +License Source Code: Copyright (C) 2013-2023 Stuart Jones - LGPL v2.1 -Armor Textures: Copyright (C) 2017-2018 davidthecreator - CC-BY-SA 3.0 +Armor Textures: Copyright (C) 2017-2023 davidthecreator - CC-BY-SA 3.0 Special credit to Jordach and MirceaKitsune for providing the default 3d character model. diff --git a/mods/3d_armor/README.md b/mods/3d_armor/README.md index 3655e33a..8b114584 100644 --- a/mods/3d_armor/README.md +++ b/mods/3d_armor/README.md @@ -1,5 +1,5 @@ -Modpack - 3d Armor [0.4.13] -=========================== +Modpack - 3d Armor +================== ![3d_armor screenshot](https://github.com/minetest-mods/3d_armor/blob/master/screenshot.png) @@ -22,7 +22,7 @@ Modpack - 3d Armor [0.4.13] [mod] Visible Player Armor [3d_armor] ------------------------------------- -Minetest Version: 5.0.0 +Minetest Version: 5.0.0 and newer Game: minetest_game and many derivatives @@ -49,7 +49,24 @@ and [simple_skins] by TenPlus1. Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory. see armor.conf.example for all available options. -For mod installation instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods +For **mod installation** instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods + +The specific "armors as modpack" refactorization allows anyone to enable/disable any armors they want as mods rather than obscure settings of the past. (See [#78](https://github.com/minetest-mods/3d_armor/commit/9444afd7222a71fc17d40c9793506812d715dcc3) for further explanation.) + +Currently, the modpack includes: + +- armor_admin +- armor_bronze +- armor_cactus +- armor_crystal +- armor_diamond +- armor_gold +- armor_mithril +- armor_nether +- armor_steel +- armor_wood + +as separate armor mods intentionally. All these mods depend on 3d_armor. [API Reference](https://minetest-mods.github.io/3d_armor/reference/) diff --git a/mods/3d_armor/armor_admin/init.lua b/mods/3d_armor/armor_admin/init.lua new file mode 100644 index 00000000..a84ec624 --- /dev/null +++ b/mods/3d_armor/armor_admin/init.lua @@ -0,0 +1,94 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Admin Helmet +-- +-- @helmet 3d_armor:helmet_admin +-- @img 3d_armor_inv_helmet_admin.png +-- @grp armor_head 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp armor_water 1 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:helmet_admin", { + description = S("Admin Helmet"), + inventory_image = "3d_armor_inv_helmet_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Chestplate +-- +-- @chestplate 3d_armor:chestplate_admin +-- @img 3d_armor_inv_chestplate_admin.png +-- @grp armor_torso 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:chestplate_admin", { + description = S("Admin Chestplate"), + inventory_image = "3d_armor_inv_chestplate_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_torso=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Leggings +-- +-- @leggings 3d_armor:leggings_admin +-- @img 3d_armor_inv_leggings_admin.png +-- @grp armor_legs 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:leggings_admin", { + description = S("Admin Leggings"), + inventory_image = "3d_armor_inv_leggings_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_legs=1, armor_heal=100, armor_use=0, armor_water=1, + not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +--- Admin Boots +-- +-- @boots 3d_armor:boots_admin +-- @img 3d_armor_inv_boots_admin.png +-- @grp armor_feet 1 +-- @grp armor_heal 100 +-- @grp armor_use 0 +-- @grp not_in_creative_inventory 1 +-- @armorgrp fleshy 100 +armor:register_armor(":3d_armor:boots_admin", { + description = S("Admin Boots"), + inventory_image = "3d_armor_inv_boots_admin.png", + armor_groups = {fleshy=100}, + groups = {armor_feet=1, armor_heal=100, armor_use=0, physics_speed=1, + armor_water=1, not_in_creative_inventory=1}, + on_drop = function(itemstack, dropper, pos) + return + end, +}) + +minetest.register_alias("adminboots", "3d_armor:boots_admin") +minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") +minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") +minetest.register_alias("adminleggings", "3d_armor:leggings_admin") diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.de.tr b/mods/3d_armor/armor_admin/locale/armor_admin.de.tr new file mode 100644 index 00000000..d4751c0f --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Adminhelm +Admin Chestplate=Adminbrustplatte +Admin Leggings=Adminhose +Admin Boots=Adminstiefel diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr b/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr new file mode 100644 index 00000000..ee050eb2 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Administra Kasko +Admin Chestplate=Administra Kiraso +Admin Leggings=Administra Pantalono +Admin Boots=Administraj Botoj diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.es.tr b/mods/3d_armor/armor_admin/locale/armor_admin.es.tr new file mode 100644 index 00000000..3e1f8e04 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Casco de admin +Admin Chestplate=Peto de admin +Admin Leggings=Grebas de admin +Admin Boots=Botas de admin diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr b/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr new file mode 100644 index 00000000..497df2d3 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Casque d'admin +Admin Chestplate=Cuirasse d'admin +Admin Leggings=Jambières d'admin +Admin Boots=Bottes d'admin diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.it.tr b/mods/3d_armor/armor_admin/locale/armor_admin.it.tr new file mode 100644 index 00000000..d59b9c92 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Elmo dell'amministratrice/tore +Admin Chestplate=Corazza dell'amministratrice/tore +Admin Leggings=Gambali dell'amministratrice/tore +Admin Boots=Stivali dell'amministratrice/tore diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr b/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr new file mode 100644 index 00000000..b91f9def --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Helmet Pentadbir +Admin Chestplate=Perisai Dada Pentadbir +Admin Leggings=Perisai Kaki Pentadbir +Admin Boots=But Pentadbir diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr b/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr new file mode 100644 index 00000000..920e44f6 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet= +Admin Chestplate= +Admin Leggings= +Admin Boots= diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr b/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr new file mode 100644 index 00000000..077be2be --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Capacete de Administrador +Admin Chestplate=Peitoral de Administrador +Admin Leggings=Calças de Administrador +Admin Boots=Botas de Administrador diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr b/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr new file mode 100644 index 00000000..cd300fb0 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=шлем админа +Admin Chestplate=нагрудник админа +Admin Leggings=штаны админа +Admin Boots=ботинки админа diff --git a/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr b/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr new file mode 100644 index 00000000..91631fe8 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/armor_admin.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet=Adminhjälm +Admin Chestplate=AdminbröstplÃ¥t +Admin Leggings=Adminbyxor +Admin Boots=Adminstövlar diff --git a/mods/3d_armor/armor_admin/locale/template.txt b/mods/3d_armor/armor_admin/locale/template.txt new file mode 100644 index 00000000..920e44f6 --- /dev/null +++ b/mods/3d_armor/armor_admin/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_admin +Admin Helmet= +Admin Chestplate= +Admin Leggings= +Admin Boots= diff --git a/mods/3d_armor/armor_admin/mod.conf b/mods/3d_armor/armor_admin/mod.conf new file mode 100644 index 00000000..588d4a43 --- /dev/null +++ b/mods/3d_armor/armor_admin/mod.conf @@ -0,0 +1,3 @@ +name = armor_admin +depends = 3d_armor +description = Adds admin armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_boots_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_boots_admin_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_chestplate_admin_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_helmet_admin_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_boots_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_chestplate_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_helmet_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_inv_leggings_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png rename to mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png b/mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png rename to mods/3d_armor/armor_admin/textures/3d_armor_leggings_admin_preview.png diff --git a/mods/3d_armor/armor_bronze/init.lua b/mods/3d_armor/armor_bronze/init.lua new file mode 100644 index 00000000..ebdc4c2b --- /dev/null +++ b/mods/3d_armor/armor_bronze/init.lua @@ -0,0 +1,180 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) +--- Bronze +-- +-- Requires setting `armor_material_bronze`. +-- +-- @section bronze + +if armor.materials.bronze then + --- Bronze Helmet + -- + -- @helmet 3d_armor:helmet_bronze + -- @img 3d_armor_inv_helmet_bronze.png + -- @grp armor_head 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_bronze", { + description = S("Bronze Helmet"), + inventory_image = "3d_armor_inv_helmet_bronze.png", + groups = {armor_head=1, armor_heal=6, armor_use=400, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Chestplate + -- + -- @chestplate 3d_armor:chestplate_bronze + -- @img 3d_armor_inv_chestplate_bronze.png + -- @grp armor_torso 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_bronze", { + description = S("Bronze Chestplate"), + inventory_image = "3d_armor_inv_chestplate_bronze.png", + groups = {armor_torso=1, armor_heal=6, armor_use=400, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Leggings + -- + -- @leggings 3d_armor:leggings_bronze + -- @img 3d_armor_inv_leggings_bronze.png + -- @grp armor_legs 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_bronze", { + description = S("Bronze Leggings"), + inventory_image = "3d_armor_inv_leggings_bronze.png", + groups = {armor_legs=1, armor_heal=6, armor_use=400, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + --- Bronze Boots + -- + -- @boots 3d_armor:boots_bronze + -- @img 3d_armor_inv_boots_bronze.png + -- @grp armor_feet 1 + -- @grp armor_heal 6 + -- @grp armor_use 400 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_bronze", { + description = S("Bronze Boots"), + inventory_image = "3d_armor_inv_boots_bronze.png", + groups = {armor_feet=1, armor_heal=6, armor_use=400, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, + }) + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "bronze" + local m = armor.materials.bronze + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr new file mode 100644 index 00000000..789bdd82 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronzehelm +Bronze Chestplate=Bronzebrustplatte +Bronze Leggings=Bronzehose +Bronze Boots=Bronzestiefel diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr new file mode 100644 index 00000000..f7a13c2d --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronza Kasko +Bronze Chestplate=Bronza Kiraso +Bronze Leggings=Bronza Pantalono +Bronze Boots=Bronzaj Botoj diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr new file mode 100644 index 00000000..8103e7a4 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Casco de bronce +Bronze Chestplate=Peto de bronce +Bronze Leggings=Grebas de bronce +Bronze Boots=Botas de bronce diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr new file mode 100644 index 00000000..72d1dc4c --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Casque en bronze +Bronze Chestplate=Cuirasse en bronze +Bronze Leggings=Jambières en bronze +Bronze Boots=Bottes en bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr new file mode 100644 index 00000000..e1298244 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Elmo di bronzo +Bronze Chestplate=Corazza di bronzo +Bronze Leggings=Gambali di bronzo +Bronze Boots=Stivali di bronzo diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr new file mode 100644 index 00000000..f9167771 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Helmet Gangsa +Bronze Chestplate=Perisai Dada Gangsa +Bronze Leggings=Perisai Kaki Gangsa +Bronze Boots=But Gangsa diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr new file mode 100644 index 00000000..a9a5ab27 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Capacete de Bronze +Bronze Chestplate=Peitoral de Bronze +Bronze Leggings=Calças de Bronze +Bronze Boots=Botas de Bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr new file mode 100644 index 00000000..a9a5ab27 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Capacete de Bronze +Bronze Chestplate=Peitoral de Bronze +Bronze Leggings=Calças de Bronze +Bronze Boots=Botas de Bronze diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr new file mode 100644 index 00000000..61abdd48 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=бронзовый шлем +Bronze Chestplate=бронзовый нагрудник +Bronze Leggings=бронзовые штаны +Bronze Boots=бронзовые ботинки diff --git a/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr b/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr new file mode 100644 index 00000000..eea6741f --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/armor_bronze.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet=Bronshjälm +Bronze Chestplate=Bronsbröstplatta +Bronze Leggings=Bronsbyxor +Bronze Boots=Bronsstövlar diff --git a/mods/3d_armor/armor_bronze/locale/template.txt b/mods/3d_armor/armor_bronze/locale/template.txt new file mode 100644 index 00000000..59a56121 --- /dev/null +++ b/mods/3d_armor/armor_bronze/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_bronze +Bronze Helmet= +Bronze Chestplate= +Bronze Leggings= +Bronze Boots= diff --git a/mods/3d_armor/armor_bronze/mod.conf b/mods/3d_armor/armor_bronze/mod.conf new file mode 100644 index 00000000..7eec9023 --- /dev/null +++ b/mods/3d_armor/armor_bronze/mod.conf @@ -0,0 +1,3 @@ +name = armor_bronze +depends = 3d_armor +description = Adds craftable bronze armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_boots_bronze_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_helmet_bronze_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_boots_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_helmet_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_inv_leggings_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png b/mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png rename to mods/3d_armor/armor_bronze/textures/3d_armor_leggings_bronze_preview.png diff --git a/mods/3d_armor/armor_cactus/init.lua b/mods/3d_armor/armor_cactus/init.lua new file mode 100644 index 00000000..aaece5c6 --- /dev/null +++ b/mods/3d_armor/armor_cactus/init.lua @@ -0,0 +1,183 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Cactus +-- +-- Requires setting `armor_material_cactus`. +-- +-- @section cactus + +if armor.materials.cactus then + --- Cactus Helmet + -- + -- @helmet 3d_armor:helmet_cactus + -- @img 3d_armor_inv_helmet_cactus.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:helmet_cactus", { + description = S("Cactus Helmet"), + inventory_image = "3d_armor_inv_helmet_cactus.png", + groups = {armor_head=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Chestplate + -- + -- @chestplate 3d_armor:chestplate_cactus + -- @img 3d_armor_inv_chestplate_cactus.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:chestplate_cactus", { + description = S("Cactus Chestplate"), + inventory_image = "3d_armor_inv_chestplate_cactus.png", + groups = {armor_torso=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Leggings + -- + -- @leggings 3d_armor:leggings_cactus + -- @img 3d_armor_inv_leggings_cactus.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:leggings_cactus", { + description = S("Cactus Leggings"), + inventory_image = "3d_armor_inv_leggings_cactus.png", + groups = {armor_legs=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + --- Cactus Boots + -- + -- @boots 3d_armor:boots_cactus + -- @img 3d_armor_inv_boots_cactus.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:boots_cactus", { + description = S("Cactus Boots"), + inventory_image = "3d_armor_inv_boots_cactus.png", + groups = {armor_feet=1, armor_heal=0, armor_use=1000}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, + }) + local cactus_armor_fuel = { + helmet = 14, + chestplate = 16, + leggings = 15, + boots = 13 + } + for armor, burn in pairs(cactus_armor_fuel) do + minetest.register_craft({ + type = "fuel", + recipe = "3d_armor:" .. armor .. "_cactus", + burntime = burn, + }) + end + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "cactus" + local m = armor.materials.cactus + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr new file mode 100644 index 00000000..a09c15e6 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kaktushelm +Cactus Chestplate=Kaktusbrustplatte +Cactus Leggings=Kaktushose +Cactus Boots=Kaktusstiefel diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr new file mode 100644 index 00000000..fffcd5d5 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kakta Kasko +Cactus Chestplate=Kakta Kiraso +Cactus Leggings=Kakta Pantalono +Cactus Boots=Kaktaj Botoj diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr new file mode 100644 index 00000000..f9689177 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Casco de cactus +Cactus Chestplate=Peto de cactus +Cactus Leggings=Grebas de cactus +Cactus Boots=Botas de cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr new file mode 100644 index 00000000..b678e313 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Casque en cactus +Cactus Chestplate=Cuirasse en cactus +Cactus Leggings=Jambières en cactus +Cactus Boots=Bottes en cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr new file mode 100644 index 00000000..e46a235a --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Elmo di cactus +Cactus Chestplate=Corazza di cactus +Cactus Leggings=Gambali di cactus +Cactus Boots=Stivali di cactus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr new file mode 100644 index 00000000..f859b9eb --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Helmet Kaktus +Cactus Chestplate=Perisai Dada Kaktus +Cactus Leggings=Perisai Kaki Kaktus +Cactus Boots=But Kaktus diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr new file mode 100644 index 00000000..f3ca0923 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Capacete de Cacto +Cactus Chestplate=Peitoral de Cacto +Cactus Leggings=Calças de Cacto +Cactus Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr new file mode 100644 index 00000000..75eca173 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Capacete de Cacto +Cactus Chestplate=Peitoral de Cacto +Cactus Leggings=Calças de Cacto +Cactus Boots=Botas de Cacto diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr new file mode 100644 index 00000000..5c7df36a --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=кактуÑовый шлем +Cactus Chestplate=кактуÑовый нагрудник +Cactus Leggings=кактуÑовые штаны +Cactus Boots=кактуÑовые ботинки diff --git a/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr b/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr new file mode 100644 index 00000000..2f0981ac --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/armor_cactus.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet=Kaktushjälm +Cactus Chestplate=Kaktusbröstplatta +Cactus Leggings=Kaktusbyxor +Cactus Boots=Kaktusstövlar diff --git a/mods/3d_armor/armor_cactus/locale/template.txt b/mods/3d_armor/armor_cactus/locale/template.txt new file mode 100644 index 00000000..49da2402 --- /dev/null +++ b/mods/3d_armor/armor_cactus/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_cactus +Cactus Helmet= +Cactus Chestplate= +Cactus Leggings= +Cactus Boots= diff --git a/mods/3d_armor/armor_cactus/mod.conf b/mods/3d_armor/armor_cactus/mod.conf new file mode 100644 index 00000000..fc94af23 --- /dev/null +++ b/mods/3d_armor/armor_cactus/mod.conf @@ -0,0 +1,3 @@ +name = armor_cactus +depends = 3d_armor +description = Adds craftable cactus armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_boots_cactus_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_helmet_cactus_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_boots_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_helmet_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_inv_leggings_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png b/mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png rename to mods/3d_armor/armor_cactus/textures/3d_armor_leggings_cactus_preview.png diff --git a/mods/3d_armor/armor_crystal/init.lua b/mods/3d_armor/armor_crystal/init.lua new file mode 100644 index 00000000..aa9a76af --- /dev/null +++ b/mods/3d_armor/armor_crystal/init.lua @@ -0,0 +1,169 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Crystal +-- +-- Requires `armor_material_crystal`. +-- +-- @section crystal + +if armor.materials.crystal then + --- Crystal Helmet + -- + -- @helmet 3d_armor:helmet_crystal + -- @img 3d_armor_inv_helmet_crystal.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_crystal", { + description = S("Crystal Helmet"), + inventory_image = "3d_armor_inv_helmet_crystal.png", + groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Chestplate + -- + -- @chestplate 3d_armor:chestplate_crystal + -- @img 3d_armor_inv_chestplate_crystal.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_crystal", { + description = S("Crystal Chestplate"), + inventory_image = "3d_armor_inv_chestplate_crystal.png", + groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Leggings + -- + -- @leggings 3d_armor:leggings_crystal + -- @img 3d_armor_inv_leggings_crystal.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp armor_fire 1 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_crystal", { + description = S("Crystal Leggings"), + inventory_image = "3d_armor_inv_leggings_crystal.png", + groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Crystal Boots + -- + -- @boots 3d_armor:boots_crystal + -- @img 3d_armor_inv_boots_crystal.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @grp physics_speed 1 + -- @grp physics_jump 0.5 + -- @grp armor_fire 1 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_crystal", { + description = S("Crystal Boots"), + inventory_image = "3d_armor_inv_boots_crystal.png", + groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1, + physics_jump=0.5, armor_fire=1}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "crystal" + local m = armor.materials.crystal + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr new file mode 100644 index 00000000..18e76242 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristallhelm +Crystal Chestplate=Kristallbrustplatte +Crystal Leggings=Kristallhose +Crystal Boots=Kristallstiefel diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr new file mode 100644 index 00000000..7fae4ea2 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristala Kasko +Crystal Chestplate=Kristala Kiraso +Crystal Leggings=Kristala Pantalono +Crystal Boots=Kristalaj Botoj diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr new file mode 100644 index 00000000..cc7e60b1 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Casco de cristal +Crystal Chestplate=Peto de cristal +Crystal Leggings=Grebas de cristal +Crystal Boots=Botas de cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr new file mode 100644 index 00000000..d127635d --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Casque en cristal +Crystal Chestplate=Cuirasse en cristal +Crystal Leggings=Jambières en cristal +Crystal Boots=Bottes en cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr new file mode 100644 index 00000000..85c3f512 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Elmo di cristallo +Crystal Chestplate=Corazza di cristallo +Crystal Leggings=Gambali di cristallo +Crystal Boots=Stivali di cristallo diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr new file mode 100644 index 00000000..6e53ffda --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Helmet Kristal +Crystal Chestplate=Perisai Dada Kristal +Crystal Leggings=Perisai Kaki Kristal +Crystal Boots=But Kristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr new file mode 100644 index 00000000..43e042ee --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Capacete de Cristal +Crystal Chestplate=Peitoral de Cristal +Crystal Leggings=Calças de Cristal +Crystal Boots=Botas de Cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr new file mode 100644 index 00000000..43e042ee --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Capacete de Cristal +Crystal Chestplate=Peitoral de Cristal +Crystal Leggings=Calças de Cristal +Crystal Boots=Botas de Cristal diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr new file mode 100644 index 00000000..4915198b --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=криÑталловый шлем +Crystal Chestplate=криÑталловый нагрудник +Crystal Leggings=криÑталловые штаны +Crystal Boots=криÑталловые ботинки diff --git a/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr b/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr new file mode 100644 index 00000000..57d0bd12 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/armor_crystal.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet=Kristallhjälm +Crystal Chestplate=Kristallbröstplatta +Crystal Leggings=Kristallbyxor +Crystal Boots=Kristallstövlar diff --git a/mods/3d_armor/armor_crystal/locale/template.txt b/mods/3d_armor/armor_crystal/locale/template.txt new file mode 100644 index 00000000..4244d314 --- /dev/null +++ b/mods/3d_armor/armor_crystal/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_crystal +Crystal Helmet= +Crystal Chestplate= +Crystal Leggings= +Crystal Boots= diff --git a/mods/3d_armor/armor_crystal/mod.conf b/mods/3d_armor/armor_crystal/mod.conf new file mode 100644 index 00000000..9531bbcc --- /dev/null +++ b/mods/3d_armor/armor_crystal/mod.conf @@ -0,0 +1,4 @@ +name = armor_crystal +depends = 3d_armor +optional_depends = ethereal +description = Adds craftable crystal armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_boots_crystal_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_helmet_crystal_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_boots_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_helmet_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_inv_leggings_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png b/mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png rename to mods/3d_armor/armor_crystal/textures/3d_armor_leggings_crystal_preview.png diff --git a/mods/3d_armor/armor_diamond/init.lua b/mods/3d_armor/armor_diamond/init.lua new file mode 100644 index 00000000..c92cf0eb --- /dev/null +++ b/mods/3d_armor/armor_diamond/init.lua @@ -0,0 +1,166 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Diamond +-- +-- Requires setting `armor_material_diamond`. +-- +-- @section diamond + +if armor.materials.diamond then + --- Diamond Helmet + -- + -- @helmet 3d_armor:helmet_diamond + -- @img 3d_armor_inv_helmet_diamond.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_diamond", { + description = S("Diamond Helmet"), + inventory_image = "3d_armor_inv_helmet_diamond.png", + groups = {armor_head=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Chestplate + -- + -- @chestplate 3d_armor:chestplate_diamond + -- @img 3d_armor_inv_chestplate_diamond.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_diamond", { + description = S("Diamond Chestplate"), + inventory_image = "3d_armor_inv_chestplate_diamond.png", + groups = {armor_torso=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Leggings + -- + -- @leggings 3d_armor:leggings_diamond + -- @img 3d_armor_inv_leggings_diamond.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_diamond", { + description = S("Diamond Leggings"), + inventory_image = "3d_armor_inv_leggings_diamond.png", + groups = {armor_legs=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=20}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + --- Diamond Boots + -- + -- @boots 3d_armor:boots_diamond + -- @img 3d_armor_inv_boots_diamond.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 200 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp choppy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_diamond", { + description = S("Diamond Boots"), + inventory_image = "3d_armor_inv_boots_diamond.png", + groups = {armor_feet=1, armor_heal=12, armor_use=200}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "diamond" + local m = armor.materials.diamond + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr new file mode 100644 index 00000000..f19d67a3 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanthelm +Diamond Chestplate=Diamantbrustplatte +Diamond Leggings=Diamanthose +Diamond Boots=Diamantstiefel diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr new file mode 100644 index 00000000..48e57683 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanta Kasko +Diamond Chestplate=Diamanta Kiraso +Diamond Leggings=Diamanta Pantalono +Diamond Boots=Diamantaj Botoj diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr new file mode 100644 index 00000000..c0a96b30 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Casco de diamante +Diamond Chestplate=Peto de diamante +Diamond Leggings=Grebas de diamante +Diamond Boots=Botas de diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr new file mode 100644 index 00000000..347d2213 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Casque en diamant +Diamond Chestplate=Cuirasse en diamant +Diamond Leggings=Jambières en diamant +Diamond Boots=Bottes en diamant diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr new file mode 100644 index 00000000..b5aa14c1 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Elmo di diamante +Diamond Chestplate=Corazza di diamante +Diamond Leggings=Gambali di diamante +Diamond Boots=Stivali di diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr new file mode 100644 index 00000000..bc6f7372 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Helmet Intan +Diamond Chestplate=Perisai Dada Intan +Diamond Leggings=Perisai Kaki Intan +Diamond Boots=But Intan diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr new file mode 100644 index 00000000..effc56c0 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Capacete de Diamante +Diamond Chestplate=Peitoral de Diamante +Diamond Leggings=Calças de Diamante +Diamond Boots=Botas de Diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr new file mode 100644 index 00000000..effc56c0 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Capacete de Diamante +Diamond Chestplate=Peitoral de Diamante +Diamond Leggings=Calças de Diamante +Diamond Boots=Botas de Diamante diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr new file mode 100644 index 00000000..0ee465b9 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=алмазный шлем +Diamond Chestplate=алмазный нагрудник +Diamond Leggings=алмазные штаны +Diamond Boots=алмазные ботинки diff --git a/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr b/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr new file mode 100644 index 00000000..622daadd --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/armor_diamond.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet=Diamanthjälm +Diamond Chestplate=Diamantbröstplatta +Diamond Leggings=Diamantbyxor +Diamond Boots=Diamantstövlar diff --git a/mods/3d_armor/armor_diamond/locale/template.txt b/mods/3d_armor/armor_diamond/locale/template.txt new file mode 100644 index 00000000..6e169f12 --- /dev/null +++ b/mods/3d_armor/armor_diamond/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_diamond +Diamond Helmet= +Diamond Chestplate= +Diamond Leggings= +Diamond Boots= diff --git a/mods/3d_armor/armor_diamond/mod.conf b/mods/3d_armor/armor_diamond/mod.conf new file mode 100644 index 00000000..27d1cc98 --- /dev/null +++ b/mods/3d_armor/armor_diamond/mod.conf @@ -0,0 +1,3 @@ +name = armor_diamond +depends = 3d_armor +description = Adds craftable diamond armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_boots_diamond_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_helmet_diamond_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_boots_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_helmet_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_inv_leggings_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png rename to mods/3d_armor/armor_diamond/textures/3d_armor_leggings_diamond_preview.png diff --git a/mods/3d_armor/armor_gold/init.lua b/mods/3d_armor/armor_gold/init.lua new file mode 100644 index 00000000..a8bb01ff --- /dev/null +++ b/mods/3d_armor/armor_gold/init.lua @@ -0,0 +1,183 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + + +--- Gold +-- +-- Requires `armor_material_gold`. +-- +-- @section gold + +if armor.materials.gold then + --- Gold Helmet + -- + -- @helmet 3d_armor:helmet_gold + -- @img 3d_armor_inv_helmet_gold.png + -- @grp armor_head 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.02 + -- @grp physics_gravity 0.02 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_gold", { + description = S("Gold Helmet"), + inventory_image = "3d_armor_inv_helmet_gold.png", + groups = {armor_head=1, armor_heal=6, armor_use=300, + physics_speed=-0.02, physics_gravity=0.02}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Chestplate + -- + -- @chestplate 3d_armor:chestplate_gold + -- @img 3d_armor_inv_chestplate_gold.png + -- @grp armor_torso 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.05 + -- @grp physics_gravity 0.05 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_gold", { + description = S("Gold Chestplate"), + inventory_image = "3d_armor_inv_chestplate_gold.png", + groups = {armor_torso=1, armor_heal=6, armor_use=300, + physics_speed=-0.05, physics_gravity=0.05}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Leggings + -- + -- @leggings 3d_armor:leggings_gold + -- @img 3d_armor_inv_leggings_gold.png + -- @grp armor_legs 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.04 + -- @grp physics_gravity 0.04 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_gold", { + description = S("Gold Leggings"), + inventory_image = "3d_armor_inv_leggings_gold.png", + groups = {armor_legs=1, armor_heal=6, armor_use=300, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + --- Gold Boots + -- + -- @boots 3d_armor:boots_gold + -- @img 3d_armor_inv_boots_gold.png + -- @grp armor_feet 1 + -- @grp armor_heal 6 + -- @grp armor_use 300 + -- @grp physics_speed -0.02 + -- @grp physics_gravity 0.02 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 1 + -- @damagegrp snappy 2 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 3 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_gold", { + description = S("Gold Boots"), + inventory_image = "3d_armor_inv_boots_gold.png", + groups = {armor_feet=1, armor_heal=6, armor_use=300, + physics_speed=-0.02, physics_gravity=0.02}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "gold" + local m = armor.materials.gold + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.de.tr b/mods/3d_armor/armor_gold/locale/armor_gold.de.tr new file mode 100644 index 00000000..f7098cf1 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Goldhelm +Gold Chestplate=Goldbrustplatte +Gold Leggings=Goldhose +Gold Boots=Goldstiefel diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr b/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr new file mode 100644 index 00000000..58916f1d --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Ora Kasko +Gold Chestplate=Ora Kiraso +Gold Leggings=Ora Pantalono +Gold Boots=Oraj Botoj diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.es.tr b/mods/3d_armor/armor_gold/locale/armor_gold.es.tr new file mode 100644 index 00000000..e82affbc --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Casco de oro +Gold Chestplate=Peto de oro +Gold Leggings=Grebas de oro +Gold Boots=Botas de oro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr b/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr new file mode 100644 index 00000000..8b3a2ae8 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Casque en or +Gold Chestplate=Cuirasse en or +Gold Leggings=Jambières en or +Gold Boots=Bottes en or diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.it.tr b/mods/3d_armor/armor_gold/locale/armor_gold.it.tr new file mode 100644 index 00000000..7480cfcd --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Elmo d'oro +Gold Chestplate=Corazza d'oro +Gold Leggings=Gambali d'oro +Gold Boots=Stivali d'oro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr b/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr new file mode 100644 index 00000000..47e0e695 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Helmet Emas +Gold Chestplate=Perisai Dada Emas +Gold Leggings=Perisai Kaki Emas +Gold Boots=But Emas diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr b/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr new file mode 100644 index 00000000..abe79331 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Capacete de Ouro +Gold Chestplate=Peitoral de Ouro +Gold Leggings=Calças de Ouro +Gold Boots=Botas de Ouro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr b/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr new file mode 100644 index 00000000..abe79331 --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Capacete de Ouro +Gold Chestplate=Peitoral de Ouro +Gold Leggings=Calças de Ouro +Gold Boots=Botas de Ouro diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr b/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr new file mode 100644 index 00000000..c25f20fe --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=золотой шлем +Gold Chestplate=золотой нагрудник +Gold Leggings=золотые штаны +Gold Boots=золотые ботинки diff --git a/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr b/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr new file mode 100644 index 00000000..02191d3b --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/armor_gold.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet=Guldhjälm +Gold Chestplate=Goldbröstplatta +Gold Leggings=Guldbyxor +Gold Boots=Guldstövlar diff --git a/mods/3d_armor/armor_gold/locale/template.txt b/mods/3d_armor/armor_gold/locale/template.txt new file mode 100644 index 00000000..178aff0b --- /dev/null +++ b/mods/3d_armor/armor_gold/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_gold +Gold Helmet= +Gold Chestplate= +Gold Leggings= +Gold Boots= diff --git a/mods/3d_armor/armor_gold/mod.conf b/mods/3d_armor/armor_gold/mod.conf new file mode 100644 index 00000000..092ab6de --- /dev/null +++ b/mods/3d_armor/armor_gold/mod.conf @@ -0,0 +1,3 @@ +name = armor_gold +depends = 3d_armor +description = Adds craftable gold armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_boots_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_boots_gold_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_chestplate_gold_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_helmet_gold_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_boots_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_chestplate_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_helmet_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_inv_leggings_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png rename to mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png b/mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png rename to mods/3d_armor/armor_gold/textures/3d_armor_leggings_gold_preview.png diff --git a/mods/3d_armor/armor_mithril/init.lua b/mods/3d_armor/armor_mithril/init.lua new file mode 100644 index 00000000..cdec0db3 --- /dev/null +++ b/mods/3d_armor/armor_mithril/init.lua @@ -0,0 +1,162 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Mithril +-- +-- Requires `armor_material_mithril`. +-- +-- @section mithril + +if armor.materials.mithril then + --- Mithril Helmet + -- + -- @helmet 3d_armor:helmet_mithril + -- @img 3d_armor_inv_helmet_mithril.png + -- @grp armor_head 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_mithril", { + description = S("Mithril Helmet"), + inventory_image = "3d_armor_inv_helmet_mithril.png", + groups = {armor_head=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Chestplate + -- + -- @chestplate 3d_armor:chestplate_mithril + -- @img 3d_armor_inv_chestplate_mithril.png + -- @grp armor_torso 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_mithril", { + description = S("Mithril Chestplate"), + inventory_image = "3d_armor_inv_chestplate_mithril.png", + groups = {armor_torso=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=21}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Leggings + -- + -- @leggings 3d_armor:leggings_mithril + -- @img 3d_armor_inv_leggings_mithril.png + -- @grp armor_legs 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 20 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_mithril", { + description = S("Mithril Leggings"), + inventory_image = "3d_armor_inv_leggings_mithril.png", + groups = {armor_legs=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=21}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + --- Mithril Boots + -- + -- @boots 3d_armor:boots_mithril + -- @img 3d_armor_inv_boots_mithril.png + -- @grp armor_feet 1 + -- @grp armor_heal 12 + -- @grp armor_use 100 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 1 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_mithril", { + description = S("Mithril Boots"), + inventory_image = "3d_armor_inv_boots_mithril.png", + groups = {armor_feet=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, + damage_groups = {cracky=2, snappy=1, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "mithril" + local m = armor.materials.mithril + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr new file mode 100644 index 00000000..09fdf206 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mithrilhelm +Mithril Chestplate=Mithrilbrustplatte +Mithril Leggings=Mithrilhose +Mithril Boots=Mithrilstiefel diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr new file mode 100644 index 00000000..ae5c92da --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mitrila Kasko +Mithril Chestplate=Mitrila Kiraso +Mithril Leggings=Mitrila Pantalono +Mithril Boots=Mitrilaj Botoj diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr new file mode 100644 index 00000000..aaae80fb --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Casco de mitrilo +Mithril Chestplate=Peto de mitrilo +Mithril Leggings=Grebas de mitrilo +Mithril Boots=Botas de mitrilo diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr new file mode 100644 index 00000000..fad39102 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Casque en mithril +Mithril Chestplate=Cuirasse en mithril +Mithril Leggings=Jambières en mithril +Mithril Boots=Bottes en mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr new file mode 100644 index 00000000..9490f72b --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Elmo di mithril +Mithril Chestplate=Corazza di mithril +Mithril Leggings=Gambali di mithril +Mithril Boots=Stivali di mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr new file mode 100644 index 00000000..fc113a63 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Helmet Mithril +Mithril Chestplate=Perisai Dada Mithril +Mithril Leggings=Perisai Kaki Mithril +Mithril Boots=But Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr new file mode 100644 index 00000000..82b8db1d --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Capacete de Mithril +Mithril Chestplate=Peitoral de Mithril +Mithril Leggings=Calças de Mithril +Mithril Boots=Botas de Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr new file mode 100644 index 00000000..82b8db1d --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Capacete de Mithril +Mithril Chestplate=Peitoral de Mithril +Mithril Leggings=Calças de Mithril +Mithril Boots=Botas de Mithril diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr new file mode 100644 index 00000000..3444f2f8 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=мифриловый шлем +Mithril Chestplate=мифриловый нагрудник +Mithril Leggings=мифриловые штаны +Mithril Boots=мифриловые ботинки diff --git a/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr b/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr new file mode 100644 index 00000000..0d8ed8e0 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/armor_mithril.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet=Mithrilhjälm +Mithril Chestplate=Mithrilbröstplatta +Mithril Leggings=Mithrilbyxor +Mithril Boots=Mithrilstövlar diff --git a/mods/3d_armor/armor_mithril/locale/template.txt b/mods/3d_armor/armor_mithril/locale/template.txt new file mode 100644 index 00000000..4d5da603 --- /dev/null +++ b/mods/3d_armor/armor_mithril/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_mithril +Mithril Helmet= +Mithril Chestplate= +Mithril Leggings= +Mithril Boots= diff --git a/mods/3d_armor/armor_mithril/mod.conf b/mods/3d_armor/armor_mithril/mod.conf new file mode 100644 index 00000000..5cc6948d --- /dev/null +++ b/mods/3d_armor/armor_mithril/mod.conf @@ -0,0 +1,4 @@ +name = armor_mithril +depends = 3d_armor +optional_depends = moreores +description = Adds craftable mithril armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_boots_mithril_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_helmet_mithril_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_boots_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_helmet_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_inv_leggings_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png b/mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png rename to mods/3d_armor/armor_mithril/textures/3d_armor_leggings_mithril_preview.png diff --git a/mods/3d_armor/armor_nether/init.lua b/mods/3d_armor/armor_nether/init.lua new file mode 100644 index 00000000..3e20ee33 --- /dev/null +++ b/mods/3d_armor/armor_nether/init.lua @@ -0,0 +1,168 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + + +--- Nether +-- +-- Requires `armor_material_nether`. +-- +-- @section nether + +if armor.materials.nether then + --- Nether Helmet + -- + -- @helmet 3d_armor:helmet_nether + -- @img 3d_armor_inv_helmet_nether.png + -- @grp armor_head 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 18 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:helmet_nether", { + description = S("Nether Helmet"), + inventory_image = "3d_armor_inv_helmet_nether.png", + groups = {armor_head=1, armor_heal=14, armor_use=100, armor_fire=1}, + armor_groups = {fleshy=18}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Chestplate + -- + -- @chestplate 3d_armor:chestplate_nether + -- @img 3d_armor_inv_chestplate_nether.png + -- @grp armor_torso 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 25 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:chestplate_nether", { + description = S("Nether Chestplate"), + inventory_image = "3d_armor_inv_chestplate_nether.png", + groups = {armor_torso=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=25}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Leggings + -- + -- @leggings 3d_armor:leggings_nether + -- @img 3d_armor_inv_leggings_nether.png + -- @grp armor_legs 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 25 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:leggings_nether", { + description = S("Nether Leggings"), + inventory_image = "3d_armor_inv_leggings_nether.png", + groups = {armor_legs=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=25}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + --- Nether Boots + -- + -- @boots 3d_armor:boots_nether + -- @img 3d_armor_inv_boots_nether.png + -- @grp armor_feet 1 + -- @grp armor_heal 14 + -- @grp armor_use 200 + -- @grp armor_fire 1 + -- @armorgrp fleshy 18 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp level 3 + armor:register_armor(":3d_armor:boots_nether", { + description = S("Nether Boots"), + inventory_image = "3d_armor_inv_boots_nether.png", + groups = {armor_feet=1, armor_heal=14, armor_use=200, armor_fire=1}, + armor_groups = {fleshy=18}, + damage_groups = {cracky=3, snappy=2, level=3}, + }) + + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "nether" + local m = armor.materials.nether + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) + +end diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.de.tr b/mods/3d_armor/armor_nether/locale/armor_nether.de.tr new file mode 100644 index 00000000..d1793537 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Netherhelm +Nether Chestplate=Netherbrustplatte +Nether Leggings=Netherhose +Nether Boots=Netherstiefel diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr b/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr new file mode 100644 index 00000000..cdf5c02f --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Inferna Kasko +Nether Chestplate=Inferna Kiraso +Nether Leggings=Inferna Pantalono +Nether Boots=Infernaj Botoj diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.es.tr b/mods/3d_armor/armor_nether/locale/armor_nether.es.tr new file mode 100644 index 00000000..1e672e48 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Casco de nether +Nether Chestplate=Peto de nether +Nether Leggings=Grebas de nether +Nether Boots=Botas de nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr b/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr new file mode 100644 index 00000000..96b78781 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Casque en nether +Nether Chestplate=Cuirasse en nether +Nether Leggings=Jambières en nether +Nether Boots=Bottes en nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.it.tr b/mods/3d_armor/armor_nether/locale/armor_nether.it.tr new file mode 100644 index 00000000..036118b4 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Elmo di nether +Nether Chestplate=Corazza di nether +Nether Leggings=Gambali di nether +Nether Boots=Stivali di nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr b/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr new file mode 100644 index 00000000..7b9fd1bb --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Helmet Nether +Nether Chestplate=Perisai Dada Nether +Nether Leggings=Perisai Kaki Nether +Nether Boots=But Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr b/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr new file mode 100644 index 00000000..b29983a5 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Capacete de Nether +Nether Chestplate=Peitoral de Nether +Nether Leggings=Calças de Nether +Nether Boots=Botas de Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr b/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr new file mode 100644 index 00000000..b29983a5 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Capacete de Nether +Nether Chestplate=Peitoral de Nether +Nether Leggings=Calças de Nether +Nether Boots=Botas de Nether diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr b/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr new file mode 100644 index 00000000..3ba213d8 --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=адÑкий шлем +Nether Chestplate=адÑкий нагрудник +Nether Leggings=адÑкие штаны +Nether Boots=адÑкие ботинки diff --git a/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr b/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr new file mode 100644 index 00000000..a26599ce --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/armor_nether.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet=Netherhjälm +Nether Chestplate=Netherbröstplatta +Nether Leggings=Netherbyxor +Nether Boots=Netherstövlar diff --git a/mods/3d_armor/armor_nether/locale/template.txt b/mods/3d_armor/armor_nether/locale/template.txt new file mode 100644 index 00000000..7b02e38c --- /dev/null +++ b/mods/3d_armor/armor_nether/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_nether +Nether Helmet= +Nether Chestplate= +Nether Leggings= +Nether Boots= diff --git a/mods/3d_armor/armor_nether/mod.conf b/mods/3d_armor/armor_nether/mod.conf new file mode 100644 index 00000000..3e99b555 --- /dev/null +++ b/mods/3d_armor/armor_nether/mod.conf @@ -0,0 +1,4 @@ +name = armor_nether +depends = 3d_armor +optional_depends = nether +description = Adds craftable wood armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_boots_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_boots_nether_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_chestplate_nether_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_helmet_nether_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_boots_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_chestplate_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_helmet_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_inv_leggings_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether.png b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether.png rename to mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether_preview.png b/mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_nether_preview.png rename to mods/3d_armor/armor_nether/textures/3d_armor_leggings_nether_preview.png diff --git a/mods/3d_armor/armor_steel/init.lua b/mods/3d_armor/armor_steel/init.lua new file mode 100644 index 00000000..d8cbc0bc --- /dev/null +++ b/mods/3d_armor/armor_steel/init.lua @@ -0,0 +1,181 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Steel +-- +-- Requires setting `armor_material_steel`. +-- +-- @section steel + +if armor.materials.steel then + --- Steel Helmet + -- + -- @helmet 3d_armor:helmet_steel + -- @img 3d_armor_inv_helmet_steel.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.01 + -- @grp physica_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:helmet_steel", { + description = S("Steel Helmet"), + inventory_image = "3d_armor_inv_helmet_steel.png", + groups = {armor_head=1, armor_heal=0, armor_use=800, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Chestplate + -- + -- @chestplate 3d_armor:chestplate_steel + -- @img 3d_armor_inv_chestplate_steel.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed + -- @grp physics_gravity + -- @armorgrp fleshy + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:chestplate_steel", { + description = S("Steel Chestplate"), + inventory_image = "3d_armor_inv_chestplate_steel.png", + groups = {armor_torso=1, armor_heal=0, armor_use=800, + physics_speed=-0.04, physics_gravity=0.04}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Leggings + -- + -- @leggings 3d_armor:leggings_steel + -- @img 3d_armor_inv_leggings_steel.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.03 + -- @grp physics_gravity 0.03 + -- @armorgrp fleshy 15 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:leggings_steel", { + description = S("Steel Leggings"), + inventory_image = "3d_armor_inv_leggings_steel.png", + groups = {armor_legs=1, armor_heal=0, armor_use=800, + physics_speed=-0.03, physics_gravity=0.03}, + armor_groups = {fleshy=15}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + --- Steel Boots + -- + -- @boots 3d_armor:boots_steel + -- @img 3d_armor_inv_boots_steel.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 800 + -- @grp physics_speed -0.01 + -- @grp physics_gravity 0.01 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 2 + -- @damagegrp snappy 3 + -- @damagegrp choppy 2 + -- @damagegrp crumbly 1 + -- @damagegrp level 2 + armor:register_armor(":3d_armor:boots_steel", { + description = S("Steel Boots"), + inventory_image = "3d_armor_inv_boots_steel.png", + groups = {armor_feet=1, armor_heal=0, armor_use=800, + physics_speed=-0.01, physics_gravity=0.01}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, + }) + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "steel" + local m = armor.materials.steel + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.de.tr b/mods/3d_armor/armor_steel/locale/armor_steel.de.tr new file mode 100644 index 00000000..0be569ac --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Stahlhelm +Steel Chestplate=Stahlbrustplatte +Steel Leggings=Stahlhose +Steel Boots=Stahlstiefel diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr b/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr new file mode 100644 index 00000000..8c1d0661 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Åœtala Kasko +Steel Chestplate=Åœtala Kiraso +Steel Leggings=Åœtala Pantalono +Steel Boots=Åœtalaj Botoj diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.es.tr b/mods/3d_armor/armor_steel/locale/armor_steel.es.tr new file mode 100644 index 00000000..9af65df6 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Casco de acero +Steel Chestplate=Peto de acero +Steel Leggings=Grebas de acero +Steel Boots=Botas de acero diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr b/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr new file mode 100644 index 00000000..8f1d063a --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Casque en acier +Steel Chestplate=Cuirasse en acier +Steel Leggings=Jambières en acier +Steel Boots=Bottes en acier diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.it.tr b/mods/3d_armor/armor_steel/locale/armor_steel.it.tr new file mode 100644 index 00000000..cbd08789 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Elmo d'acciaio +Steel Chestplate=Corazza d'acciaio +Steel Leggings=Gambali d'acciaio +Steel Boots=Stivali d'acciaio diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr b/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr new file mode 100644 index 00000000..201a2f6c --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Helmet Keluli +Steel Chestplate=Perisai Dada Keluli +Steel Leggings=Perisai Kaki Keluli +Steel Boots=But Keluli diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr b/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr new file mode 100644 index 00000000..a30fd928 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Capacete de Aço +Steel Chestplate=Peitoral de Aço +Steel Leggings=Calças de Aço +Steel Boots=Botas de Aço diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr b/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr new file mode 100644 index 00000000..a30fd928 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Capacete de Aço +Steel Chestplate=Peitoral de Aço +Steel Leggings=Calças de Aço +Steel Boots=Botas de Aço diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr b/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr new file mode 100644 index 00000000..ed836ce2 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=Ñтальной шлем +Steel Chestplate=Ñтальной нагрудник +Steel Leggings=Ñтальные штаны +Steel Boots=Ñтальные ботинки diff --git a/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr b/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr new file mode 100644 index 00000000..1353b4ad --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/armor_steel.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet=StÃ¥lhjälm +Steel Chestplate=StÃ¥lbröstplatta +Steel Leggings=StÃ¥lbyxor +Steel Boots=StÃ¥lstövlar diff --git a/mods/3d_armor/armor_steel/locale/template.txt b/mods/3d_armor/armor_steel/locale/template.txt new file mode 100644 index 00000000..0d6c3f61 --- /dev/null +++ b/mods/3d_armor/armor_steel/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_steel +Steel Helmet= +Steel Chestplate= +Steel Leggings= +Steel Boots= diff --git a/mods/3d_armor/armor_steel/mod.conf b/mods/3d_armor/armor_steel/mod.conf new file mode 100644 index 00000000..962e756d --- /dev/null +++ b/mods/3d_armor/armor_steel/mod.conf @@ -0,0 +1,3 @@ +name = armor_steel +depends = 3d_armor +description = Adds craftable steel armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_boots_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_boots_steel_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_chestplate_steel_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_helmet_steel_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_boots_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_chestplate_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_helmet_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_inv_leggings_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png rename to mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png b/mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png rename to mods/3d_armor/armor_steel/textures/3d_armor_leggings_steel_preview.png diff --git a/mods/3d_armor/armor_wood/init.lua b/mods/3d_armor/armor_wood/init.lua new file mode 100644 index 00000000..f9b6b82b --- /dev/null +++ b/mods/3d_armor/armor_wood/init.lua @@ -0,0 +1,186 @@ + +--- Registered armors. +-- +-- @topic armor + + +-- support for i18n +local S = minetest.get_translator(minetest.get_current_modname()) + +--- Wood +-- +-- Requires setting `armor_material_wood`. +-- +-- @section wood + +if armor.materials.wood then + --- Wood Helmet + -- + -- @helmet 3d_armor:helmet_wood + -- @img 3d_armor_inv_helmet_wood.png + -- @grp armor_head 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:helmet_wood", { + description = S("Wood Helmet"), + inventory_image = "3d_armor_inv_helmet_wood.png", + groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Chestplate + -- + -- @chestplate 3d_armor:chestplate_wood + -- @img 3d_armor_inv_chestplate_wood.png + -- @grp armor_torso 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:chestplate_wood", { + description = S("Wood Chestplate"), + inventory_image = "3d_armor_inv_chestplate_wood.png", + groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Leggings + -- + -- @leggings 3d_armor:leggings_wood + -- @img 3d_armor_inv_leggings_wood.png + -- @grp armor_legs 1 + -- @grp armor_heal 0 + -- @grp armor_use 1000 + -- @grp flammable 1 + -- @armorgrp fleshy 10 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:leggings_wood", { + description = S("Wood Leggings"), + inventory_image = "3d_armor_inv_leggings_wood.png", + groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1}, + armor_groups = {fleshy=10}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + }) + --- Wood Boots + -- + -- @boots 3d_armor:boots_wood + -- @img 3d_armor_inv_boots_wood.png + -- @grp armor_feet 1 + -- @grp armor_heal 0 + -- @grp armor_use 2000 + -- @grp flammable 1 + -- @armorgrp fleshy 5 + -- @damagegrp cracky 3 + -- @damagegrp snappy 2 + -- @damagegrp choppy 3 + -- @damagegrp crumbly 2 + -- @damagegrp level 1 + armor:register_armor(":3d_armor:boots_wood", { + description = S("Wood Boots"), + inventory_image = "3d_armor_inv_boots_wood.png", + armor_groups = {fleshy=5}, + damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, + groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1}, + }) + local wood_armor_fuel = { + helmet = 6, + chestplate = 8, + leggings = 7, + boots = 5 + } + for armor, burn in pairs(wood_armor_fuel) do + minetest.register_craft({ + type = "fuel", + recipe = "3d_armor:" .. armor .. "_wood", + burntime = burn, + }) + end + + --- Crafting + -- + -- @section craft + + --- Craft recipes for helmets, chestplates, leggings, boots, & shields. + -- + -- @craft armor + -- @usage + -- Key: + -- - m: material + -- - wood: group:wood + -- - cactus: default:cactus + -- - steel: default:steel_ingot + -- - bronze: default:bronze_ingot + -- - diamond: default:diamond + -- - gold: default:gold_ingot + -- - mithril: moreores:mithril_ingot + -- - crystal: ethereal:crystal_ingot + -- - nether: nether:nether_ingot + -- + -- helmet: chestplate: leggings: + -- ┌───┬───┬───┠┌───┬───┬───┠┌───┬───┬───┠+ -- │ m │ m │ m │ │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ │ m │ │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ ├───┼───┼───┤ + -- │ │ │ │ │ m │ m │ m │ │ m │ │ m │ + -- └───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┘ + -- + -- boots: shield: + -- ┌───┬───┬───┠┌───┬───┬───┠+ -- │ │ │ │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ m │ m │ m │ + -- ├───┼───┼───┤ ├───┼───┼───┤ + -- │ m │ │ m │ │ │ m │ │ + -- └───┴───┴───┘ └───┴───┴───┘ + + local s = "wood" + local m = armor.materials.wood + minetest.register_craft({ + output = "3d_armor:helmet_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..s, + recipe = { + {m, "", m}, + {m, m, m}, + {m, m, m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..s, + recipe = { + {m, m, m}, + {m, "", m}, + {m, "", m}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..s, + recipe = { + {m, "", m}, + {m, "", m}, + }, + }) +end diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.de.tr b/mods/3d_armor/armor_wood/locale/armor_wood.de.tr new file mode 100644 index 00000000..f4a10224 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.de.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Holzhelm +Wood Chestplate=Holzbrustplatte +Wood Leggings=Holzhose +Wood Boots=Holzstiefel diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr b/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr new file mode 100644 index 00000000..042ca7de --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.eo.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Ligna Kasko +Wood Chestplate=Ligna Kiraso +Wood Leggings=Ligna Pantalono +Wood Boots=Lignaj Botoj diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.es.tr b/mods/3d_armor/armor_wood/locale/armor_wood.es.tr new file mode 100644 index 00000000..a43f9ab8 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.es.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Casco de madera +Wood Chestplate=Peto de madera +Wood Leggings=Grebas de madera +Wood Boots=Botas de madera diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr b/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr new file mode 100644 index 00000000..953a787e --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.fr.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Casque en bois +Wood Chestplate=Cuirasse en bois +Wood Leggings=Jambières en bois +Wood Boots=Bottes en bois diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.it.tr b/mods/3d_armor/armor_wood/locale/armor_wood.it.tr new file mode 100644 index 00000000..ef4b540d --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.it.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Elmo di legno +Wood Chestplate=Corazza di legno +Wood Leggings=Gambali di legno +Wood Boots=Stivali di legno diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr b/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr new file mode 100644 index 00000000..6ef45935 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.ms.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Helmet Kayu +Wood Chestplate=Perisai Dada Kayu +Wood Leggings=Perisai Kaki Kayu +Wood Boots=But Kayu diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr b/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr new file mode 100644 index 00000000..ab471a43 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.pt.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Capacete de Madeira +Wood Chestplate=Peitoral de Madeira +Wood Leggings=Calças de Madeira +Wood Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr b/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr new file mode 100644 index 00000000..ab471a43 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Capacete de Madeira +Wood Chestplate=Peitoral de Madeira +Wood Leggings=Calças de Madeira +Wood Boots=Botas de Madeira diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr b/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr new file mode 100644 index 00000000..93fdb554 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.ru.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=деревÑнный шлем +Wood Chestplate=деревÑнный нагрудник +Wood Leggings=деревÑнные штаны +Wood Boots=деревÑнные ботинки diff --git a/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr b/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr new file mode 100644 index 00000000..56b08a08 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/armor_wood.sv.tr @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet=Trähjälm +Wood Chestplate=Träbröstplatta +Wood Leggings=Träbyxor +Wood Boots=Trästövlar diff --git a/mods/3d_armor/armor_wood/locale/template.txt b/mods/3d_armor/armor_wood/locale/template.txt new file mode 100644 index 00000000..88934d38 --- /dev/null +++ b/mods/3d_armor/armor_wood/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: armor_wood +Wood Helmet= +Wood Chestplate= +Wood Leggings= +Wood Boots= diff --git a/mods/3d_armor/armor_wood/mod.conf b/mods/3d_armor/armor_wood/mod.conf new file mode 100644 index 00000000..2155fa3c --- /dev/null +++ b/mods/3d_armor/armor_wood/mod.conf @@ -0,0 +1,3 @@ +name = armor_wood +depends = 3d_armor +description = Adds craftable wood armor. diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_boots_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_boots_wood_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_chestplate_wood_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_helmet_wood_preview.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_boots_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_chestplate_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_helmet_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_inv_leggings_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png rename to mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood.png diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png b/mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png similarity index 100% rename from mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png rename to mods/3d_armor/armor_wood/textures/3d_armor_leggings_wood_preview.png diff --git a/mods/3d_armor/cc-by-sa-3.0.txt b/mods/3d_armor/cc-by-sa-3.0.txt new file mode 100644 index 00000000..604209a8 --- /dev/null +++ b/mods/3d_armor/cc-by-sa-3.0.txt @@ -0,0 +1,359 @@ +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at https://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at https://creativecommons.org/. diff --git a/mods/3d_armor/description.txt b/mods/3d_armor/description.txt deleted file mode 100644 index 2da5ba4d..00000000 --- a/mods/3d_armor/description.txt +++ /dev/null @@ -1 +0,0 @@ -Visible player armor & wielded items. diff --git a/mods/3d_armor/lgpl-2.1.md b/mods/3d_armor/lgpl-2.1.md new file mode 100644 index 00000000..4c337f0b --- /dev/null +++ b/mods/3d_armor/lgpl-2.1.md @@ -0,0 +1,503 @@ +# GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +## Preamble + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public Licenses +are intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + +When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there +is no warranty for the free library. Also, if the library is modified +by someone else and passed on, the recipients should know that what +they have is not the original version, so that the original author's +reputation will not be affected by problems that might be introduced +by others. + +Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + +When a program is linked with a library, whether statically or using a +shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + +We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + +Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +**0.** This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). Each +licensee is addressed as "you". + +A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does and +what the program that uses the Library does. + +**1.** You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a +fee. + +**2.** You may modify your copy or copies of the Library or any +portion of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +- **a)** The modified work must itself be a software library. +- **b)** You must cause the files modified to carry prominent + notices stating that you changed the files and the date of + any change. +- **c)** You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. +- **d)** If a facility in the modified Library refers to a function + or a table of data to be supplied by an application program that + uses the facility, other than as an argument passed when the + facility is invoked, then you must make a good faith effort to + ensure that, in the event an application does not supply such + function or table, the facility still operates, and performs + whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of + the application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +**3.** You may opt to apply the terms of the ordinary GNU General +Public License instead of this License to a given copy of the Library. +To do this, you must alter all the notices that refer to this License, +so that they refer to the ordinary GNU General Public License, version +2, instead of to this License. (If a newer version than version 2 of +the ordinary GNU General Public License has appeared, then you can +specify that version instead if you wish.) Do not make any other +change in these notices. + +Once this change is made in a given copy, it is irreversible for that +copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the +Library into a program that is not a library. + +**4.** You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from +a designated place, then offering equivalent access to copy the source +code from the same place satisfies the requirement to distribute the +source code, even though third parties are not compelled to copy the +source along with the object code. + +**5.** A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a work, +in isolation, is not a derivative work of the Library, and therefore +falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. Section +6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure +layouts and accessors, and small macros and small inline functions +(ten lines or less in length), then the use of the object file is +unrestricted, regardless of whether it is legally a derivative work. +(Executables containing this object code plus portions of the Library +will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +**6.** As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a work +containing portions of the Library, and distribute that work under +terms of your choice, provided that the terms permit modification of +the work for the customer's own use and reverse engineering for +debugging such modifications. + +You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +- **a)** Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood that + the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) +- **b)** Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (1) uses at run time + a copy of the library already present on the user's computer + system, rather than copying library functions into the executable, + and (2) will operate properly with a modified version of the + library, if the user installs one, as long as the modified version + is interface-compatible with the version that the work was + made with. +- **c)** Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. +- **d)** If distribution of the work is made by offering access to + copy from a designated place, offer equivalent access to copy the + above specified materials from the same place. +- **e)** Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + +It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +**7.** You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +- **a)** Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other + library facilities. This must be distributed under the terms of + the Sections above. +- **b)** Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + +**8.** You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +**9.** You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +**10.** Each time you redistribute the Library (or any work based on +the Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + +**11.** If, as a consequence of a court judgment or allegation of +patent infringement or for any other reason (not limited to patent +issues), conditions are imposed on you (whether by court order, +agreement or otherwise) that contradict the conditions of this +License, they do not excuse you from the conditions of this License. +If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, +then as a consequence you may not distribute the Library at all. For +example, if a patent license would not permit royalty-free +redistribution of the Library by all those who receive copies directly +or indirectly through you, then the only way you could satisfy both it +and this License would be to refrain entirely from distribution of the +Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +**12.** If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +**13.** The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. Such +new versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +**14.** If you wish to incorporate parts of the Library into other +free programs whose distribution conditions are incompatible with +these, write to the author to ask for permission. For software which +is copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +**NO WARRANTY** + +**15.** BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**16.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + +## How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It +is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + one line to give the library's name and an idea of what it does. + Copyright (C) year name of author + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper +mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in + the library `Frob' (a library for tweaking knobs) written + by James Random Hacker. + + signature of Ty Coon, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/3d_armor/modpack.conf b/mods/3d_armor/modpack.conf index bf746c51..9fa2a905 100644 --- a/mods/3d_armor/modpack.conf +++ b/mods/3d_armor/modpack.conf @@ -1 +1,3 @@ +name = 3d_armor +title = 3D Armor description = Visible player armor & wielded items. diff --git a/mods/3d_armor/settingtypes.txt b/mods/3d_armor/settingtypes.txt index 3606dcd6..cd7750e0 100644 --- a/mods/3d_armor/settingtypes.txt +++ b/mods/3d_armor/settingtypes.txt @@ -13,10 +13,6 @@ armor_material_nether (Enable nether armor) bool true # Increase this if you get initialization glitches when a player first joins. armor_init_delay (Initialization delay) int 2 -# Number of initialization attempts. -# Use in conjunction with armor_init_delay if initialization problems persist. -armor_init_times (Initialization attempts) int 10 - # Increase this if armor is not getting into bones due to server lag. armor_bones_delay (Delay for bones) int 1 diff --git a/mods/3d_armor/shields/LICENSE.txt b/mods/3d_armor/shields/LICENSE.txt deleted file mode 100644 index 1f848593..00000000 --- a/mods/3d_armor/shields/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -[mod] Shields [shields] -======================= - -License Source Code -------------------- - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -License Textures ----------------- - -Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0 diff --git a/mods/3d_armor/shields/depends.txt b/mods/3d_armor/shields/depends.txt deleted file mode 100644 index 585cc7aa..00000000 --- a/mods/3d_armor/shields/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -3d_armor diff --git a/mods/3d_armor/shields/description.txt b/mods/3d_armor/shields/description.txt deleted file mode 100644 index cb378bbf..00000000 --- a/mods/3d_armor/shields/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds visible shields to 3d armor. diff --git a/mods/3d_armor/shields/init.lua b/mods/3d_armor/shields/init.lua index 63b4e22e..3b2b43cf 100644 --- a/mods/3d_armor/shields/init.lua +++ b/mods/3d_armor/shields/init.lua @@ -328,8 +328,8 @@ if armor.materials.mithril then armor:register_armor("shields:shield_mithril", { description = S("Mithril Shield"), inventory_image = "shields_inv_shield_mithril.png", - groups = {armor_shield=1, armor_heal=12, armor_use=100}, - armor_groups = {fleshy=15}, + groups = {armor_shield=1, armor_heal=13, armor_use=66}, + armor_groups = {fleshy=16}, damage_groups = {cracky=2, snappy=1, level=3}, reciprocate_damage = true, on_damage = function(player, index, stack) diff --git a/mods/3d_armor/shields/locale/shields.de.tr b/mods/3d_armor/shields/locale/shields.de.tr index 341563cc..7f86b4d6 100644 --- a/mods/3d_armor/shields/locale/shields.de.tr +++ b/mods/3d_armor/shields/locale/shields.de.tr @@ -1,17 +1,13 @@ # textdomain: shields - - -### init.lua ### - Admin Shield=Adminschild -Bronze Shield=Bronzeschild +Wooden Shield=Holzschild +Enhanced Wood Shield=Verstärkter Holzschild Cactus Shield=Kaktusschild -Crystal Shield=Kristallschild -Nether Shield=Netherschild +Enhanced Cactus Shield=Verstärkter Kaktusschild +Steel Shield=Stahlschild +Bronze Shield=Bronzeschild Diamond Shield=Diamantschild -Enhanced Cactus Shield=verbessert Kaktusschild -Enhanced Wood Shield=verbessert Holzschild Gold Shield=Goldschild Mithril Shield=Mithrilschild -Steel Shield=Stahlschild -Wooden Shield=Holzschild +Crystal Shield=Kristallschild +Nether Shield=Netherschild diff --git a/mods/3d_armor/shields/locale/shields.eo.tr b/mods/3d_armor/shields/locale/shields.eo.tr new file mode 100644 index 00000000..02de4e9e --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.eo.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Administra Åœildo +Wooden Shield=Ligna Åœildo +Enhanced Wood Shield=Plibonigita Ligna Åœildo +Cactus Shield=Kakta Åœildo +Enhanced Cactus Shield=Plibonigita Kakta Åœildo +Steel Shield=Åœtala Åœildo +Bronze Shield=Bronza Åœildo +Diamond Shield=Diamanta Åœildo +Gold Shield=Ora Åœildo +Mithril Shield=Mitrila Åœildo +Crystal Shield=Kristala Åœildo +Nether Shield=Inferna Åœildo diff --git a/mods/3d_armor/shields/locale/shields.es.tr b/mods/3d_armor/shields/locale/shields.es.tr new file mode 100644 index 00000000..962f130f --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.es.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Escudo de admin +Wooden Shield=Escudo de madera +Enhanced Wood Shield=Escudo de madera mejorado +Cactus Shield=Escudo de cactus +Enhanced Cactus Shield=Escudo de cactus mejorado +Steel Shield=Escudo de acero +Bronze Shield=Escudo de bronce +Diamond Shield=Escudo de diamante +Gold Shield=Escudo de oro +Mithril Shield=Escudo de mitrilo +Crystal Shield=Escudo de cristal +Nether Shield=Escudo de nether diff --git a/mods/3d_armor/shields/locale/shields.fr.tr b/mods/3d_armor/shields/locale/shields.fr.tr index 081c794d..5c76e992 100644 --- a/mods/3d_armor/shields/locale/shields.fr.tr +++ b/mods/3d_armor/shields/locale/shields.fr.tr @@ -1,17 +1,13 @@ # textdomain: shields - - -### init.lua ### - Admin Shield=Bouclier d'admin -Bronze Shield=Bouclier en bronze -Cactus Shield=Bouclier en cactus -Crystal Shield=Bouclier en cristal -Nether Shield=Bouclier en nether -Diamond Shield=Bouclier en diamant -Enhanced Cactus Shield=Bouclier en cactus amélioré +Wooden Shield=Bouclier en bois Enhanced Wood Shield=Bouclier en bois amélioré +Cactus Shield=Bouclier en cactus +Enhanced Cactus Shield=Bouclier en cactus amélioré +Steel Shield=Bouclier en acier +Bronze Shield=Bouclier en bronze +Diamond Shield=Bouclier en diamant Gold Shield=Bouclier en or Mithril Shield=Bouclier en mithril -Steel Shield=Bouclier en acier -Wooden Shield=Bouclier en bois +Crystal Shield=Bouclier en cristal +Nether Shield=Bouclier en nether diff --git a/mods/3d_armor/shields/locale/shields.pt_BR.tr b/mods/3d_armor/shields/locale/shields.pt_BR.tr new file mode 100644 index 00000000..26515cc6 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Escudo de Administrador +Wooden Shield=Escudo de Madeira +Enhanced Wood Shield=Escudo de Madeira Encantado +Cactus Shield=Escudo de Cacto +Enhanced Cactus Shield=Escude de Cacto Encantado +Steel Shield=Escudo de Aço +Bronze Shield=Escudo de Bronze +Diamond Shield=Escudo de Diamante +Gold Shield=Escudo de Ouro +Mithril Shield=Escudo de Mithril +Crystal Shield=Escudo de Cristal +Nether Shield=Escudo de Nether diff --git a/mods/3d_armor/shields/locale/shields.ru.tr b/mods/3d_armor/shields/locale/shields.ru.tr new file mode 100755 index 00000000..9e80ce64 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.ru.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=щит админа +Wooden Shield=деревÑнный щит +Enhanced Wood Shield=уÑиленный деревÑнный щит +Cactus Shield=кактуÑовый щит +Enhanced Cactus Shield=уÑиленный кактуÑовый щит +Steel Shield=Ñтальной щит +Bronze Shield=бронзовый щит +Diamond Shield=алмазный щит +Gold Shield=золотой щит +Mithril Shield=мифриловый щит +Crystal Shield=криÑтальный щит +Nether Shield=адÑкий щит diff --git a/mods/3d_armor/shields/locale/shields.sv.tr b/mods/3d_armor/shields/locale/shields.sv.tr new file mode 100644 index 00000000..fb14f539 --- /dev/null +++ b/mods/3d_armor/shields/locale/shields.sv.tr @@ -0,0 +1,13 @@ +# textdomain: shields +Admin Shield=Adminsköld +Wooden Shield=Träsköld +Enhanced Wood Shield=Förbättrad träsköld +Cactus Shield=Kaktussköld +Enhanced Cactus Shield=Förbättrad kaktussköld +Steel Shield=StÃ¥lsköld +Bronze Shield=Bronssköld +Diamond Shield=Diamantsköld +Gold Shield=Guldsköld +Mithril Shield=Mithrilsköld +Crystal Shield=Kristallsköld +Nether Shield=Nethersköld diff --git a/mods/3d_armor/shields/locale/template.txt b/mods/3d_armor/shields/locale/template.txt index 9c30ca79..1b39fd68 100644 --- a/mods/3d_armor/shields/locale/template.txt +++ b/mods/3d_armor/shields/locale/template.txt @@ -1,17 +1,13 @@ # textdomain: shields - - -### init.lua ### - Admin Shield= -Bronze Shield= -Cactus Shield= -Crystal Shield= -Nether Shield= -Diamond Shield= -Enhanced Cactus Shield= +Wooden Shield= Enhanced Wood Shield= +Cactus Shield= +Enhanced Cactus Shield= +Steel Shield= +Bronze Shield= +Diamond Shield= Gold Shield= Mithril Shield= -Steel Shield= -Wooden Shield= +Crystal Shield= +Nether Shield= diff --git a/mods/3d_armor/wieldview/LICENSE.txt b/mods/3d_armor/wieldview/LICENSE.txt deleted file mode 100644 index e1552c06..00000000 --- a/mods/3d_armor/wieldview/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -[mod] visible wielded items [wieldview] -======================================= - -Copyright (C) 2012-2019 stujones11, Stuart Jones - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/mods/3d_armor/wieldview/depends.txt b/mods/3d_armor/wieldview/depends.txt deleted file mode 100644 index b6cac219..00000000 --- a/mods/3d_armor/wieldview/depends.txt +++ /dev/null @@ -1 +0,0 @@ -3d_armor diff --git a/mods/3d_armor/wieldview/description.txt b/mods/3d_armor/wieldview/description.txt deleted file mode 100644 index 0d51ad95..00000000 --- a/mods/3d_armor/wieldview/description.txt +++ /dev/null @@ -1 +0,0 @@ -Makes hand wielded items visible to other players. diff --git a/mods/3d_armor/wieldview/get_texture.lua b/mods/3d_armor/wieldview/get_texture.lua new file mode 100644 index 00000000..1c84f16b --- /dev/null +++ b/mods/3d_armor/wieldview/get_texture.lua @@ -0,0 +1,215 @@ +local f = string.format + +local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") +if not node_tiles then + node_tiles = false + minetest.settings:set("wieldview_node_tiles", "false") +end + +-- https://github.com/minetest/minetest/blob/9fc018ded10225589d2559d24a5db739e891fb31/doc/lua_api.txt#L453-L462 +local function escape_texture(texturestring) + -- store in a variable so we don't return both rvs of gsub + local v = texturestring:gsub("%^", "\\^"):gsub(":", "\\:") + return v +end + +local function memoize(func) + local memo = {} + return function(arg) + if arg == nil then + return func(arg) + end + local rv = memo[arg] + + if not rv then + rv = func(arg) + memo[arg] = rv + end + + return rv + end +end + +local function is_vertical_frames(animation) + return ( + animation.type == "vertical_frames" and + animation.aspect_w and + animation.aspect_h + ) +end + +local function get_single_frame(animation, image_name) + return ("[combine:%ix%i^[noalpha^[colorize:#FFF:255^[mask:%s"):format( + animation.aspect_w, + animation.aspect_h, + image_name + ) +end + +local function is_sheet_2d(animation) + return ( + animation.type == "sheet_2d" and + animation.frames_w and + animation.frames_h + ) +end + +local function get_sheet_2d(animation, image_name) + return ("%s^[sheet:%ix%i:0,0"):format( + image_name, + animation.frames_w, + animation.frames_h + ) +end + +local get_image_from_tile = memoize(function(tile) + if type(tile) == "string" then + return tile + + elseif type(tile) == "table" then + local image_name + + if type(tile.image) == "string" then + image_name = tile.image + + elseif type(tile.name) == "string" then + image_name = tile.name + + end + + if image_name then + local animation = tile.animation + if animation then + if is_vertical_frames(animation) then + return get_single_frame(animation, image_name) + + elseif is_sheet_2d(animation) then + return get_sheet_2d(animation, image_name) + end + end + + return image_name + end + end + + return "blank.png" +end) + +local function get_image_cube(tiles) + if #tiles >= 6 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[6] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 5 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[5] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 4 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[4] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 3 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png"), + get_image_from_tile(tiles[3] or "no_texture.png") + ) + + elseif #tiles == 2 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[2] or "no_texture.png"), + get_image_from_tile(tiles[2] or "no_texture.png") + ) + + elseif #tiles == 1 then + return minetest.inventorycube( + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[1] or "no_texture.png"), + get_image_from_tile(tiles[1] or "no_texture.png") + ) + end + + return "blank.png" +end + +local function is_normal_node(drawtype) + return ( + drawtype == "normal" or + drawtype == "allfaces" or + drawtype == "allfaces_optional" or + drawtype == "glasslike" or + drawtype == "glasslike_framed" or + drawtype == "glasslike_framed_optional" or + drawtype == "liquid" + ) +end + +armor.get_wield_image = memoize(function(item) + item = ItemStack(item) + + if item:is_empty() then + return "blank.png" + end + + local def = item:get_definition() + if not def then + return "unknown_item.png" + end + + local meta = item:get_meta() + local color = meta:get("color") or def.color + + local image = "blank.png" + + if def.wield_image and def.wield_image ~= "" then + local parts = {def.wield_image} + if color then + parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color)) + end + if def.wield_overlay then + parts[#parts + 1] = def.wield_overlay + end + image = table.concat(parts, "^") + + elseif def.inventory_image and def.inventory_image ~= "" then + local parts = {def.inventory_image} + if color then + parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color)) + end + if def.inventory_overlay then + parts[#parts + 1] = def.inventory_overlay + end + image = table.concat(parts, "^") + + elseif def.type == "node" then + if def.drawtype == "nodebox" or def.drawtype == "mesh" then + image = "blank.png" + + else + local tiles = def.tiles + if type(tiles) == "string" then + image = get_image_from_tile(tiles) + + elseif type(tiles) == "table" then + if is_normal_node(def.drawtype) and node_tiles then + image = get_image_cube(tiles) + + else + image = get_image_from_tile(tiles[1]) + end + end + end + end + + return image +end) diff --git a/mods/3d_armor/wieldview/init.lua b/mods/3d_armor/wieldview/init.lua index 6397d049..80bb9cff 100644 --- a/mods/3d_armor/wieldview/init.lua +++ b/mods/3d_armor/wieldview/init.lua @@ -4,31 +4,20 @@ if not update_time then update_time = 2 minetest.settings:set("wieldview_update_time", tostring(update_time)) end -local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") -if not node_tiles then - node_tiles = false - minetest.settings:set("wieldview_node_tiles", "false") -end wieldview = { wielded_item = {}, transform = {}, } +dofile(minetest.get_modpath(minetest.get_current_modname()).."/get_texture.lua") dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") wieldview.get_item_texture = function(self, item) - local texture = "3d_armor_trans.png" + local texture = "blank.png" if item ~= "" then - if minetest.registered_items[item] then - if minetest.registered_items[item].inventory_image ~= "" then - texture = minetest.registered_items[item].inventory_image - elseif node_tiles == true and minetest.registered_items[item].tiles - and type(minetest.registered_items[item].tiles[1]) == "string" - and minetest.registered_items[item].tiles[1] ~= "" then - texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) - end - end + texture = armor.get_wield_image(item) + -- Get item image transformation, first from group, then from transform.lua local transform = minetest.get_item_group(item, "wieldview_transform") if transform == 0 then diff --git a/mods/Minetest-WorldEdit/.luacheckrc b/mods/Minetest-WorldEdit/.luacheckrc new file mode 100644 index 00000000..e9f95fc1 --- /dev/null +++ b/mods/Minetest-WorldEdit/.luacheckrc @@ -0,0 +1,28 @@ +read_globals = { + "minetest", "VoxelArea", "ItemStack", + "unified_inventory", "sfinv", "smart_inventory", "inventory_plus", + "dump", + + table = {fields = {"copy", "indexof", "insert_all"}}, + vector = {fields = { + -- as of 5.0 + "new", "direction", "distance", "length", "normalize", "floor", "round", + "apply", "equals", "sort", "add", "subtract", "multiply", "divide", + -- polyfilled + "copy" + }}, +} +globals = {"worldedit"} + +-- Ignore these errors until someone decides to fix them +ignore = {"212", "213", "411", "412", "421", "422", "431", "432", "631"} + +files["worldedit/common.lua"] = { + globals = {"vector"}, +} +files["worldedit/test"] = { + read_globals = {"testnode1", "testnode2", "testnode3", "area", "check", "place_pattern"}, +} +files["worldedit/test/init.lua"] = { + globals = {"testnode1", "testnode2", "testnode3", "area", "check", "place_pattern"}, +} diff --git a/mods/Minetest-WorldEdit/.util/run_tests.sh b/mods/Minetest-WorldEdit/.util/run_tests.sh index 5cbc15ec..e596dda7 100755 --- a/mods/Minetest-WorldEdit/.util/run_tests.sh +++ b/mods/Minetest-WorldEdit/.util/run_tests.sh @@ -1,29 +1,41 @@ #!/bin/bash -tempdir=/tmp/mt +tempdir=$(mktemp -d) confpath=$tempdir/minetest.conf worldpath=$tempdir/world +trap 'rm -rf "$tempdir"' EXIT -use_docker=y -[ -x ../../bin/minetestserver ] && use_docker= +[ -f worldedit/mod.conf ] || { echo "Must be run in modpack root folder." >&2; exit 1; } -rm -rf $tempdir -mkdir -p $worldpath -# the docker image doesn't have devtest -[ -n "$use_docker" ] || printf '%s\n' gameid=devtest >$worldpath/world.mt +mtserver= +if [ "$1" == "--docker" ]; then + command -v docker >/dev/null || { echo "Docker is not installed." >&2; exit 1; } + [ -d minetest_game ] || echo "A source checkout of minetest_game was not found. This can fail if your docker image does not ship a game." >&2; +else + mtserver=$(command -v minetestserver) + [[ -z "$mtserver" && -x ../../bin/minetestserver ]] && mtserver=../../bin/minetestserver + [ -z "$mtserver" ] && { echo "To run the test outside of Docker, an installation of minetestserver is required." >&2; exit 1; } +fi + +mkdir $worldpath printf '%s\n' mg_name=singlenode '[end_of_params]' >$worldpath/map_meta.txt printf '%s\n' worldedit_run_tests=true max_forceloaded_blocks=9999 >$confpath -if [ -n "$use_docker" ]; then +if [ -z "$mtserver" ]; then chmod -R 777 $tempdir - docker run --rm -i \ - -v $confpath:/etc/minetest/minetest.conf \ - -v $tempdir:/var/lib/minetest/.minetest \ - -v "$PWD/worldedit":/var/lib/minetest/.minetest/world/worldmods/worldedit \ - registry.gitlab.com/minetest/minetest/server:${MINETEST_VER} + [ -z "$DOCKER_IMAGE" ] && DOCKER_IMAGE="ghcr.io/minetest/minetest:master" + vol=( + -v "$confpath":/etc/minetest/minetest.conf + -v "$tempdir":/var/lib/minetest/.minetest + -v "$PWD/worldedit":/var/lib/minetest/.minetest/world/worldmods/worldedit + ) + [ -d minetest_game ] && vol+=( + -v "$PWD/minetest_game":/var/lib/minetest/.minetest/games/minetest_game + ) + docker run --rm -i "${vol[@]}" "$DOCKER_IMAGE" else mkdir $worldpath/worldmods ln -s "$PWD/worldedit" $worldpath/worldmods/worldedit - ../../bin/minetestserver --config $confpath --world $worldpath --logfile /dev/null + $mtserver --config "$confpath" --world "$worldpath" --logfile /dev/null fi test -f $worldpath/tests_ok || exit 1 diff --git a/mods/Minetest-WorldEdit/ChatCommands.md b/mods/Minetest-WorldEdit/ChatCommands.md index 1d3b4e9b..1b7a1c04 100644 --- a/mods/Minetest-WorldEdit/ChatCommands.md +++ b/mods/Minetest-WorldEdit/ChatCommands.md @@ -409,14 +409,15 @@ Load nodes from "(world folder)/schems/``.we" with position 1 of the curre ### `//lua ` -Executes `` as a Lua chunk in the global namespace. +Executes `` as a Lua chunk in the global namespace with the variables `name`, `player` and `pos` (= player position) available. - //lua worldedit.pos1["singleplayer"] = {x=0, y=0, z=0} - //lua worldedit.rotate(worldedit.pos1["singleplayer"], worldedit.pos2["singleplayer"], "y", 90) + //lua worldedit.pos1[name] = vector.new(0, 0, 0) + //lua worldedit.rotate(worldedit.pos1["jones"], worldedit.pos2["jones"], "y", 90) + //lua player:set_pos(worldedit.pos2[name]) ### `//luatransform ` -Executes `` as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region. +Executes `` as a Lua chunk in the global namespace with the variable `pos` available, for each node in the current WorldEdit region. //luatransform minetest.swap_node(pos, {name="default:stone"}) //luatransform if minetest.get_node(pos).name == "air" then minetest.add_node(pos, {name="default:water_source"}) end @@ -428,11 +429,12 @@ Save the current WorldEdit region using the Minetest Schematic format to "(world //mtschemcreate some random filename //mtschemcreate huge_base -### `//mtschemplace ` +### `//mtschemplace [rotation]` Load nodes from "(world folder)/schems/``.mts" with position 1 of the current WorldEdit region as the origin. +Valid values for `[rotation]` are 0, 90, 180 and 270. - //mtschemplace some random filename + //mtschemplace a_tree 270 //mtschemplace huge_base ### `//mtschemprob start/finish/get` diff --git a/mods/Minetest-WorldEdit/README.md b/mods/Minetest-WorldEdit/README.md index d377902d..69ca93ad 100644 --- a/mods/Minetest-WorldEdit/README.md +++ b/mods/Minetest-WorldEdit/README.md @@ -2,7 +2,7 @@ WorldEdit v1.3 ============== The ultimate in-game world editing tool for [Minetest](http://minetest.net/)! Tons of functionality to help with building, fixing, and more. -For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?id=572) at the Minetest forums. +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=572) at the Minetest forums. # New users should see the [tutorial](Tutorial.md). diff --git a/mods/Minetest-WorldEdit/WorldEdit API.md b/mods/Minetest-WorldEdit/WorldEdit API.md index fc9cf652..ae27f417 100644 --- a/mods/Minetest-WorldEdit/WorldEdit API.md +++ b/mods/Minetest-WorldEdit/WorldEdit API.md @@ -227,11 +227,19 @@ Code ---- Contained in code.lua, this module allows arbitrary Lua code to be used with WorldEdit. -### error = worldedit.lua(code) +### error = worldedit.lua(code, name) -Executes `code` as a Lua chunk in the global namespace. +the given code gets encapsulated into a function with parameters `name`, `player`, `pos` +where + * `name` is a playername or `nil` + * `player` is the player object of the above player if applicable, otherwise `nil` + * `pos` is the position of the aforementioned player (if applicable, otherwise `nil`) rounded to integers -Returns an error if the code fails or nil otherwise. +the resulting function is then executed as a Lua chunk in the global namespace. + +The return is + * a string in case of an error + * a tuple of `nil` and return of the function converted to a string in case of success ### error = worldedit.luatransform(pos1, pos2, code) diff --git a/mods/Minetest-WorldEdit/modpack.conf b/mods/Minetest-WorldEdit/modpack.conf index 4d9e6f56..450e010e 100644 --- a/mods/Minetest-WorldEdit/modpack.conf +++ b/mods/Minetest-WorldEdit/modpack.conf @@ -1,2 +1,3 @@ name = Minetest-WorldEdit description = WorldEdit is an in-game world editor. Use it to repair griefing, or just create awesome buildings in seconds. +min_minetest_version = 5.0 diff --git a/mods/Minetest-WorldEdit/settingtypes.txt b/mods/Minetest-WorldEdit/settingtypes.txt new file mode 100644 index 00000000..99ca1bc6 --- /dev/null +++ b/mods/Minetest-WorldEdit/settingtypes.txt @@ -0,0 +1,4 @@ +# For operations that potentially affect more than the specified amount of nodes +# WorldEdit will require additional confirmation via //y before proceeding. +# Set to 0 to disable the confirmation in all cases. +worldedit_safe_region_limit (Limit for safe region warning) int 20000 diff --git a/mods/Minetest-WorldEdit/worldedit/code.lua b/mods/Minetest-WorldEdit/worldedit/code.lua index a939debb..0765e841 100644 --- a/mods/Minetest-WorldEdit/worldedit/code.lua +++ b/mods/Minetest-WorldEdit/worldedit/code.lua @@ -2,17 +2,29 @@ -- @module worldedit.code --- Executes `code` as a Lua chunk in the global namespace. --- @return An error message if the code fails, or nil on success. -function worldedit.lua(code) - local func, err = loadstring(code) - if not func then -- Syntax error +-- the code will be encapsulated into a function with parameters +-- * name (the name of the player issuing the //lua command) +-- * player (the player object of the player) +-- * pos (the position of the player rounded to integers) +-- @return string in case of error, tuple of nil, return of code as string in case of success +function worldedit.lua(code, name) + local factory, err = loadstring("return function(name, player, pos)\n" .. code .. "\nend") + if not factory then -- Syntax error return err end - local good, err = pcall(func) - if not good then -- Runtime error - return err + local func = factory() + local player, pos + if name then + player = minetest.get_player_by_name(name) + if player then + pos = vector.round(player:get_pos()) + end end - return nil + local good, err = pcall(func, name, player, pos) + if not good then -- Runtime error + return tostring(err) + end + return nil, dump(err) end @@ -31,7 +43,7 @@ function worldedit.luatransform(pos1, pos2, code) worldedit.keep_loaded(pos1, pos2) - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) while pos.x <= pos2.x do pos.y = pos1.y while pos.y <= pos2.y do @@ -39,7 +51,7 @@ function worldedit.luatransform(pos1, pos2, code) while pos.z <= pos2.z do local good, err = pcall(func, pos) if not good then -- Runtime error - return err + return tostring(err) end pos.z = pos.z + 1 end diff --git a/mods/Minetest-WorldEdit/worldedit/common.lua b/mods/Minetest-WorldEdit/worldedit/common.lua index 9a2215dd..8289f66e 100644 --- a/mods/Minetest-WorldEdit/worldedit/common.lua +++ b/mods/Minetest-WorldEdit/worldedit/common.lua @@ -1,12 +1,21 @@ --- Common functions [INTERNAL]. All of these functions are internal! -- @module worldedit.common +-- Polyfill for vector.copy (added in 5.5.0) +if not vector.copy then + local vnew = vector.new + vector.copy = function(v) + return vnew(v.x, v.y, v.z) + end +end + + --- Copies and modifies positions `pos1` and `pos2` so that each component of -- `pos1` is less than or equal to the corresponding component of `pos2`. -- Returns the new positions. function worldedit.sort_pos(pos1, pos2) - pos1 = {x=pos1.x, y=pos1.y, z=pos1.z} - pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} + pos1 = vector.copy(pos1) + pos2 = vector.copy(pos2) if pos1.x > pos2.x then pos2.x, pos1.x = pos1.x, pos2.x end @@ -45,12 +54,22 @@ function worldedit.get_axis_others(axis) end +-- Create a vmanip and read the area from map, this causes all +-- MapBlocks to be loaded into memory synchronously. +-- This doesn't actually *keep* them loaded, unlike the name implies. function worldedit.keep_loaded(pos1, pos2) - -- Create a vmanip and read the area from map, this - -- causes all MapBlocks to be loaded into memory. - -- This doesn't actually *keep* them loaded, unlike the name implies. - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos2) + -- rough estimate, a MapNode is 4 bytes in the engine + if worldedit.volume(pos1, pos2) > 268400000 then + print("[WorldEdit] Requested to load an area bigger than 1GB, refusing. The subsequent operation may fail.") + return + end + if minetest.load_area then + -- same effect but without unnecessary data copying + minetest.load_area(pos1, pos2) + else + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos1, pos2) + end end @@ -65,7 +84,7 @@ function mh.get_empty_data(area) -- only partially modified aren't overwriten. local data = {} local c_ignore = minetest.get_content_id("ignore") - for i = 1, worldedit.volume(area.MinEdge, area.MaxEdge) do + for i = 1, area:getVolume() do data[i] = c_ignore end return data @@ -117,3 +136,72 @@ function mh.finish(manip, data) manip:update_map() end + +-- returns an iterator that returns voxelarea indices for a hollow cuboid +function mh.iter_hollowcuboid(area, minx, miny, minz, maxx, maxy, maxz) + local i = area:index(minx, miny, minz) - 1 + local xrange = maxx - minx + 1 + local nextaction = i + 1 + xrange + local do_hole = false + + local y = 0 + local ydiff = maxy - miny + local ystride = area.ystride + local ymultistride = ydiff * ystride + + local z = 0 + local zdiff = maxz - minz + local zstride = area.zstride + local zcorner = true + + return function() + -- continue i until it needs to jump ystride + i = i + 1 + if i ~= nextaction then + return i + end + + -- add the x offset if y (and z) are not 0 or maxy (or maxz) + if do_hole then + do_hole = false + i = i + xrange - 2 + nextaction = i + 1 + return i + end + + -- continue y until maxy is exceeded + y = y+1 + if y ~= ydiff + 1 then + i = i + ystride - xrange + if zcorner + or y == ydiff then + nextaction = i + xrange + else + nextaction = i + 1 + do_hole = true + end + return i + end + + -- continue z until maxz is exceeded + z = z+1 + if z == zdiff + 1 then + -- hollowcuboid finished, return nil + return + end + + -- set i to index(minx, miny, minz + z) - 1 + i = i + zstride - (ymultistride + xrange) + zcorner = z == zdiff + + -- y is 0, so traverse the xs + y = 0 + nextaction = i + xrange + return i + end +end + +function mh.iterp_hollowcuboid(area, minp, maxp) + return mh.iter_hollowcuboid(area, minp.x, minp.y, minp.z, + maxp.x, maxp.y, maxp.z) +end diff --git a/mods/Minetest-WorldEdit/worldedit/compatibility.lua b/mods/Minetest-WorldEdit/worldedit/compatibility.lua index c989a058..e0bd5ea7 100644 --- a/mods/Minetest-WorldEdit/worldedit/compatibility.lua +++ b/mods/Minetest-WorldEdit/worldedit/compatibility.lua @@ -24,11 +24,14 @@ function worldedit.metasave(pos1, pos2, filename) return count end -function worldedit.metaload(originpos, filename) +function worldedit.metaload(originpos, file_name) deprecated("load") - filename = minetest.get_worldpath() .. "/schems/" .. file .. ".wem" - local file, err = io.open(filename, "wb") - if err then return 0 end + local file_path = minetest.get_worldpath() .. + "/schems/" .. file_name .. ".wem" + local file, err = io.open(file_path, "wb") + if err then + return 0 + end local data = file:read("*a") return worldedit.deserialize(originpos, data) end diff --git a/mods/Minetest-WorldEdit/worldedit/cuboid.lua b/mods/Minetest-WorldEdit/worldedit/cuboid.lua index d27e2333..5c52747b 100644 --- a/mods/Minetest-WorldEdit/worldedit/cuboid.lua +++ b/mods/Minetest-WorldEdit/worldedit/cuboid.lua @@ -2,16 +2,16 @@ worldedit.cuboid_volumetric_expand = function(name, amount) local pos1 = worldedit.pos1[name] local pos2 = worldedit.pos2[name] - + if pos1 == nil or pos2 == nil then return false, "Undefined cuboid" end - + local delta1 = vector.new() local delta2 = vector.new() local delta_dir1 local delta_dir2 - + delta1 = vector.add(delta1, amount) delta2 = vector.add(delta2, amount) delta_dir1, delta_dir2 = worldedit.get_expansion_directions(pos1, pos2) @@ -19,7 +19,7 @@ worldedit.cuboid_volumetric_expand = function(name, amount) delta2 = vector.multiply(delta2, delta_dir2) worldedit.pos1[name] = vector.add(pos1, delta1) worldedit.pos2[name] = vector.add(pos2, delta2) - + return true end @@ -28,18 +28,18 @@ end worldedit.cuboid_linear_expand = function(name, axis, direction, amount) local pos1 = worldedit.pos1[name] local pos2 = worldedit.pos2[name] - + if pos1 == nil or pos2 == nil then return false, "undefined cuboid" end - + if direction ~= 1 and direction ~= -1 then return false, "invalid marker" end - + local marker = worldedit.marker_get_closest_to_axis(name, axis, direction) local deltavect = vector.new() - + if axis == 'x' then deltavect.x = amount * direction elseif axis == 'y' then @@ -49,7 +49,7 @@ worldedit.cuboid_linear_expand = function(name, axis, direction, amount) else return false, "invalid axis" end - + worldedit.marker_move(name, marker, deltavect) return true end @@ -59,11 +59,13 @@ end worldedit.cuboid_shift = function(name, axis, amount) local pos1 = worldedit.pos1[name] local pos2 = worldedit.pos2[name] - + if pos1 == nil or pos2 == nil then return false, "undefined cuboid" end - + + assert(not rawequal(pos1, pos2)) -- vectors must not alias + if axis == 'x' then worldedit.pos1[name].x = pos1.x + amount worldedit.pos2[name].x = pos2.x + amount @@ -76,7 +78,7 @@ worldedit.cuboid_shift = function(name, axis, amount) else return false, "invalid axis" end - + return true end @@ -86,7 +88,7 @@ worldedit.marker_move = function(name, marker, deltavector) if marker ~= 1 and marker ~= 2 then return false end - + if marker == 1 then local pos = worldedit.pos1[name] worldedit.pos1[name] = vector.add(deltavector, pos) @@ -94,7 +96,7 @@ worldedit.marker_move = function(name, marker, deltavector) local pos = worldedit.pos2[name] worldedit.pos2[name] = vector.add(deltavector, pos) end - + return true end @@ -134,10 +136,11 @@ end -- Return the marker that is closest to the player worldedit.marker_get_closest_to_player = function(name) - local playerpos = minetest.get_player_by_name(name):get_pos() + local player = assert(minetest.get_player_by_name(name)) + local playerpos = player:get_pos() local dist1 = vector.distance(playerpos, worldedit.pos1[name]) local dist2 = vector.distance(playerpos, worldedit.pos2[name]) - + if dist1 < dist2 then return 1 else @@ -150,7 +153,7 @@ end worldedit.marker_get_closest_to_axis = function(name, axis, direction) local pos1 = vector.new() local pos2 = vector.new() - + if direction ~= 1 and direction ~= -1 then return nil end @@ -185,20 +188,20 @@ worldedit.marker_get_closest_to_axis = function(name, axis, direction) end --- Translates up, down, left, right, front, back to their corresponding axes and +-- Translates up, down, left, right, front, back to their corresponding axes and -- directions according to faced direction worldedit.translate_direction = function(name, direction) local axis, dir = worldedit.player_axis(name) local resaxis, resdir - + if direction == "up" then return 'y', 1 end - + if direction == "down" then return 'y', -1 end - + if direction == "front" then if axis == "y" then resaxis = nil @@ -208,7 +211,7 @@ worldedit.translate_direction = function(name, direction) resdir = dir end end - + if direction == "back" then if axis == "y" then resaxis = nil @@ -218,7 +221,7 @@ worldedit.translate_direction = function(name, direction) resdir = -dir end end - + if direction == "left" then if axis == 'x' then resaxis = 'z' @@ -228,7 +231,7 @@ worldedit.translate_direction = function(name, direction) resdir = -dir end end - + if direction == "right" then if axis == 'x' then resaxis = 'z' @@ -238,6 +241,6 @@ worldedit.translate_direction = function(name, direction) resdir = dir end end - + return resaxis, resdir end diff --git a/mods/Minetest-WorldEdit/worldedit/init.lua b/mods/Minetest-WorldEdit/worldedit/init.lua index 4f0f2c19..dab89032 100644 --- a/mods/Minetest-WorldEdit/worldedit/init.lua +++ b/mods/Minetest-WorldEdit/worldedit/init.lua @@ -27,6 +27,7 @@ end dofile(path .. "/common.lua") load_module(path .. "/manipulations.lua") load_module(path .. "/primitives.lua") +load_module(path .. "/transformations.lua") load_module(path .. "/visualization.lua") load_module(path .. "/serialization.lua") load_module(path .. "/code.lua") @@ -39,6 +40,6 @@ if minetest.settings:get_bool("log_mods") then end if minetest.settings:get_bool("worldedit_run_tests") then - dofile(path .. "/test.lua") + dofile(path .. "/test/init.lua") minetest.after(0, worldedit.run_tests) end diff --git a/mods/Minetest-WorldEdit/worldedit/manipulations.lua b/mods/Minetest-WorldEdit/worldedit/manipulations.lua index 54dc8885..73d02425 100644 --- a/mods/Minetest-WorldEdit/worldedit/manipulations.lua +++ b/mods/Minetest-WorldEdit/worldedit/manipulations.lua @@ -98,51 +98,6 @@ function worldedit.replace(pos1, pos2, search_node, replace_node, inverse) end -local function deferred_execution(next_one, finished) - -- Allocate 100% of server step for execution (might lag a little) - local allocated_usecs = - tonumber(minetest.settings:get("dedicated_server_step")) * 1000000 - local function f() - local deadline = minetest.get_us_time() + allocated_usecs - repeat - local is_done = next_one() - if is_done then - if finished then - finished() - end - return - end - until minetest.get_us_time() >= deadline - minetest.after(0, f) - end - f() -end - ---- Duplicates a region `amount` times with offset vector `direction`. --- Stacking is spread across server steps. --- @return The number of nodes stacked. -function worldedit.stack2(pos1, pos2, direction, amount, finished) - -- Protect arguments from external changes during execution - pos1 = table.copy(pos1) - pos2 = table.copy(pos2) - direction = table.copy(direction) - - local i = 0 - local translated = {x=0, y=0, z=0} - local function step() - translated.x = translated.x + direction.x - translated.y = translated.y + direction.y - translated.z = translated.z + direction.z - worldedit.copy2(pos1, pos2, translated) - i = i + 1 - return i >= amount - end - deferred_execution(step, finished) - - return worldedit.volume(pos1, pos2) * amount -end - - --- Copies a region along `axis` by `amount` nodes. -- @param pos1 -- @param pos2 @@ -155,7 +110,7 @@ function worldedit.copy(pos1, pos2, axis, amount) -- Decide if we need to copy stuff backwards (only applies to metadata) local backwards = amount > 0 and amount < (pos2[axis] - pos1[axis] + 1) - local off = {x=0, y=0, z=0} + local off = vector.new() off[axis] = amount return worldedit.copy2(pos1, pos2, off, backwards) end @@ -170,7 +125,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) local src_manip, src_area = mh.init(pos1, pos2) - local src_stride = {x=1, y=src_area.ystride, z=src_area.zstride} + local src_stride = vector.new(1, src_area.ystride, src_area.zstride) local src_offset = vector.subtract(pos1, src_area.MinEdge) local dpos1 = vector.add(pos1, off) @@ -178,7 +133,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) local dim = vector.add(vector.subtract(pos2, pos1), 1) local dst_manip, dst_area = mh.init(dpos1, dpos2) - local dst_stride = {x=1, y=dst_area.ystride, z=dst_area.zstride} + local dst_stride = vector.new(1, dst_area.ystride, dst_area.zstride) local dst_offset = vector.subtract(dpos1, dst_area.MinEdge) local function do_copy(src_data, dst_data) @@ -217,8 +172,6 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) dst_manip:set_param2_data(dst_data) mh.finish(dst_manip) - src_data = nil - dst_data = nil -- Copy metadata local get_meta = minetest.get_meta @@ -226,7 +179,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) for z = dim.z-1, 0, -1 do for y = dim.y-1, 0, -1 do for x = dim.x-1, 0, -1 do - local pos = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z} + local pos = vector.new(pos1.x+x, pos1.y+y, pos1.z+z) local meta = get_meta(pos):to_table() pos = vector.add(pos, off) get_meta(pos):from_table(meta) @@ -237,7 +190,7 @@ function worldedit.copy2(pos1, pos2, off, meta_backwards) for z = 0, dim.z-1 do for y = 0, dim.y-1 do for x = 0, dim.x-1 do - local pos = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z} + local pos = vector.new(pos1.x+x, pos1.y+y, pos1.z+z) local meta = get_meta(pos):to_table() pos = vector.add(pos, off) get_meta(pos):from_table(meta) @@ -286,21 +239,21 @@ function worldedit.move(pos1, pos2, axis, amount) end -- Copy stuff to new location - local off = {x=0, y=0, z=0} + local off = vector.new() off[axis] = amount worldedit.copy2(pos1, pos2, off, backwards) -- Nuke old area if not overlap then - nuke_area({x=0, y=0, z=0}, dim) + nuke_area(vector.new(), dim) else -- Source and destination region are overlapping, which means we can't -- blindly delete the [pos1, pos2] area local leftover = vector.new(dim) -- size of the leftover slice leftover[axis] = math.abs(amount) if amount > 0 then - nuke_area({x=0, y=0, z=0}, leftover) + nuke_area(vector.new(), leftover) else - local top = {x=0, y=0, z=0} -- offset of the leftover slice from pos1 + local top = vector.new() -- offset of the leftover slice from pos1 top[axis] = dim[axis] - math.abs(amount) nuke_area(top, leftover) end @@ -309,316 +262,6 @@ function worldedit.move(pos1, pos2, axis, amount) return worldedit.volume(pos1, pos2) end ---- Duplicates a region along `axis` `amount` times. --- Stacking is spread across server steps. --- @param pos1 --- @param pos2 --- @param axis Axis direction, "x", "y", or "z". --- @param count --- @return The number of nodes stacked. -function worldedit.stack(pos1, pos2, axis, count, finished) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - local length = pos2[axis] - pos1[axis] + 1 - if count < 0 then - count = -count - length = -length - end - - local i, distance = 0, 0 - local function step() - distance = distance + length - worldedit.copy(pos1, pos2, axis, distance) - i = i + 1 - return i >= count - end - deferred_execution(step, finished) - - return worldedit.volume(pos1, pos2) * count -end - - ---- Stretches a region by a factor of positive integers along the X, Y, and Z --- axes, respectively, with `pos1` as the origin. --- @param pos1 --- @param pos2 --- @param stretch_x Amount to stretch along X axis. --- @param stretch_y Amount to stretch along Y axis. --- @param stretch_z Amount to stretch along Z axis. --- @return The number of nodes scaled. --- @return The new scaled position 1. --- @return The new scaled position 2. -function worldedit.stretch(pos1, pos2, stretch_x, stretch_y, stretch_z) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - -- Prepare schematic of large node - local get_node, get_meta, place_schematic = minetest.get_node, - minetest.get_meta, minetest.place_schematic - local placeholder_node = {name="", param1=255, param2=0} - local nodes = {} - for i = 1, stretch_x * stretch_y * stretch_z do - nodes[i] = placeholder_node - end - local schematic = {size={x=stretch_x, y=stretch_y, z=stretch_z}, data=nodes} - - local size_x, size_y, size_z = stretch_x - 1, stretch_y - 1, stretch_z - 1 - - local new_pos2 = { - x = pos1.x + (pos2.x - pos1.x) * stretch_x + size_x, - y = pos1.y + (pos2.y - pos1.y) * stretch_y + size_y, - z = pos1.z + (pos2.z - pos1.z) * stretch_z + size_z, - } - worldedit.keep_loaded(pos1, new_pos2) - - local pos = {x=pos2.x, y=0, z=0} - local big_pos = {x=0, y=0, z=0} - while pos.x >= pos1.x do - pos.y = pos2.y - while pos.y >= pos1.y do - pos.z = pos2.z - while pos.z >= pos1.z do - local node = get_node(pos) -- Get current node - local meta = get_meta(pos):to_table() -- Get meta of current node - - -- Calculate far corner of the big node - local pos_x = pos1.x + (pos.x - pos1.x) * stretch_x - local pos_y = pos1.y + (pos.y - pos1.y) * stretch_y - local pos_z = pos1.z + (pos.z - pos1.z) * stretch_z - - -- Create large node - placeholder_node.name = node.name - placeholder_node.param2 = node.param2 - big_pos.x, big_pos.y, big_pos.z = pos_x, pos_y, pos_z - place_schematic(big_pos, schematic) - - -- Fill in large node meta - if next(meta.fields) ~= nil or next(meta.inventory) ~= nil then - -- Node has meta fields - for x = 0, size_x do - for y = 0, size_y do - for z = 0, size_z do - big_pos.x = pos_x + x - big_pos.y = pos_y + y - big_pos.z = pos_z + z - -- Set metadata of new node - get_meta(big_pos):from_table(meta) - end - end - end - end - pos.z = pos.z - 1 - end - pos.y = pos.y - 1 - end - pos.x = pos.x - 1 - end - return worldedit.volume(pos1, pos2) * stretch_x * stretch_y * stretch_z, pos1, new_pos2 -end - - ---- Transposes a region between two axes. --- @return The number of nodes transposed. --- @return The new transposed position 1. --- @return The new transposed position 2. -function worldedit.transpose(pos1, pos2, axis1, axis2) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - local compare - local extent1, extent2 = pos2[axis1] - pos1[axis1], pos2[axis2] - pos1[axis2] - - if extent1 > extent2 then - compare = function(extent1, extent2) - return extent1 > extent2 - end - else - compare = function(extent1, extent2) - return extent1 < extent2 - end - end - - -- Calculate the new position 2 after transposition - local new_pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} - new_pos2[axis1] = pos1[axis1] + extent2 - new_pos2[axis2] = pos1[axis2] + extent1 - - local upper_bound = {x=pos2.x, y=pos2.y, z=pos2.z} - if upper_bound[axis1] < new_pos2[axis1] then upper_bound[axis1] = new_pos2[axis1] end - if upper_bound[axis2] < new_pos2[axis2] then upper_bound[axis2] = new_pos2[axis2] end - worldedit.keep_loaded(pos1, upper_bound) - - local pos = {x=pos1.x, y=0, z=0} - local get_node, get_meta, set_node = minetest.get_node, - minetest.get_meta, minetest.set_node - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2] - if compare(extent1, extent2) then -- Transpose only if below the diagonal - local node1 = get_node(pos) - local meta1 = get_meta(pos):to_table() - local value1, value2 = pos[axis1], pos[axis2] -- Save position values - pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1 -- Swap axis extents - local node2 = get_node(pos) - local meta2 = get_meta(pos):to_table() - set_node(pos, node1) - get_meta(pos):from_table(meta1) - pos[axis1], pos[axis2] = value1, value2 -- Restore position values - set_node(pos, node2) - get_meta(pos):from_table(meta2) - end - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return worldedit.volume(pos1, pos2), pos1, new_pos2 -end - - ---- Flips a region along `axis`. --- @return The number of nodes flipped. -function worldedit.flip(pos1, pos2, axis) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - worldedit.keep_loaded(pos1, pos2) - - --- TODO: Flip the region slice by slice along the flip axis using schematic method. - local pos = {x=pos1.x, y=0, z=0} - local start = pos1[axis] + pos2[axis] - pos2[axis] = pos1[axis] + math.floor((pos2[axis] - pos1[axis]) / 2) - local get_node, get_meta, set_node = minetest.get_node, - minetest.get_meta, minetest.set_node - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local node1 = get_node(pos) - local meta1 = get_meta(pos):to_table() - local value = pos[axis] -- Save position - pos[axis] = start - value -- Shift position - local node2 = get_node(pos) - local meta2 = get_meta(pos):to_table() - set_node(pos, node1) - get_meta(pos):from_table(meta1) - pos[axis] = value -- Restore position - set_node(pos, node2) - get_meta(pos):from_table(meta2) - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return worldedit.volume(pos1, pos2) -end - - ---- Rotates a region clockwise around an axis. --- @param pos1 --- @param pos2 --- @param axis Axis ("x", "y", or "z"). --- @param angle Angle in degrees (90 degree increments only). --- @return The number of nodes rotated. --- @return The new first position. --- @return The new second position. -function worldedit.rotate(pos1, pos2, axis, angle) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - local other1, other2 = worldedit.get_axis_others(axis) - angle = angle % 360 - - local count - if angle == 90 then - worldedit.flip(pos1, pos2, other1) - count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) - elseif angle == 180 then - worldedit.flip(pos1, pos2, other1) - count = worldedit.flip(pos1, pos2, other2) - elseif angle == 270 then - worldedit.flip(pos1, pos2, other2) - count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) - else - error("Only 90 degree increments are supported!") - end - return count, pos1, pos2 -end - - ---- Rotates all oriented nodes in a region clockwise around the Y axis. --- @param pos1 --- @param pos2 --- @param angle Angle in degrees (90 degree increments only). --- @return The number of nodes oriented. -function worldedit.orient(pos1, pos2, angle) - local pos1, pos2 = worldedit.sort_pos(pos1, pos2) - local registered_nodes = minetest.registered_nodes - - local wallmounted = { - [90] = {0, 1, 5, 4, 2, 3, 0, 0}, - [180] = {0, 1, 3, 2, 5, 4, 0, 0}, - [270] = {0, 1, 4, 5, 3, 2, 0, 0} - } - local facedir = { - [90] = { 1, 2, 3, 0, 13, 14, 15, 12, 17, 18, 19, 16, - 9, 10, 11, 8, 5, 6, 7, 4, 23, 20, 21, 22}, - [180] = { 2, 3, 0, 1, 10, 11, 8, 9, 6, 7, 4, 5, - 18, 19, 16, 17, 14, 15, 12, 13, 22, 23, 20, 21}, - [270] = { 3, 0, 1, 2, 19, 16, 17, 18, 15, 12, 13, 14, - 7, 4, 5, 6, 11, 8, 9, 10, 21, 22, 23, 20} - } - - angle = angle % 360 - if angle == 0 then - return 0 - end - if angle % 90 ~= 0 then - error("Only 90 degree increments are supported!") - end - local wallmounted_substitution = wallmounted[angle] - local facedir_substitution = facedir[angle] - - worldedit.keep_loaded(pos1, pos2) - - local count = 0 - local get_node, swap_node = minetest.get_node, minetest.swap_node - local pos = {x=pos1.x, y=0, z=0} - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local node = get_node(pos) - local def = registered_nodes[node.name] - if def then - local paramtype2 = def.paramtype2 - if paramtype2 == "wallmounted" or - paramtype2 == "colorwallmounted" then - local orient = node.param2 % 8 - node.param2 = node.param2 - orient + - wallmounted_substitution[orient + 1] - swap_node(pos, node) - count = count + 1 - elseif paramtype2 == "facedir" or - paramtype2 == "colorfacedir" then - local orient = node.param2 % 32 - node.param2 = node.param2 - orient + - facedir_substitution[orient + 1] - swap_node(pos, node) - count = count + 1 - end - end - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return count -end - --- Attempts to fix the lighting in a region. -- @return The number of nodes updated. @@ -646,17 +289,16 @@ function worldedit.clear_objects(pos1, pos2) return false end local entity = obj:get_luaentity() - return not entity or not entity.name:find("^worldedit:") + return not (entity and entity.name:find("^worldedit:")) end -- Offset positions to include full nodes (positions are in the center of nodes) - local pos1x, pos1y, pos1z = pos1.x - 0.5, pos1.y - 0.5, pos1.z - 0.5 - local pos2x, pos2y, pos2z = pos2.x + 0.5, pos2.y + 0.5, pos2.z + 0.5 + pos1 = vector.add(pos1, -0.5) + pos2 = vector.add(pos2, 0.5) local count = 0 if minetest.get_objects_in_area then - local objects = minetest.get_objects_in_area({x=pos1x, y=pos1y, z=pos1z}, - {x=pos2x, y=pos2y, z=pos2z}) + local objects = minetest.get_objects_in_area(pos1, pos2) for _, obj in pairs(objects) do if should_delete(obj) then @@ -670,21 +312,22 @@ function worldedit.clear_objects(pos1, pos2) -- Fallback implementation via get_objects_inside_radius -- Center of region local center = { - x = pos1x + ((pos2x - pos1x) / 2), - y = pos1y + ((pos2y - pos1y) / 2), - z = pos1z + ((pos2z - pos1z) / 2) + x = pos1.x + ((pos2.x - pos1.x) / 2), + y = pos1.y + ((pos2.y - pos1.y) / 2), + z = pos1.z + ((pos2.z - pos1.z) / 2) } -- Bounding sphere radius local radius = math.sqrt( - (center.x - pos1x) ^ 2 + - (center.y - pos1y) ^ 2 + - (center.z - pos1z) ^ 2) - for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do + (center.x - pos1.x) ^ 2 + + (center.y - pos1.y) ^ 2 + + (center.z - pos1.z) ^ 2) + local objects = minetest.get_objects_inside_radius(center, radius) + for _, obj in pairs(objects) do if should_delete(obj) then local pos = obj:get_pos() - if pos.x >= pos1x and pos.x <= pos2x and - pos.y >= pos1y and pos.y <= pos2y and - pos.z >= pos1z and pos.z <= pos2z then + if pos.x >= pos1.x and pos.x <= pos2.x and + pos.y >= pos1.y and pos.y <= pos2.y and + pos.z >= pos1.z and pos.z <= pos2.z then -- Inside region obj:remove() count = count + 1 @@ -693,4 +336,3 @@ function worldedit.clear_objects(pos1, pos2) end return count end - diff --git a/mods/Minetest-WorldEdit/worldedit/primitives.lua b/mods/Minetest-WorldEdit/worldedit/primitives.lua index 0a7d1756..07b175c3 100644 --- a/mods/Minetest-WorldEdit/worldedit/primitives.lua +++ b/mods/Minetest-WorldEdit/worldedit/primitives.lua @@ -14,31 +14,26 @@ local mh = worldedit.manip_helpers -- @return The number of nodes added. function worldedit.cube(pos, width, height, length, node_name, hollow) -- Set up voxel manipulator - local basepos = vector.subtract(pos, {x=math.floor(width/2), y=0, z=math.floor(length/2)}) - local manip, area = mh.init(basepos, vector.add(basepos, {x=width, y=height, z=length})) + local basepos = vector.subtract(pos, + vector.new(math.floor(width / 2), 0, math.floor(length / 2))) + local endpos = vector.add(basepos, + vector.new(width - 1, height - 1, length - 1)) + local manip, area = mh.init(basepos, endpos) local data = mh.get_empty_data(area) -- Add cube local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset = vector.subtract(basepos, area.MinEdge) local count = 0 + local iterfunc + if hollow then + iterfunc = mh.iterp_hollowcuboid(area, basepos, endpos) + else + iterfunc = area:iterp(basepos, endpos) + end - for z = 0, length-1 do - local index_z = (offset.z + z) * stride.z + 1 -- +1 for 1-based indexing - for y = 0, height-1 do - local index_y = index_z + (offset.y + y) * stride.y - for x = 0, width-1 do - local is_wall = z == 0 or z == length-1 - or y == 0 or y == height-1 - or x == 0 or x == width-1 - if not hollow or is_wall then - local i = index_y + (offset.x + x) - data[i] = node_id - count = count + 1 - end - end - end + for vi in iterfunc do + data[vi] = node_id + count = count + 1 end mh.finish(manip, data) @@ -149,7 +144,7 @@ function worldedit.cylinder(pos, axis, length, radius1, radius2, node_name, holl end -- Handle negative lengths - local current_pos = {x=pos.x, y=pos.y, z=pos.z} + local current_pos = vector.new(pos) if length < 0 then length = -length current_pos[axis] = current_pos[axis] - length @@ -162,12 +157,8 @@ function worldedit.cylinder(pos, axis, length, radius1, radius2, node_name, holl -- Add desired shape (anything inbetween cylinder & cone) local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset = { - x = current_pos.x - area.MinEdge.x, - y = current_pos.y - area.MinEdge.y, - z = current_pos.z - area.MinEdge.z, - } + local stride = vector.new(1, area.ystride, area.zstride) + local offset = vector.subtract(current_pos, area.MinEdge) local count = 0 for i = 0, length - 1 do -- Calulate radius for this "height" in the cylinder @@ -225,12 +216,8 @@ function worldedit.pyramid(pos, axis, height, node_name, hollow) -- Add pyramid local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset = { - x = pos.x - area.MinEdge.x, - y = pos.y - area.MinEdge.y, - z = pos.z - area.MinEdge.z, - } + local stride = vector.new(1, area.ystride, area.zstride) + local offset = vector.subtract(pos, area.MinEdge) local size = math.abs(height * step) local count = 0 -- For each level of the pyramid @@ -242,8 +229,8 @@ function worldedit.pyramid(pos, axis, height, node_name, hollow) for index3 = -size, size do local i = new_index2 + (index3 + offset[other2]) * stride[other2] if (not hollow or size - math.abs(index2) < 2 or size - math.abs(index3) < 2) then - data[i] = node_id - count = count + 1 + data[i] = node_id + count = count + 1 end end end @@ -271,9 +258,9 @@ function worldedit.spiral(pos, length, height, spacer, node_name) -- Set up variables local node_id = minetest.get_content_id(node_name) - local stride = {x=1, y=area.ystride, z=area.zstride} - local offset_x, offset_y, offset_z = pos.x - area.MinEdge.x, pos.y - area.MinEdge.y, pos.z - area.MinEdge.z - local i = offset_z * stride.z + offset_y * stride.y + offset_x + 1 + local stride = vector.new(1, area.ystride, area.zstride) + local offset = vector.subtract(pos, area.MinEdge) + local i = offset.z * stride.z + offset.y * stride.y + offset.x + 1 -- Add first column local count = height diff --git a/mods/Minetest-WorldEdit/worldedit/serialization.lua b/mods/Minetest-WorldEdit/worldedit/serialization.lua index 0b3cc4b5..ea01fd1e 100644 --- a/mods/Minetest-WorldEdit/worldedit/serialization.lua +++ b/mods/Minetest-WorldEdit/worldedit/serialization.lua @@ -66,7 +66,7 @@ function worldedit.serialize(pos1, pos2) has_meta[hash_node_position(meta_positions[i])] = true end - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) local count = 0 local result = {} while pos.x <= pos2.x do @@ -114,12 +114,15 @@ function worldedit.serialize(pos1, pos2) return LATEST_SERIALIZATION_HEADER .. result, count end --- Contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) --- by ChillCode, available under the MIT license. local function deserialize_workaround(content) - local nodes + local nodes, err if not minetest.global_exists("jit") then - nodes = minetest.deserialize(content, true) + nodes, err = minetest.deserialize(content, true) + elseif not content:match("^%s*return%s*{") then + -- The data doesn't look like we expect it to so we can't apply the workaround. + -- hope for the best + minetest.log("warning", "WorldEdit: deserializing data but can't apply LuaJIT workaround") + nodes, err = minetest.deserialize(content, true) else -- XXX: This is a filthy hack that works surprisingly well -- in LuaJIT, `minetest.deserialize` will fail due to the register limit @@ -129,18 +132,27 @@ local function deserialize_workaround(content) local escaped = content:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end) local startpos, startpos1 = 1, 1 local endpos + local entry while true do -- go through each individual node entry (except the last) - startpos, endpos = escaped:find("},%s*{", startpos) + startpos, endpos = escaped:find("}%s*,%s*{", startpos) if not startpos then break end local current = content:sub(startpos1, startpos) - local entry = minetest.deserialize("return " .. current, true) + entry, err = minetest.deserialize("return " .. current, true) + if not entry then + break + end table.insert(nodes, entry) startpos, startpos1 = endpos, endpos end - local entry = minetest.deserialize("return " .. content:sub(startpos1), true) -- process the last entry - table.insert(nodes, entry) + if not err then + entry = minetest.deserialize("return " .. content:sub(startpos1), true) -- process the last entry + table.insert(nodes, entry) + end + end + if err then + minetest.log("warning", "WorldEdit: deserialize: " .. err) end return nodes end @@ -148,7 +160,7 @@ end --- Loads the schematic in `value` into a node list in the latest format. -- @return A node list in the latest format, or nil on failure. local function load_schematic(value) - local version, header, content = worldedit.read_header(value) + local version, _, content = worldedit.read_header(value) local nodes = {} if version == 1 or version == 2 then -- Original flat table format local tables = minetest.deserialize(content, true) @@ -223,9 +235,7 @@ function worldedit.allocate_with_nodes(origin_pos, nodes) if y > pos2y then pos2y = y end if z > pos2z then pos2z = z end end - local pos1 = {x=pos1x, y=pos1y, z=pos1z} - local pos2 = {x=pos2x, y=pos2y, z=pos2z} - return pos1, pos2, #nodes + return vector.new(pos1x, pos1y, pos1z), vector.new(pos2x, pos2y, pos2z), #nodes end @@ -240,14 +250,16 @@ function worldedit.deserialize(origin_pos, value) worldedit.keep_loaded(pos1, pos2) local origin_x, origin_y, origin_z = origin_pos.x, origin_pos.y, origin_pos.z - local count = 0 local add_node, get_meta = minetest.add_node, minetest.get_meta + local registered_nodes = minetest.registered_nodes for i, entry in ipairs(nodes) do - entry.x, entry.y, entry.z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z - -- Entry acts as both position and node - add_node(entry, entry) - if entry.meta then - get_meta(entry):from_table(entry.meta) + if registered_nodes[entry.name] then + entry.x, entry.y, entry.z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z + -- Entry acts as both position and node + add_node(entry, entry) + if entry.meta then + get_meta(entry):from_table(entry.meta) + end end end return #nodes diff --git a/mods/Minetest-WorldEdit/worldedit/test.lua b/mods/Minetest-WorldEdit/worldedit/test/init.lua similarity index 70% rename from mods/Minetest-WorldEdit/worldedit/test.lua rename to mods/Minetest-WorldEdit/worldedit/test/init.lua index 70627326..32d30c96 100644 --- a/mods/Minetest-WorldEdit/worldedit/test.lua +++ b/mods/Minetest-WorldEdit/worldedit/test/init.lua @@ -1,7 +1,8 @@ +-- TODO: don't shit individual variables into the globals + --------------------- -- Helpers --------------------- - local vec = vector.new local vecw = function(axis, n, base) local ret = vec(base) @@ -16,9 +17,9 @@ local set_node = minetest.set_node -- Nodes --------------------- local air = "air" -local testnode1 -local testnode2 -local testnode3 +rawset(_G, "testnode1", "") +rawset(_G, "testnode2", "") +rawset(_G, "testnode3", "") -- Loads nodenames to use for tests local function init_nodes() testnode1 = minetest.registered_aliases["mapgen_stone"] @@ -27,7 +28,7 @@ local function init_nodes() assert(testnode1 and testnode2 and testnode3) end -- Writes repeating pattern into given area -local function place_pattern(pos1, pos2, pattern) +rawset(_G, "place_pattern", function(pos1, pos2, pattern) local pos = vec() local node = {name=""} local i = 1 @@ -43,14 +44,14 @@ local function place_pattern(pos1, pos2, pattern) end end end -end +end) --------------------- -- Area management --------------------- assert(minetest.get_mapgen_setting("mg_name") == "singlenode") -local area = {} +rawset(_G, "area", {}) do local areamin, areamax local off @@ -71,6 +72,9 @@ do end -- Reset area contents and state area.clear = function() + if off and vector.equals(off, vec(0, 0, 0)) then + return + end local vmanip = minetest.get_voxel_manip(areamin, areamax) local vpos1, vpos2 = vmanip:get_emerged_area() local vcount = (vpos2.x - vpos1.x + 1) * (vpos2.y - vpos1.y + 1) * (vpos2.z - vpos1.z + 1) @@ -87,10 +91,10 @@ do -- Returns an usable area [pos1, pos2] that does not overlap previous ones area.get = function(sizex, sizey, sizez) local size - if sizey == nil or sizez == nil then - size = {x=sizex, y=sizex, z=sizex} + if sizey == nil and sizez == nil then + size = vec(sizex, sizex, sizex) else - size = {x=sizex, y=sizey, z=sizez} + size = vec(sizex, sizey, sizez) end local pos1 = vector.add(areamin, off) local pos2 = vector.subtract(vector.add(pos1, size), 1) @@ -148,7 +152,7 @@ end --------------------- -- Checks --------------------- -local check = {} +rawset(_G, "check", {}) -- Check that all nodes in [pos1, pos2] are the node(s) specified check.filled = function(pos1, pos2, nodes) if type(nodes) == "string" then @@ -215,7 +219,7 @@ end -- The actual tests --------------------- local tests = {} -local function register_test(name, func, opts) +worldedit.register_test = function(name, func, opts) assert(type(name) == "string") assert(func == nil or type(func) == "function") if not opts then @@ -227,6 +231,7 @@ local function register_test(name, func, opts) opts.func = func table.insert(tests, opts) end +local register_test = worldedit.register_test -- How this works: -- register_test registers a test with a name and function -- The function should return if the test passes or otherwise cause a Lua error @@ -241,8 +246,8 @@ end register_test("Internal self-test") register_test("is area loaded?", function() local pos1, _ = area.get(1) - assert(get_node(pos1).name == "air") -end, {dry=true}) + assert(get_node(pos1).name == air) +end) register_test("area.split", function() for i = 2, 6 do @@ -255,7 +260,7 @@ register_test("area.split", function() assert((half1.z - pos1.z) == (pos2.z - half2.z)) -- divided equally end end -end, {dry=true}) +end) register_test("check.filled", function() local pos1, pos2 = area.get(1, 2, 1) @@ -276,118 +281,49 @@ register_test("pattern", function() end) -register_test("Generic node manipulations") -register_test("worldedit.set", function() - local pos1, pos2 = area.get(10) - local m = area.margin(1) +for _, name in ipairs({ + "manipulations", "primitives", "schematic" +}) do + dofile(minetest.get_modpath("worldedit") .. "/test/" .. name .. ".lua") +end - worldedit.set(pos1, pos2, testnode1) - check.filled(pos1, pos2, testnode1) - check.filled2(m, air) +register_test("Code") +register_test("worldedit.lua", function() + -- syntax error + local err, ret = worldedit.lua("?") + assert(ret == nil) + assert(err:find("unexpected symbol")) + + -- runtime error + local err, ret = worldedit.lua("error(1234)") + assert(ret == nil) + assert(err:find("1234")) + + -- normal operation + local err, ret = worldedit.lua("return name..tostring(player == nil)..tostring(pos == nil)", "nobody") + assert(err == nil) + assert(ret == "\"nobodytruetrue\"") end) -register_test("worldedit.set mix", function() - local pos1, pos2 = area.get(10) - local m = area.margin(1) +register_test("worldedit.luatransform", function() + local pos1, pos2 = area.get(2) - worldedit.set(pos1, pos2, {testnode1, testnode2}) + -- syntax error + local err = worldedit.luatransform(pos1, pos2, "?") + assert(err:find("unexpected symbol")) - check.filled(pos1, pos2, {testnode1, testnode2}) - check.filled2(m, air) + -- runtime error + local err = worldedit.luatransform(pos1, pos2, "error(2345)") + assert(err:find("2345")) + + -- normal operation + local err = worldedit.luatransform(pos1, pos2, + "minetest.swap_node(pos, {name=" .. ("%q"):format(testnode1) .. "})") + assert(err == nil) + check.filled(pos1, pos1, testnode1) end) -register_test("worldedit.replace", function() - local pos1, pos2 = area.get(10) - local half1, half2 = area.split(pos1, pos2) - - worldedit.set(pos1, half1, testnode1) - worldedit.set(half2, pos2, testnode2) - worldedit.replace(pos1, pos2, testnode1, testnode3) - - check.not_filled(pos1, pos2, testnode1) - check.filled(pos1, half1, testnode3) - check.filled(half2, pos2, testnode2) -end) - -register_test("worldedit.replace inverse", function() - local pos1, pos2 = area.get(10) - local half1, half2 = area.split(pos1, pos2) - - worldedit.set(pos1, half1, testnode1) - worldedit.set(half2, pos2, testnode2) - worldedit.replace(pos1, pos2, testnode1, testnode3, true) - - check.filled(pos1, half1, testnode1) - check.filled(half2, pos2, testnode3) -end) - --- FIXME?: this one looks overcomplicated -register_test("worldedit.copy", function() - local pos1, pos2 = area.get(4) - local axis, n = area.dir(2) - local m = area.margin(1) - local b = pos1[axis] - - -- create one slice with testnode1, one with testnode2 - worldedit.set(pos1, vecw(axis, b + 1, pos2), testnode1) - worldedit.set(vecw(axis, b + 2, pos1), pos2, testnode2) - worldedit.copy(pos1, pos2, axis, n) - - -- should have three slices now - check.filled(pos1, vecw(axis, b + 1, pos2), testnode1) - check.filled(vecw(axis, b + 2, pos1), pos2, testnode1) - check.filled(vecw(axis, b + 4, pos1), vector.add(pos2, vecw(axis, n)), testnode2) - check.filled2(m, "air") -end) - -register_test("worldedit.copy2", function() - local pos1, pos2 = area.get(6) - local m1 = area.margin(1) - local pos1_, pos2_ = area.get(6) - local m2 = area.margin(1) - - local pattern = {testnode1, testnode2, testnode3, testnode1, testnode2} - place_pattern(pos1, pos2, pattern) - worldedit.copy2(pos1, pos2, vector.subtract(pos1_, pos1)) - - check.pattern(pos1, pos2, pattern) - check.pattern(pos1_, pos2_, pattern) - check.filled2(m1, "air") - check.filled2(m2, "air") -end) - -register_test("worldedit.move (overlap)", function() - local pos1, pos2 = area.get(7) - local axis, n = area.dir(2) - local m = area.margin(1) - - local pattern = {testnode2, testnode1, testnode2, testnode3, testnode3} - place_pattern(pos1, pos2, pattern) - worldedit.move(pos1, pos2, axis, n) - - check.filled(pos1, vecw(axis, pos1[axis] + n - 1, pos2), "air") - check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) - check.filled2(m, "air") -end) - -register_test("worldedit.move", function() - local pos1, pos2 = area.get(10) - local axis, n = area.dir(10) - local m = area.margin(1) - - local pattern = {testnode1, testnode3, testnode3, testnode2} - place_pattern(pos1, pos2, pattern) - worldedit.move(pos1, pos2, axis, n) - - check.filled(pos1, pos2, "air") - check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) - check.filled2(m, "air") -end) - --- TODO: the rest (also testing param2 + metadata) - - --------------------- -- Main function --------------------- @@ -406,7 +342,7 @@ worldedit.run_tests = function() for x = 0, math.floor(wanted.x/16) do for y = 0, math.floor(wanted.y/16) do for z = 0, math.floor(wanted.z/16) do - assert(minetest.forceload_block({x=x*16, y=y*16, z=z*16}, true)) + assert(minetest.forceload_block(vec(x*16, y*16, z*16), true, -1)) end end end @@ -418,9 +354,7 @@ worldedit.run_tests = function() local s = "---- " .. test.name .. " " print(s .. string.rep("-", 60 - #s)) else - if not test.dry then - area.clear() - end + area.clear() local ok, err = pcall(test.func) print(string.format("%-60s %s", test.name, ok and "pass" or "FAIL")) if not ok then diff --git a/mods/Minetest-WorldEdit/worldedit/test/manipulations.lua b/mods/Minetest-WorldEdit/worldedit/test/manipulations.lua new file mode 100644 index 00000000..10368a30 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/test/manipulations.lua @@ -0,0 +1,121 @@ +--------------------- +local vec = vector.new +local vecw = function(axis, n, base) + local ret = vec(base) + ret[axis] = n + return ret +end +local air = "air" +--------------------- + + +worldedit.register_test("Generic node manipulations") +worldedit.register_test("worldedit.set", function() + local pos1, pos2 = area.get(10) + local m = area.margin(1) + + worldedit.set(pos1, pos2, testnode1) + + check.filled(pos1, pos2, testnode1) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.set mix", function() + local pos1, pos2 = area.get(10) + local m = area.margin(1) + + worldedit.set(pos1, pos2, {testnode1, testnode2}) + + check.filled(pos1, pos2, {testnode1, testnode2}) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.replace", function() + local pos1, pos2 = area.get(10) + local half1, half2 = area.split(pos1, pos2) + + worldedit.set(pos1, half1, testnode1) + worldedit.set(half2, pos2, testnode2) + worldedit.replace(pos1, pos2, testnode1, testnode3) + + check.not_filled(pos1, pos2, testnode1) + check.filled(pos1, half1, testnode3) + check.filled(half2, pos2, testnode2) +end) + +worldedit.register_test("worldedit.replace inverse", function() + local pos1, pos2 = area.get(10) + local half1, half2 = area.split(pos1, pos2) + + worldedit.set(pos1, half1, testnode1) + worldedit.set(half2, pos2, testnode2) + worldedit.replace(pos1, pos2, testnode1, testnode3, true) + + check.filled(pos1, half1, testnode1) + check.filled(half2, pos2, testnode3) +end) + +-- FIXME?: this one looks overcomplicated +worldedit.register_test("worldedit.copy", function() + local pos1, pos2 = area.get(4) + local axis, n = area.dir(2) + local m = area.margin(1) + local b = pos1[axis] + + -- create one slice with testnode1, one with testnode2 + worldedit.set(pos1, vecw(axis, b + 1, pos2), testnode1) + worldedit.set(vecw(axis, b + 2, pos1), pos2, testnode2) + worldedit.copy(pos1, pos2, axis, n) + + -- should have three slices now + check.filled(pos1, vecw(axis, b + 1, pos2), testnode1) + check.filled(vecw(axis, b + 2, pos1), pos2, testnode1) + check.filled(vecw(axis, b + 4, pos1), vector.add(pos2, vecw(axis, n)), testnode2) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.copy2", function() + local pos1, pos2 = area.get(6) + local m1 = area.margin(1) + local pos1_, pos2_ = area.get(6) + local m2 = area.margin(1) + + local pattern = {testnode1, testnode2, testnode3, testnode1, testnode2} + place_pattern(pos1, pos2, pattern) + worldedit.copy2(pos1, pos2, vector.subtract(pos1_, pos1)) + + check.pattern(pos1, pos2, pattern) + check.pattern(pos1_, pos2_, pattern) + check.filled2(m1, air) + check.filled2(m2, air) +end) + +worldedit.register_test("worldedit.move (overlap)", function() + local pos1, pos2 = area.get(7) + local axis, n = area.dir(2) + local m = area.margin(1) + + local pattern = {testnode2, testnode1, testnode2, testnode3, testnode3} + place_pattern(pos1, pos2, pattern) + worldedit.move(pos1, pos2, axis, n) + + check.filled(pos1, vecw(axis, pos1[axis] + n - 1, pos2), air) + check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.move", function() + local pos1, pos2 = area.get(10) + local axis, n = area.dir(10) + local m = area.margin(1) + + local pattern = {testnode1, testnode3, testnode3, testnode2} + place_pattern(pos1, pos2, pattern) + worldedit.move(pos1, pos2, axis, n) + + check.filled(pos1, pos2, air) + check.pattern(vecw(axis, pos1[axis] + n, pos1), vecw(axis, pos2[axis] + n, pos2), pattern) + check.filled2(m, air) +end) + +-- TODO: the rest (also testing param2 + metadata) diff --git a/mods/Minetest-WorldEdit/worldedit/test/primitives.lua b/mods/Minetest-WorldEdit/worldedit/test/primitives.lua new file mode 100644 index 00000000..42bb39e0 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/test/primitives.lua @@ -0,0 +1,59 @@ +--------------------- +local vec = vector.new +local vecw = function(axis, n, base) + local ret = vec(base) + ret[axis] = n + return ret +end +local air = "air" +--------------------- + + +worldedit.register_test("Primitives") +worldedit.register_test("worldedit.cube", function() + local pos1, pos2 = area.get(6, 5, 4) + local m = area.margin(1) + + local center = vec(pos1.x + 3, pos1.y, pos1.z + 2) + + worldedit.cube(center, 6, 5, 4, testnode2) + + check.filled(pos1, pos2, testnode2) + check.filled2(m, air) +end) + +worldedit.register_test("worldedit.cube hollow small", function() + for n = 1, 2 do + local pos1, pos2 = area.get(n) + local m = area.margin(1) + + local center = vec(pos1.x + math.floor(n/2), pos1.y, pos1.z + math.floor(n/2)) + + worldedit.cube(center, n, n, n, testnode1, true) + + check.filled(pos1, pos2, testnode1) -- filled entirely + check.filled2(m, air) + end +end) + +worldedit.register_test("worldedit.cube hollow", function() + local pos1, pos2 = area.get(6, 5, 4) + local m = area.margin(1) + + local center = vec(pos1.x + 3, pos1.y, pos1.z + 2) + + worldedit.cube(center, 6, 5, 4, testnode1, true) + + check.filled(vector.add(pos1, vec(1,1,1)), vector.subtract(pos2, vec(1,1,1)), air) + check.filled2({ + { vecw("x", pos2.x, pos1), pos2 }, + { vecw("y", pos2.y, pos1), pos2 }, + { vecw("z", pos2.z, pos1), pos2 }, + { pos1, vecw("x", pos1.x, pos2) }, + { pos1, vecw("y", pos1.y, pos2) }, + { pos1, vecw("z", pos1.z, pos2) }, + }, testnode1) + check.filled2(m, air) +end) + + diff --git a/mods/Minetest-WorldEdit/worldedit/test/schematic.lua b/mods/Minetest-WorldEdit/worldedit/test/schematic.lua new file mode 100644 index 00000000..2866a320 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/test/schematic.lua @@ -0,0 +1,162 @@ +--------------------- +local vec = vector.new +local air = "air" +--------------------- + + +local function output_weird(numbers, body) + local s = {"return {"} + for _, parts in ipairs(numbers) do + s[#s+1] = "{" + for _, n in ipairs(parts) do + s[#s+1] = string.format(" {%d},", n) + end + s[#s+1] = "}," + end + return table.concat(s, "\n") .. table.concat(body, "\n") .. "}" +end + +local fmt1p = '{\n ["x"]=%d,\n ["y"]=%d,\n ["z"]=%d,\n},' +local fmt1n = '{\n ["name"]="%s",\n},' +local fmt4 = '{ ["x"] = %d, ["y"] = %d, ["z"] = %d, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["param1"] = 0, ["name"] = "%s" }' +local fmt5 = '{ ["x"] = %d, ["y"] = %d, ["z"] = %d, ["name"] = "%s" }' +local fmt51 = '{[r2]=0,x=%d,y=%d,z=%d,name=r%d}' +local fmt52 = '{x=%d,y=%d,z=%d,name=_[%d]}' + +local test_data = { + -- used by WorldEdit 0.2 (first public release) + { + name = "v1", ver = 1, + gen = function(pat) + local numbers = { + {2, 3, 4, 5, 6}, + {7, 8}, {9, 10}, {11, 12}, + {13, 14}, {15, 16} + } + return output_weird(numbers, { + fmt1p:format(0, 0, 0), + fmt1n:format(pat[1]), + fmt1p:format(0, 1, 0), + fmt1n:format(pat[3]), + fmt1p:format(1, 1, 0), + fmt1n:format(pat[1]), + fmt1p:format(1, 0, 1), + fmt1n:format(pat[3]), + fmt1p:format(0, 1, 1), + fmt1n:format(pat[1]), + }) + end + }, + + -- v2: missing because I couldn't find any code in my archives that actually wrote this format + + { + name = "v3", ver = 3, + gen = function(pat) + assert(pat[2] == air) + return table.concat({ + "0 0 0 " .. pat[1] .. " 0 0", + "0 1 0 " .. pat[3] .. " 0 0", + "1 1 0 " .. pat[1] .. " 0 0", + "1 0 1 " .. pat[3] .. " 0 0", + "0 1 1 " .. pat[1] .. " 0 0", + }, "\n") + end + }, + + { + name = "v4", ver = 4, + gen = function(pat) + return table.concat({ + "return { " .. fmt4:format(0, 0, 0, pat[1]), + fmt4:format(0, 1, 0, pat[3]), + fmt4:format(1, 1, 0, pat[1]), + fmt4:format(1, 0, 1, pat[3]), + fmt4:format(0, 1, 1, pat[1]) .. " }", + }, ", ") + end + }, + + -- like v4 but no meta and param (if empty) + { + name = "v5 (pre-5.6)", ver = 5, + gen = function(pat) + return table.concat({ + "5:return { " .. fmt5:format(0, 0, 0, pat[1]), + fmt5:format(0, 1, 0, pat[3]), + fmt5:format(1, 1, 0, pat[1]), + fmt5:format(1, 0, 1, pat[3]), + fmt5:format(0, 1, 1, pat[1]) .. " }", + }, ", ") + end + }, + + -- reworked engine serialization in 5.6 + { + name = "v5 (5.6)", ver = 5, + gen = function(pat) + return table.concat({ + '5:r1="' .. pat[1] .. '";r2="param1";r3="' .. pat[3] .. '";return {' + .. fmt51:format(0, 0, 0, 1), + fmt51:format(0, 1, 0, 3), + fmt51:format(1, 1, 0, 1), + fmt51:format(1, 0, 1, 3), + fmt51:format(0, 1, 1, 1) .. "}", + }, ",") + end + }, + + -- small changes on engine side again + { + name = "v5 (post-5.7)", ver = 5, + gen = function(pat) + return table.concat({ + '5:local _={};_[1]="' .. pat[1] .. '";_[3]="' .. pat[3] .. '";return {' + .. fmt52:format(0, 0, 0, 1), + fmt52:format(0, 1, 0, 3), + fmt52:format(1, 1, 0, 1), + fmt52:format(1, 0, 1, 3), + fmt52:format(0, 1, 1, 1) .. "}", + }, ",") + end + }, +} + + +worldedit.register_test("Schematics") +worldedit.register_test("worldedit.read_header", function() + local value = '5,foo,BAR,-1,234:the content' + local version, header, content = worldedit.read_header(value) + assert(version == 5) + assert(#header == 4) + assert(header[1] == "foo" and header[2] == "BAR") + assert(header[3] == "-1" and header[4] == "234") + assert(content == "the content") +end) + +worldedit.register_test("worldedit.allocate", function() + local value = '3:-1 0 0 dummy 0 0\n0 0 4 dummy 0 0\n0 1 0 dummy 0 0' + local pos1, pos2, count = worldedit.allocate(vec(1, 1, 1), value) + assert(vector.equals(pos1, vec(0, 1, 1))) + assert(vector.equals(pos2, vec(1, 2, 5))) + assert(count == 3) +end) + +for _, e in ipairs(test_data) do + worldedit.register_test("worldedit.deserialize " .. e.name, function() + local pos1, pos2 = area.get(2) + local m = area.margin(1) + + local pat = {testnode3, air, testnode2} + local value = e.gen(pat) + assert(type(value) == "string") + + local version = worldedit.read_header(value) + assert(version == e.ver, "version: got " .. tostring(version) .. " expected " .. e.ver) + local count = worldedit.deserialize(pos1, value) + assert(count ~= nil and count > 0) + + check.pattern(pos1, pos2, pat) + check.filled2(m, air) + end) +end diff --git a/mods/Minetest-WorldEdit/worldedit/textures/worldedit_wand.png b/mods/Minetest-WorldEdit/worldedit/textures/worldedit_wand.png deleted file mode 100644 index 13eb12189cb19a680229526a474f38f932300ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmV;r0Y(0aP)YX~D;^6zhY%lq+t9~~3e-UnQMy0G(L5CoCbLBh== z5DNIw3X)cJp+6FWexczo(!-(xV*dHr8*{Uf%fUJ@g7q`K=_*qFSkw$sgJBr=*Vvy8 zuyBGp@o_hoig{RlLBvn4NLT;>YtaC^q!P$t!^+Vu2@3!qHqph3MTY70B9_X~zZ*1? zIDaM6>4p6Egzf2G78U?NER`XfqZ5^40rB}T3kv{X=|Cs5!w2=NfQ`v+ZhC`8wx+yn zl?gAkb|lkT5*7f!a&(A2ZDqXIOl+P$Q&ScGl1yhQU#UW|%UGQoX5j?C<1UQyhj9nL kM{P|20J}2^J8ETo0~vOCmI$`c0000007*qoM6N<$f^)O3761SM diff --git a/mods/Minetest-WorldEdit/worldedit/transformations.lua b/mods/Minetest-WorldEdit/worldedit/transformations.lua new file mode 100644 index 00000000..c33b93d2 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit/transformations.lua @@ -0,0 +1,357 @@ +--- Node transformations. +-- @module worldedit.transformations + +worldedit.deferred_execution = function(next_one, finished) + -- Allocate 80% of server step for execution + local allocated_usecs = + tonumber(minetest.settings:get("dedicated_server_step"):split(" ")[1]) * 1000000 * 0.8 + local function f() + local deadline = minetest.get_us_time() + allocated_usecs + repeat + local is_done = next_one() + if is_done then + if finished then + finished() + end + return + end + until minetest.get_us_time() >= deadline + minetest.after(0, f) + end + f() +end + +--- Duplicates a region `amount` times with offset vector `direction`. +-- Stacking is spread across server steps. +-- @return The number of nodes stacked. +function worldedit.stack2(pos1, pos2, direction, amount, finished) + -- Protect arguments from external changes during execution + pos1 = vector.copy(pos1) + pos2 = vector.copy(pos2) + direction = vector.copy(direction) + + local i = 0 + local translated = vector.new() + local function step() + translated.x = translated.x + direction.x + translated.y = translated.y + direction.y + translated.z = translated.z + direction.z + worldedit.copy2(pos1, pos2, translated) + i = i + 1 + return i >= amount + end + worldedit.deferred_execution(step, finished) + + return worldedit.volume(pos1, pos2) * amount +end + + +--- Duplicates a region along `axis` `amount` times. +-- Stacking is spread across server steps. +-- @param pos1 +-- @param pos2 +-- @param axis Axis direction, "x", "y", or "z". +-- @param count +-- @return The number of nodes stacked. +function worldedit.stack(pos1, pos2, axis, count, finished) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local length = pos2[axis] - pos1[axis] + 1 + if count < 0 then + count = -count + length = -length + end + + local i, distance = 0, 0 + local function step() + distance = distance + length + worldedit.copy(pos1, pos2, axis, distance) + i = i + 1 + return i >= count + end + worldedit.deferred_execution(step, finished) + + return worldedit.volume(pos1, pos2) * count +end + + +--- Stretches a region by a factor of positive integers along the X, Y, and Z +-- axes, respectively, with `pos1` as the origin. +-- @param pos1 +-- @param pos2 +-- @param stretch_x Amount to stretch along X axis. +-- @param stretch_y Amount to stretch along Y axis. +-- @param stretch_z Amount to stretch along Z axis. +-- @return The number of nodes scaled. +-- @return The new scaled position 1. +-- @return The new scaled position 2. +function worldedit.stretch(pos1, pos2, stretch_x, stretch_y, stretch_z) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + -- Prepare schematic of large node + local get_node, get_meta, place_schematic = minetest.get_node, + minetest.get_meta, minetest.place_schematic + local placeholder_node = {name="", param1=255, param2=0} + local nodes = {} + for i = 1, stretch_x * stretch_y * stretch_z do + nodes[i] = placeholder_node + end + local schematic = {size=vector.new(stretch_x, stretch_y, stretch_z), data=nodes} + + local size_x, size_y, size_z = stretch_x - 1, stretch_y - 1, stretch_z - 1 + + local new_pos2 = { + x = pos1.x + (pos2.x - pos1.x) * stretch_x + size_x, + y = pos1.y + (pos2.y - pos1.y) * stretch_y + size_y, + z = pos1.z + (pos2.z - pos1.z) * stretch_z + size_z, + } + worldedit.keep_loaded(pos1, new_pos2) + + local pos = vector.new(pos2.x, 0, 0) + local big_pos = vector.new() + while pos.x >= pos1.x do + pos.y = pos2.y + while pos.y >= pos1.y do + pos.z = pos2.z + while pos.z >= pos1.z do + local node = get_node(pos) -- Get current node + local meta = get_meta(pos):to_table() -- Get meta of current node + + -- Calculate far corner of the big node + local pos_x = pos1.x + (pos.x - pos1.x) * stretch_x + local pos_y = pos1.y + (pos.y - pos1.y) * stretch_y + local pos_z = pos1.z + (pos.z - pos1.z) * stretch_z + + -- Create large node + placeholder_node.name = node.name + placeholder_node.param2 = node.param2 + big_pos.x, big_pos.y, big_pos.z = pos_x, pos_y, pos_z + place_schematic(big_pos, schematic) + + -- Fill in large node meta + if next(meta.fields) ~= nil or next(meta.inventory) ~= nil then + -- Node has meta fields + for x = 0, size_x do + for y = 0, size_y do + for z = 0, size_z do + big_pos.x = pos_x + x + big_pos.y = pos_y + y + big_pos.z = pos_z + z + -- Set metadata of new node + get_meta(big_pos):from_table(meta) + end + end + end + end + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + return worldedit.volume(pos1, pos2) * stretch_x * stretch_y * stretch_z, pos1, new_pos2 +end + + +--- Transposes a region between two axes. +-- @return The number of nodes transposed. +-- @return The new transposed position 1. +-- @return The new transposed position 2. +function worldedit.transpose(pos1, pos2, axis1, axis2) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local compare + local extent1, extent2 = pos2[axis1] - pos1[axis1], pos2[axis2] - pos1[axis2] + + if extent1 > extent2 then + compare = function(extent1, extent2) + return extent1 > extent2 + end + else + compare = function(extent1, extent2) + return extent1 < extent2 + end + end + + -- Calculate the new position 2 after transposition + local new_pos2 = vector.new(pos2) + new_pos2[axis1] = pos1[axis1] + extent2 + new_pos2[axis2] = pos1[axis2] + extent1 + + local upper_bound = vector.new(pos2) + if upper_bound[axis1] < new_pos2[axis1] then upper_bound[axis1] = new_pos2[axis1] end + if upper_bound[axis2] < new_pos2[axis2] then upper_bound[axis2] = new_pos2[axis2] end + worldedit.keep_loaded(pos1, upper_bound) + + local pos = vector.new(pos1.x, 0, 0) + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2] + if compare(extent1, extent2) then -- Transpose only if below the diagonal + local node1 = get_node(pos) + local meta1 = get_meta(pos):to_table() + local value1, value2 = pos[axis1], pos[axis2] -- Save position values + pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1 -- Swap axis extents + local node2 = get_node(pos) + local meta2 = get_meta(pos):to_table() + set_node(pos, node1) + get_meta(pos):from_table(meta1) + pos[axis1], pos[axis2] = value1, value2 -- Restore position values + set_node(pos, node2) + get_meta(pos):from_table(meta2) + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2), pos1, new_pos2 +end + + +--- Flips a region along `axis`. +-- @return The number of nodes flipped. +function worldedit.flip(pos1, pos2, axis) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + --- TODO: Flip the region slice by slice along the flip axis using schematic method. + local pos = vector.new(pos1.x, 0, 0) + local start = pos1[axis] + pos2[axis] + pos2[axis] = pos1[axis] + math.floor((pos2[axis] - pos1[axis]) / 2) + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node1 = get_node(pos) + local meta1 = get_meta(pos):to_table() + local value = pos[axis] -- Save position + pos[axis] = start - value -- Shift position + local node2 = get_node(pos) + local meta2 = get_meta(pos):to_table() + set_node(pos, node1) + get_meta(pos):from_table(meta1) + pos[axis] = value -- Restore position + set_node(pos, node2) + get_meta(pos):from_table(meta2) + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2) +end + + +--- Rotates a region clockwise around an axis. +-- @param pos1 +-- @param pos2 +-- @param axis Axis ("x", "y", or "z"). +-- @param angle Angle in degrees (90 degree increments only). +-- @return The number of nodes rotated. +-- @return The new first position. +-- @return The new second position. +function worldedit.rotate(pos1, pos2, axis, angle) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local other1, other2 = worldedit.get_axis_others(axis) + angle = angle % 360 + + local count + if angle == 90 then + worldedit.flip(pos1, pos2, other1) + count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) + elseif angle == 180 then + worldedit.flip(pos1, pos2, other1) + count = worldedit.flip(pos1, pos2, other2) + elseif angle == 270 then + worldedit.flip(pos1, pos2, other2) + count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) + else + error("Only 90 degree increments are supported!") + end + return count, pos1, pos2 +end + + +--- Rotates all oriented nodes in a region clockwise around the Y axis. +-- @param pos1 +-- @param pos2 +-- @param angle Angle in degrees (90 degree increments only). +-- @return The number of nodes oriented. +function worldedit.orient(pos1, pos2, angle) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local registered_nodes = minetest.registered_nodes + + local wallmounted = { + [90] = {0, 1, 5, 4, 2, 3, 0, 0}, + [180] = {0, 1, 3, 2, 5, 4, 0, 0}, + [270] = {0, 1, 4, 5, 3, 2, 0, 0} + } + local facedir = { + [90] = { 1, 2, 3, 0, 13, 14, 15, 12, 17, 18, 19, 16, + 9, 10, 11, 8, 5, 6, 7, 4, 23, 20, 21, 22}, + [180] = { 2, 3, 0, 1, 10, 11, 8, 9, 6, 7, 4, 5, + 18, 19, 16, 17, 14, 15, 12, 13, 22, 23, 20, 21}, + [270] = { 3, 0, 1, 2, 19, 16, 17, 18, 15, 12, 13, 14, + 7, 4, 5, 6, 11, 8, 9, 10, 21, 22, 23, 20} + } + + angle = angle % 360 + if angle == 0 then + return 0 + end + if angle % 90 ~= 0 then + error("Only 90 degree increments are supported!") + end + local wallmounted_substitution = wallmounted[angle] + local facedir_substitution = facedir[angle] + + worldedit.keep_loaded(pos1, pos2) + + local count = 0 + local get_node, swap_node = minetest.get_node, minetest.swap_node + local pos = vector.new(pos1.x, 0, 0) + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + local def = registered_nodes[node.name] + if def then + local paramtype2 = def.paramtype2 + if paramtype2 == "wallmounted" or + paramtype2 == "colorwallmounted" then + local orient = node.param2 % 8 + node.param2 = node.param2 - orient + + wallmounted_substitution[orient + 1] + swap_node(pos, node) + count = count + 1 + elseif paramtype2 == "facedir" or + paramtype2 == "colorfacedir" then + local orient = node.param2 % 32 + node.param2 = node.param2 - orient + + facedir_substitution[orient + 1] + swap_node(pos, node) + count = count + 1 + end + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return count +end diff --git a/mods/Minetest-WorldEdit/worldedit/visualization.lua b/mods/Minetest-WorldEdit/worldedit/visualization.lua index 326a6c1d..1f27ab98 100644 --- a/mods/Minetest-WorldEdit/worldedit/visualization.lua +++ b/mods/Minetest-WorldEdit/worldedit/visualization.lua @@ -19,7 +19,7 @@ function worldedit.hide(pos1, pos2) worldedit.keep_loaded(pos1, pos2) - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) local get_node, get_meta, swap_node = minetest.get_node, minetest.get_meta, minetest.swap_node while pos.x <= pos2.x do @@ -79,7 +79,7 @@ function worldedit.highlight(pos1, pos2, node_name) worldedit.keep_loaded(pos1, pos2) - local pos = {x=pos1.x, y=0, z=0} + local pos = vector.new(pos1.x, 0, 0) local get_node, get_meta, swap_node = minetest.get_node, minetest.get_meta, minetest.swap_node local count = 0 diff --git a/mods/Minetest-WorldEdit/worldedit_brush/init.lua b/mods/Minetest-WorldEdit/worldedit_brush/init.lua index 78c1bd17..67d2a40c 100644 --- a/mods/Minetest-WorldEdit/worldedit_brush/init.lua +++ b/mods/Minetest-WorldEdit/worldedit_brush/init.lua @@ -1,8 +1,4 @@ -if minetest.raycast == nil then - error( - "worldedit_brush requires at least Minetest 5.0" - ) -end +local S = minetest.get_translator("worldedit_brush") local BRUSH_MAX_DIST = 150 local brush_on_use = function(itemstack, placer) @@ -12,7 +8,8 @@ local brush_on_use = function(itemstack, placer) local cmd = meta:get_string("command") if cmd == "" then worldedit.player_notify(name, - "This brush is not bound, use //brush to bind a command to it.") + S("This brush is not bound, use @1 to bind a command to it.", + minetest.colorize("#00ffff", "//brush")), "info") return false end @@ -22,17 +19,17 @@ local brush_on_use = function(itemstack, placer) local has_privs, missing_privs = minetest.check_player_privs(name, cmddef.privs) if not has_privs then worldedit.player_notify(name, - "Missing privileges: " .. table.concat(missing_privs, ", ")) + S("Missing privileges: @1", table.concat(missing_privs, ", ")), "error") return false end local raybegin = vector.add(placer:get_pos(), - {x=0, y=placer:get_properties().eye_height, z=0}) + vector.new(0, placer:get_properties().eye_height, 0)) local rayend = vector.add(raybegin, vector.multiply(placer:get_look_dir(), BRUSH_MAX_DIST)) local ray = minetest.raycast(raybegin, rayend, false, true) local pointed_thing = ray:next() if pointed_thing == nil then - worldedit.player_notify(name, "Too far away.") + worldedit.player_notify(name, S("Too far away."), "error") return false end @@ -41,17 +38,17 @@ local brush_on_use = function(itemstack, placer) worldedit.pos2[name] = nil worldedit.marker_update(name) - -- this isn't really clean... - local player_notify_old = worldedit.player_notify - worldedit.player_notify = function(name, msg) - if string.match(msg, "^%d") then return end -- discard "1234 nodes added." - return player_notify_old(name, msg) - end - assert(cmddef.require_pos < 2) local parsed = {cmddef.parse(meta:get_string("params"))} if not table.remove(parsed, 1) then return false end -- shouldn't happen + -- discard success messages + local player_notify_old = worldedit.player_notify + worldedit.player_notify = function(name, msg, typ) + if typ == "ok" then return end + return player_notify_old(name, msg, typ) + end + minetest.log("action", string.format("%s uses WorldEdit brush (//%s) at %s", name, cmd, minetest.pos_to_string(pointed_thing.under))) cmddef.func(name, unpack(parsed)) @@ -61,7 +58,7 @@ local brush_on_use = function(itemstack, placer) end minetest.register_tool(":worldedit:brush", { - description = "WorldEdit Brush", + description = S("WorldEdit Brush"), inventory_image = "worldedit_brush.png", stack_max = 1, -- no need to stack these (metadata prevents this anyway) range = 0, @@ -74,7 +71,7 @@ minetest.register_tool(":worldedit:brush", { worldedit.register_command("brush", { privs = {worldedit=true}, params = "none/ [parameters]", - description = "Assign command to WorldEdit brush item", + description = S("Assign command to WorldEdit brush item or clear assignment using 'none'"), parse = function(param) local found, _, cmd, params = param:find("^([^%s]+)%s+(.+)$") if not found then @@ -87,39 +84,39 @@ worldedit.register_command("brush", { return true, cmd, params end, func = function(name, cmd, params) - local itemstack = minetest.get_player_by_name(name):get_wielded_item() + local player = minetest.get_player_by_name(name) + if not player then return end + local itemstack = player:get_wielded_item() if itemstack == nil or itemstack:get_name() ~= "worldedit:brush" then - worldedit.player_notify(name, "Not holding brush item.") - return + return false, S("Not holding brush item.") end cmd = cmd:lower() local meta = itemstack:get_meta() if cmd == "none" then meta:from_table(nil) - worldedit.player_notify(name, "Brush assignment cleared.") + worldedit.player_notify(name, S("Brush assignment cleared."), "ok") else local cmddef = worldedit.registered_commands[cmd] if cmddef == nil or cmddef.require_pos ~= 1 then - worldedit.player_notify(name, "//" .. cmd .. " cannot be used with brushes") - return + return false, S("@1 cannot be used with brushes", + minetest.colorize("#00ffff", "//"..cmd)) end -- Try parsing command params so we can give the user feedback local ok, err = cmddef.parse(params) if not ok then - err = err or "invalid usage" - worldedit.player_notify(name, "Error with brush command: " .. err) - return + err = err or S("invalid usage") + return false, S("Error with command: @1", err) end meta:set_string("command", cmd) meta:set_string("params", params) - local fullcmd = "//" .. cmd .. " " .. params + local fullcmd = minetest.colorize("#00ffff", "//"..cmd) .. " " .. params meta:set_string("description", minetest.registered_tools["worldedit:brush"].description .. ": " .. fullcmd) - worldedit.player_notify(name, "Brush assigned to command: " .. fullcmd) + worldedit.player_notify(name, S("Brush assigned to command: @1", fullcmd), "ok") end - minetest.get_player_by_name(name):set_wielded_item(itemstack) + player:set_wielded_item(itemstack) end, }) diff --git a/mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt b/mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt new file mode 100644 index 00000000..81a98af7 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_brush/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: worldedit_brush +This brush is not bound, use @1 to bind a command to it.= +Missing privileges: @1= +Too far away.= +WorldEdit Brush= +Assign command to WorldEdit brush item or clear assignment using 'none'= +Not holding brush item.= +Brush assignment cleared.= +@1 cannot be used with brushes= +invalid usage= +Error with command: @1= +Brush assigned to command: @1= diff --git a/mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr b/mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr new file mode 100644 index 00000000..42f52aaf --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_brush/locale/worldedit_brush.de.tr @@ -0,0 +1,12 @@ +# textdomain: worldedit_brush +This brush is not bound, use @1 to bind a command to it.=Dieser Pinsel ist nicht konfiguriert, nutzen Sie @1, um einen Befehl an ihn zu binden. +Missing privileges: @1=Fehlende Privilegien: @1 +Too far away.=Zu weit weg. +WorldEdit Brush=WorldEdit-Pinsel +Assign command to WorldEdit brush item or clear assignment using 'none'=Befehl an WorldEdit-Pinsel binden oder Zuweisung mittels „none“ aufheben +Not holding brush item.=Kein Pinsel in der Hand. +Brush assignment cleared.=Pinsel-Zuweisung aufgehoben. +@1 cannot be used with brushes=@1 kann nicht mit Pinseln verwendet werden +invalid usage=Ungültige Verwendung +Error with command: @1=Befehl ist fehlerhaft: @1 +Brush assigned to command: @1=Pinsel an Befehl gebunden: @1 diff --git a/mods/Minetest-WorldEdit/worldedit_brush/textures/worldedit_brush.png b/mods/Minetest-WorldEdit/worldedit_brush/textures/worldedit_brush.png index 03785ff62e68e0e23c0349b565292cd62ec218b2..415813fbbb40b0c8eef3a234cd9e886ea34877d6 100644 GIT binary patch delta 285 zcmV+&0pkAA0<8j&8Gi-<001BJ|6u?C0Q5;jK~#9!V)+06Khd~7NRFX3#SujeL($PK z`M3-KYwik?XJ`vnfs0{izJ9Qt;rNzVoQ6zGHesl75oBnLw*m7pG@sg50iyroGo&iQ zlwnGYCPS^4Gy_)6K>9z3zJL1~PD5G(l^FWMlpzLOKb#73Hh)|*nj!!31uTfbX~@Z= z2LXhVg#my-3d-CYPQ`;)8AFRKAIQ9PR zYo9;9`}6z9|NsAiCIB_UbwRYi6$4eyQn)Y?Xs={RkRQl??7-iDsy$Gq+SA1`L_(7F zAh%PK0|V=U=idU2m|2U=cvAQNmz~SWu#b=9%YlbC1iw6H_%nrnp}c-BL)r4}FOGZP zzQyxqf3noAYumoDv}9&PSL-w+%(|T%%PsIB=2Z|k$Aakpd8|wYtGsnj{8nG^J3jx! pSFQ_pwT=EWF<8!LY*1l1!2LEtY`N*Cpno6-db;|#taD0e0suFSf1dyV diff --git a/mods/Minetest-WorldEdit/worldedit_commands/code.lua b/mods/Minetest-WorldEdit/worldedit_commands/code.lua new file mode 100644 index 00000000..96661b79 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/code.lua @@ -0,0 +1,59 @@ +local S = minetest.get_translator("worldedit_commands") + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + + +worldedit.register_command("lua", { + params = "", + description = S("Executes as a Lua chunk in the global namespace"), + category = S("Code"), + privs = {worldedit=true, server=true}, + parse = function(param) + if param == "" then + return false + end + return true, param + end, + func = function(name, param) + -- shorthand like in the Lua interpreter + if param:sub(1, 1) == "=" then + param = "return " .. param:sub(2) + end + local err, ret = worldedit.lua(param, name) + if err == nil then + minetest.log("action", name .. " executed " .. param) + if ret ~= "nil" then + worldedit.player_notify(name, "code successfully executed, returned " .. ret, "info") + else + worldedit.player_notify(name, "code successfully executed", "ok") + end + else + minetest.log("action", name .. " tried to execute " .. param) + worldedit.player_notify(name, "code error: " .. err, "error") + end + end, +}) + +worldedit.register_command("luatransform", { + params = "", + description = S("Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region"), + category = S("Code"), + privs = {worldedit=true, server=true}, + require_pos = 2, + parse = function(param) + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + local err = worldedit.luatransform(worldedit.pos1[name], worldedit.pos2[name], param) + if err then + worldedit.player_notify(name, "code error: " .. err, "error") + minetest.log("action", name.." tried to execute luatransform "..param) + else + worldedit.player_notify(name, "code successfully executed", "ok") + minetest.log("action", name.." executed luatransform "..param) + end + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua b/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua index 93e45fae..b2691127 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/cuboid.lua @@ -1,6 +1,9 @@ +local S = minetest.get_translator("worldedit_commands") + worldedit.register_command("outset", { params = "[h/v] ", - description = "Outset the selected region.", + description = S("Outset the selected region."), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -11,7 +14,7 @@ worldedit.register_command("outset", { local hv_test = dir:find("[^hv]+") if hv_test ~= nil then - return false, "Invalid direction." + return false, S("Invalid direction: @1", dir) end return true, dir, tonumber(amount) @@ -28,18 +31,19 @@ worldedit.register_command("outset", { assert(worldedit.cuboid_linear_expand(name, 'y', 1, amount)) assert(worldedit.cuboid_linear_expand(name, 'y', -1, amount)) else - return false, "Invalid number of arguments" + return false, S("Invalid number of arguments") end worldedit.marker_update(name) - return true, "Region outset by " .. amount .. " blocks" + return true, S("Region outset by @1 nodes", amount) end, }) worldedit.register_command("inset", { params = "[h/v] ", - description = "Inset the selected region.", + description = S("Inset the selected region."), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -48,7 +52,7 @@ worldedit.register_command("inset", { return false end if dir:find("[^hv]") ~= nil then - return false, "Invalid direction." + return false, S("Invalid direction: @1", dir) end return true, dir, tonumber(amount) @@ -65,18 +69,19 @@ worldedit.register_command("inset", { assert(worldedit.cuboid_linear_expand(name, 'y', 1, -amount)) assert(worldedit.cuboid_linear_expand(name, 'y', -1, -amount)) else - return false, "Invalid number of arguments" + return false, S("Invalid number of arguments") end worldedit.marker_update(name) - return true, "Region inset by " .. amount .. " blocks" + return true, S("Region inset by @1 nodes", amount) end, }) worldedit.register_command("shift", { params = "x/y/z/?/up/down/left/right/front/back [+/-]", - description = "Shifts the selection area without moving its contents", + description = S("Shifts the selection area without moving its contents"), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -98,20 +103,21 @@ worldedit.register_command("shift", { end if axis == nil or dir == nil then - return false, "Invalid if looking straight up or down" + return false, S("Invalid if looking straight up or down") end assert(worldedit.cuboid_shift(name, axis, amount * dir)) worldedit.marker_update(name) - return true, "Region shifted by " .. amount .. " nodes" + return true, S("Region shifted by @1 nodes", amount) end, }) worldedit.register_command("expand", { params = "[+/-]x/y/z/?/up/down/left/right/front/back [reverse amount]", - description = "Expands the selection in the selected absolute or relative axis", + description = S("Expands the selection in the selected absolute or relative axis"), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -135,7 +141,7 @@ worldedit.register_command("expand", { axis, dir = worldedit.translate_direction(name, direction) if axis == nil or dir == nil then - return false, "Invalid if looking straight up or down" + return false, S("Invalid if looking straight up or down") end else if direction == "?" then @@ -153,14 +159,15 @@ worldedit.register_command("expand", { worldedit.cuboid_linear_expand(name, axis, dir, amount) worldedit.cuboid_linear_expand(name, axis, -dir, rev_amount) worldedit.marker_update(name) - return true, "Region expanded by " .. (amount + rev_amount) .. " nodes" + return true, S("Region expanded by @1 nodes", amount + rev_amount) end, }) worldedit.register_command("contract", { params = "[+/-]x/y/z/?/up/down/left/right/front/back [reverse amount]", - description = "Contracts the selection in the selected absolute or relative axis", + description = S("Contracts the selection in the selected absolute or relative axis"), + category = S("Region operations"), privs = {worldedit=true}, require_pos = 2, parse = function(param) @@ -184,7 +191,7 @@ worldedit.register_command("contract", { axis, dir = worldedit.translate_direction(name, direction) if axis == nil or dir == nil then - return false, "Invalid if looking straight up or down" + return false, S("Invalid if looking straight up or down") end else if direction == "?" then @@ -202,13 +209,13 @@ worldedit.register_command("contract", { worldedit.cuboid_linear_expand(name, axis, dir, -amount) worldedit.cuboid_linear_expand(name, axis, -dir, -rev_amount) worldedit.marker_update(name) - return true, "Region contracted by " .. (amount + rev_amount) .. " nodes" + return true, S("Region contracted by @1 nodes", amount + rev_amount) end, }) worldedit.register_command("cubeapply", { params = "/( ) [parameters]", - description = "Select a cube with side length around position 1 and run on region", + description = S("Select a cube with side length around position 1 and run on region"), privs = {worldedit=true}, require_pos = 1, parse = function(param) @@ -230,7 +237,8 @@ worldedit.register_command("cubeapply", { end local cmddef = worldedit.registered_commands[cmd] if cmddef == nil or cmddef.require_pos ~= 2 then - return false, "invalid usage: //" .. cmd .. " cannot be used with cubeapply" + return false, S("invalid usage: @1 cannot be used with cubeapply", + minetest.colorize("#00ffff", "//"..cmd)) end -- run parsing of target command local parsed = {cmddef.parse(args)} @@ -241,15 +249,14 @@ worldedit.register_command("cubeapply", { end, nodes_needed = function(name, sidex, sidey, sidez, cmd, parsed) -- its not possible to defer to the target command at this point + -- FIXME: why not? return sidex * sidey * sidez end, func = function(name, sidex, sidey, sidez, cmd, parsed) local cmddef = assert(worldedit.registered_commands[cmd]) local success, missing_privs = minetest.check_player_privs(name, cmddef.privs) if not success then - worldedit.player_notify(name, "Missing privileges: " .. - table.concat(missing_privs, ", ")) - return + return false, S("Missing privileges: @1", table.concat(missing_privs, ", ")) end -- update region to be the cuboid the user wanted diff --git a/mods/Minetest-WorldEdit/worldedit_commands/init.lua b/mods/Minetest-WorldEdit/worldedit_commands/init.lua index 1cdb1077..7b5cd15c 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/init.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/init.lua @@ -1,36 +1,43 @@ -minetest.register_privilege("worldedit", "Can use WorldEdit commands") +local S = minetest.get_translator("worldedit_commands") + +minetest.register_privilege("worldedit", S("Can use WorldEdit commands")) worldedit.pos1 = {} worldedit.pos2 = {} -worldedit.set_pos = {} -worldedit.inspect = {} -worldedit.prob_pos = {} -worldedit.prob_list = {} - - local safe_region, reset_pending = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua") -function worldedit.player_notify(name, message) - minetest.chat_send_player(name, "WorldEdit -!- " .. message, false) -end - worldedit.registered_commands = {} +local function copy_state(which, name) + if which == 0 then + return {} + elseif which == 1 then + return { + worldedit.pos1[name] and vector.copy(worldedit.pos1[name]) + } + else + return { + worldedit.pos1[name] and vector.copy(worldedit.pos1[name]), + worldedit.pos2[name] and vector.copy(worldedit.pos2[name]) + } + end +end + local function chatcommand_handler(cmd_name, name, param) local def = assert(worldedit.registered_commands[cmd_name]) if def.require_pos == 2 then local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] if pos1 == nil or pos2 == nil then - worldedit.player_notify(name, "no region selected") + worldedit.player_notify(name, S("no region selected"), "error") return end elseif def.require_pos == 1 then local pos1 = worldedit.pos1[name] if pos1 == nil then - worldedit.player_notify(name, "no position 1 selected") + worldedit.player_notify(name, S("no position 1 selected"), "error") return end end @@ -38,25 +45,38 @@ local function chatcommand_handler(cmd_name, name, param) local parsed = {def.parse(param)} local success = table.remove(parsed, 1) if not success then - worldedit.player_notify(name, parsed[1] or "invalid usage") + worldedit.player_notify(name, parsed[1] or S("invalid usage"), "error") return end - if def.nodes_needed then - local count = def.nodes_needed(name, unpack(parsed)) - safe_region(name, count, function() - local success, msg = def.func(name, unpack(parsed)) - if msg then - minetest.chat_send_player(name, msg) - end - end) - else - -- no "safe region" check - local success, msg = def.func(name, unpack(parsed)) + local run = function() + local ok, msg = def.func(name, unpack(parsed)) if msg then - minetest.chat_send_player(name, msg) + worldedit.player_notify(name, msg, ok and "ok" or "error") end end + + if not def.nodes_needed then + -- no safe region check + run() + return + end + + local count = def.nodes_needed(name, unpack(parsed)) + local old_state = copy_state(def.require_pos, name) + safe_region(name, count, function() + local state = copy_state(def.require_pos, name) + local ok = true + for i, v in ipairs(state) do + ok = ok and ( (v == nil and old_state[i] == nil) or vector.equals(v, old_state[i]) ) + end + if not ok then + worldedit.player_notify(name, S("ERROR: the operation was cancelled because the region has changed."), "error") + return + end + + run() + end) end -- Registers a chatcommand for WorldEdit @@ -64,8 +84,9 @@ end -- def = { -- privs = {}, -- Privileges needed -- params = "", -- Human readable parameter list (optional) --- -- setting params = "" will automatically provide a parse() if not given +-- -- if params = "" then a parse() implementation will automatically be provided -- description = "", -- Description +-- category = "", -- Category of the command (optional) -- require_pos = 0, -- Number of positions required to be set (optional) -- parse = function(param) -- return true, foo, bar, ... @@ -84,7 +105,9 @@ end function worldedit.register_command(name, def) local def = table.copy(def) assert(name and #name > 0) + def.name = name assert(def.privs) + def.category = def.category or "" def.require_pos = def.require_pos or 0 assert(def.require_pos >= 0 and def.require_pos < 3) if def.params == "" and not def.parse then @@ -100,6 +123,9 @@ function worldedit.register_command(name, def) minetest.log("warning", "//" .. name .. " might be missing nodes_needed") end--]] + -- disable further modification + setmetatable(def, {__newindex = {}}) + minetest.register_chatcommand("/" .. name, { privs = def.privs, params = def.params, @@ -112,105 +138,48 @@ function worldedit.register_command(name, def) end - -dofile(minetest.get_modpath("worldedit_commands") .. "/cuboid.lua") -dofile(minetest.get_modpath("worldedit_commands") .. "/mark.lua") -dofile(minetest.get_modpath("worldedit_commands") .. "/wand.lua") - - -local function check_region(name) - return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +do + local modpath = minetest.get_modpath("worldedit_commands") + for _, name in ipairs({ + "code", "cuboid", "manipulations", "marker", "nodename", "primitives", + "region", "schematics", "transform", "wand" + }) do + dofile(modpath .. "/" .. name .. ".lua") + end end --- Strips any kind of escape codes (translation, colors) from a string --- https://github.com/minetest/minetest/blob/53dd7819277c53954d1298dfffa5287c306db8d0/src/util/string.cpp#L777 -local function strip_escapes(input) - local s = function(idx) return input:sub(idx, idx) end - local out = "" - local i = 1 - while i <= #input do - if s(i) == "\027" then -- escape sequence - i = i + 1 - if s(i) == "(" then -- enclosed - i = i + 1 - while i <= #input and s(i) ~= ")" do - if s(i) == "\\" then - i = i + 2 - else - i = i + 1 - end - end - end - else - out = out .. s(i) - end - i = i + 1 + +-- Notifies a player of something related to WorldEdit. +-- Message types: +-- "error" = An operation did not work as expected. +-- "ok" = An operation completed successfully. Because notifications of this type +-- can be filtered, use this ONLY for generic messages like "1234 nodes set". +-- "info" = Other informational messages +-- @param name Name of player +-- @param message Message text +-- @param typ Type of message (optional but strongly recommend) +function worldedit.player_notify(name, message, typ) + local t = { + "WorldEdit", + "-!-", + tostring(message) + } + if typ == "error" then + t[2] = minetest.colorize("#f22", t[2]) + elseif typ == "ok" then + t[2] = minetest.colorize("#2f2", t[2]) end - --print(("%q -> %q"):format(input, out)) - return out -end - -local function string_endswith(full, part) - return full:find(part, 1, true) == #full - #part + 1 -end - -local description_cache = nil - --- normalizes node "description" `nodename`, returning a string (or nil) -worldedit.normalize_nodename = function(nodename) - nodename = nodename:gsub("^%s*(.-)%s*$", "%1") -- strip spaces - if nodename == "" then return nil end - - local fullname = ItemStack({name=nodename}):get_name() -- resolve aliases - if minetest.registered_nodes[fullname] or fullname == "air" then -- full name - return fullname - end - nodename = nodename:lower() - - for key, _ in pairs(minetest.registered_nodes) do - if string_endswith(key:lower(), ":" .. nodename) then -- matches name (w/o mod part) - return key - end - end - - if description_cache == nil then - -- cache stripped descriptions - description_cache = {} - for key, value in pairs(minetest.registered_nodes) do - local desc = strip_escapes(value.description):gsub("\n.*", "", 1):lower() - if desc ~= "" then - description_cache[key] = desc - end - end - end - - for key, desc in pairs(description_cache) do - if desc == nodename then -- matches description - return key - end - end - for key, desc in pairs(description_cache) do - if desc == nodename .. " block" then - -- fuzzy description match (e.g. "Steel" == "Steel Block") - return key - end - end - - local match = nil - for key, value in pairs(description_cache) do - if value:find(nodename, 1, true) ~= nil then - if match ~= nil then - return nil - end - match = key -- substring description match (only if no ambiguities) - end - end - return match + minetest.chat_send_player(name, table.concat(t, " ")) end -- Determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1) function worldedit.player_axis(name) - local dir = minetest.get_player_by_name(name):get_look_dir() + local player = minetest.get_player_by_name(name) + if not player then + -- we promised to return something valid... + return "y", -1 + end + local dir = player:get_look_dir() local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z) if x > y then if x > z then @@ -222,132 +191,123 @@ function worldedit.player_axis(name) return "z", dir.z > 0 and 1 or -1 end -local function check_filename(name) - return name:find("^[%w%s%^&'@{}%[%],%$=!%-#%(%)%%%.%+~_]+$") ~= nil -end - worldedit.register_command("about", { privs = {}, params = "", - description = "Get information about the WorldEdit mod", + description = S("Get information about the WorldEdit mod"), func = function(name) - worldedit.player_notify(name, "WorldEdit " .. worldedit.version_string.. - " is available on this server. Type //help to get a list of ".. - "commands, or get more information at ".. - "https://github.com/Uberi/Minetest-WorldEdit") + worldedit.player_notify(name, S("WorldEdit @1".. + " is available on this server. Type @2 to get a list of ".. + "commands, or find more information at @3", + worldedit.version_string, minetest.colorize("#00ffff", "//help"), + "https://github.com/Uberi/Minetest-WorldEdit" + ), "info") end, }) --- mostly copied from builtin/chatcommands.lua with minor modifications -worldedit.register_command("help", { - privs = {}, - params = "[all/]", - description = "Get help for WorldEdit commands", - parse = function(param) - return true, param - end, - func = function(name, param) - local function format_help_line(cmd, def) - local msg = minetest.colorize("#00ffff", "//"..cmd) +-- initially copied from builtin/chatcommands.lua +local function help_command(name, param) + local function format_help_line(cmd, def, follow_alias) + local msg = minetest.colorize("#00ffff", "//"..cmd) + if def.name ~= cmd then + msg = msg .. ": " .. S("alias to @1", + minetest.colorize("#00ffff", "//"..def.name)) + if follow_alias then + msg = msg .. "\n" .. format_help_line(def.name, def) + end + else if def.params and def.params ~= "" then msg = msg .. " " .. def.params end if def.description and def.description ~= "" then msg = msg .. ": " .. def.description end - return msg end - - if not minetest.check_player_privs(name, "worldedit") then - return false, "You are not allowed to use any WorldEdit commands." - end - if param == "" then - local msg = "" - local cmds = {} - for cmd, def in pairs(worldedit.registered_commands) do - if minetest.check_player_privs(name, def.privs) then - cmds[#cmds + 1] = cmd - end - end - table.sort(cmds) - return true, "Available commands: " .. table.concat(cmds, " ") .. "\n" - .. "Use '//help ' to get more information," - .. " or '//help all' to list everything." - elseif param == "all" then - local cmds = {} - for cmd, def in pairs(worldedit.registered_commands) do - if minetest.check_player_privs(name, def.privs) then - cmds[#cmds + 1] = format_help_line(cmd, def) - end - end - table.sort(cmds) - return true, "Available commands:\n"..table.concat(cmds, "\n") - else - local def = worldedit.registered_commands[param] - if not def then - return false, "Command not available: " .. param - else - return true, format_help_line(param, def) - end - end - end, -}) - -worldedit.register_command("inspect", { - params = "[on/off/1/0/true/false/yes/no/enable/disable]", - description = "Enable or disable node inspection", - privs = {worldedit=true}, - parse = function(param) - if param == "on" or param == "1" or param == "true" or param == "yes" or param == "enable" or param == "" then - return true, true - elseif param == "off" or param == "0" or param == "false" or param == "no" or param == "disable" then - return true, false - end - return false - end, - func = function(name, enable) - if enable then - worldedit.inspect[name] = true - local axis, sign = worldedit.player_axis(name) - worldedit.player_notify(name, string.format("inspector: inspection enabled for %s, currently facing the %s axis", - name, axis .. (sign > 0 and "+" or "-"))) - else - worldedit.inspect[name] = nil - worldedit.player_notify(name, "inspector: inspection disabled") - end - end, -}) - -local function get_node_rlight(pos) - local vecs = { -- neighboring nodes - {x= 1, y= 0, z= 0}, - {x=-1, y= 0, z= 0}, - {x= 0, y= 1, z= 0}, - {x= 0, y=-1, z= 0}, - {x= 0, y= 0, z= 1}, - {x= 0, y= 0, z=-1}, - } - local ret = 0 - for _, v in ipairs(vecs) do - ret = math.max(ret, minetest.get_node_light(vector.add(pos, v))) + return msg + end + -- @param cmds list of {cmd, def} + local function sort_cmds(cmds) + table.sort(cmds, function(c1, c2) + local cmd1, cmd2 = c1[1], c2[1] + local def1, def2 = c1[2], c2[2] + -- by category (this puts the empty category first) + if def1.category ~= def2.category then + return def1.category < def2.category + end + -- put aliases last + if (cmd1 ~= def1.name) ~= (cmd2 ~= def2.name) then + return cmd2 ~= def2.name + end + -- then by name + return c1[1] < c2[1] + end) + end + + if not minetest.check_player_privs(name, "worldedit") then + return false, S("You are not allowed to use any WorldEdit commands.") + end + if param == "" then + local list = {} + for cmd, def in pairs(worldedit.registered_commands) do + if minetest.check_player_privs(name, def.privs) then + list[#list + 1] = cmd + end + end + table.sort(list) + local help = minetest.colorize("#00ffff", "//help") + return true, S("Available commands: @1@n" + .. "Use '@2' to get more information," + .. " or '@3' to list everything.", + table.concat(list, " "), help .. " ", help .. " all") + elseif param == "all" then + local cmds = {} + for cmd, def in pairs(worldedit.registered_commands) do + if minetest.check_player_privs(name, def.privs) then + cmds[#cmds + 1] = {cmd, def} + end + end + sort_cmds(cmds) + local list = {} + local last_cat = "" + for _, e in ipairs(cmds) do + if e[2].category ~= last_cat then + last_cat = e[2].category + list[#list + 1] = "---- " .. last_cat + end + list[#list + 1] = format_help_line(e[1], e[2]) + end + return true, S("Available commands:@n") .. table.concat(list, "\n") + else + local def = worldedit.registered_commands[param] + if not def then + return false, S("Command not available: ") .. param + else + return true, format_help_line(param, def, true) + end end - return ret end -minetest.register_on_punchnode(function(pos, node, puncher) - local name = puncher:get_player_name() - if worldedit.inspect[name] then - local axis, sign = worldedit.player_axis(name) - local message = string.format("inspector: %s at %s (param1=%d, param2=%d, received light=%d) punched facing the %s axis", - node.name, minetest.pos_to_string(pos), node.param1, node.param2, get_node_rlight(pos), axis .. (sign > 0 and "+" or "-")) - worldedit.player_notify(name, message) - end -end) +worldedit.register_command("help", { + privs = {}, + params = "[all/]", + description = S("Get help for WorldEdit commands"), + parse = function(param) + return true, param + end, + func = function(name, param) + local ok, msg = help_command(name, param) + if msg then + worldedit.player_notify(name, msg, ok and "info" or "error") + end + end, +}) +-- needs to be here due to reset_pending() worldedit.register_command("reset", { params = "", - description = "Reset the region so that it is empty", + description = S("Reset the region so that it is empty"), + category = S("Region operations"), privs = {worldedit=true}, func = function(name) worldedit.pos1[name] = nil @@ -356,1310 +316,7 @@ worldedit.register_command("reset", { worldedit.set_pos[name] = nil --make sure the user does not try to confirm an operation after resetting pos: reset_pending(name) - worldedit.player_notify(name, "region reset") + return true, S("region reset") end, }) -worldedit.register_command("mark", { - params = "", - description = "Show markers at the region positions", - privs = {worldedit=true}, - func = function(name) - worldedit.marker_update(name) - worldedit.player_notify(name, "region marked") - end, -}) - -worldedit.register_command("unmark", { - params = "", - description = "Hide markers if currently shown", - privs = {worldedit=true}, - func = function(name) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - worldedit.pos1[name] = nil - worldedit.pos2[name] = nil - worldedit.marker_update(name) - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.player_notify(name, "region unmarked") - end, -}) - -worldedit.register_command("pos1", { - params = "", - description = "Set WorldEdit region position 1 to the player's location", - privs = {worldedit=true}, - func = function(name) - local pos = minetest.get_player_by_name(name):get_pos() - pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - end, -}) - -worldedit.register_command("pos2", { - params = "", - description = "Set WorldEdit region position 2 to the player's location", - privs = {worldedit=true}, - func = function(name) - local pos = minetest.get_player_by_name(name):get_pos() - pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) - worldedit.pos2[name] = pos - worldedit.mark_pos2(name) - worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) - end, -}) - -worldedit.register_command("p", { - params = "set/set1/set2/get", - description = "Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region", - privs = {worldedit=true}, - parse = function(param) - if param == "set" or param == "set1" or param == "set2" or param == "get" then - return true, param - end - return false, "unknown subcommand: " .. param - end, - func = function(name, param) - if param == "set" then --set both WorldEdit positions - worldedit.set_pos[name] = "pos1" - worldedit.player_notify(name, "select positions by punching two nodes") - elseif param == "set1" then --set WorldEdit position 1 - worldedit.set_pos[name] = "pos1only" - worldedit.player_notify(name, "select position 1 by punching a node") - elseif param == "set2" then --set WorldEdit position 2 - worldedit.set_pos[name] = "pos2" - worldedit.player_notify(name, "select position 2 by punching a node") - elseif param == "get" then --display current WorldEdit positions - if worldedit.pos1[name] ~= nil then - worldedit.player_notify(name, "position 1: " .. minetest.pos_to_string(worldedit.pos1[name])) - else - worldedit.player_notify(name, "position 1 not set") - end - if worldedit.pos2[name] ~= nil then - worldedit.player_notify(name, "position 2: " .. minetest.pos_to_string(worldedit.pos2[name])) - else - worldedit.player_notify(name, "position 2 not set") - end - end - end, -}) - -worldedit.register_command("fixedpos", { - params = "set1/set2 ", - description = "Set a WorldEdit region position to the position at (, , )", - privs = {worldedit=true}, - parse = function(param) - local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, flag, {x=tonumber(x), y=tonumber(y), z=tonumber(z)} - end, - func = function(name, flag, pos) - if flag == "set1" then - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - else --flag == "set2" - worldedit.pos2[name] = pos - worldedit.mark_pos2(name) - worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) - end - end, -}) - -minetest.register_on_punchnode(function(pos, node, puncher) - local name = puncher:get_player_name() - if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position - if worldedit.set_pos[name] == "pos1" then --setting position 1 - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only - worldedit.pos1[name] = pos - worldedit.mark_pos1(name) - worldedit.set_pos[name] = nil --finished setting positions - worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) - elseif worldedit.set_pos[name] == "pos2" then --setting position 2 - worldedit.pos2[name] = pos - worldedit.mark_pos2(name) - worldedit.set_pos[name] = nil --finished setting positions - worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) - elseif worldedit.set_pos[name] == "prob" then --setting Minetest schematic node probabilities - worldedit.prob_pos[name] = pos - minetest.show_formspec(puncher:get_player_name(), "prob_val_enter", "field[text;;]") - end - end -end) - -worldedit.register_command("volume", { - params = "", - description = "Display the volume of the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - func = function(name) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - - local volume = worldedit.volume(pos1, pos2) - local abs = math.abs - worldedit.player_notify(name, "current region has a volume of " .. volume .. " nodes (" - .. abs(pos2.x - pos1.x) + 1 .. "*" - .. abs(pos2.y - pos1.y) + 1 .. "*" - .. abs(pos2.z - pos1.z) + 1 .. ")") - end, -}) - -worldedit.register_command("deleteblocks", { - params = "", - description = "remove all MapBlocks (16x16x16) containing the selected area from the map", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local success = minetest.delete_area(pos1, pos2) - if success then - worldedit.player_notify(name, "Area deleted.") - else - worldedit.player_notify(name, "There was an error during deletion of the area.") - end - end, -}) - -worldedit.register_command("set", { - params = "", - description = "Set the current WorldEdit region to ", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local node = worldedit.normalize_nodename(param) - if not node then - return false, "invalid node name: " .. param - end - return true, node - end, - nodes_needed = check_region, - func = function(name, node) - local count = worldedit.set(worldedit.pos1[name], worldedit.pos2[name], node) - worldedit.player_notify(name, count .. " nodes set") - end, -}) - -worldedit.register_command("param2", { - params = "", - description = "Set param2 of all nodes in the current WorldEdit region to ", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local param2 = tonumber(param) - if not param2 then - return false - elseif param2 < 0 or param2 > 255 then - return false, "Param2 is out of range (must be between 0 and 255 inclusive!)" - end - return true, param2 - end, - nodes_needed = check_region, - func = function(name, param2) - local count = worldedit.set_param2(worldedit.pos1[name], worldedit.pos2[name], param2) - worldedit.player_notify(name, count .. " nodes altered") - end, -}) - -worldedit.register_command("mix", { - params = " [count1] [count2] ...", - description = "Fill the current WorldEdit region with a random mix of , ...", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local nodes = {} - for nodename in param:gmatch("[^%s]+") do - if tonumber(nodename) ~= nil and #nodes > 0 then - local last_node = nodes[#nodes] - for i = 1, tonumber(nodename) do - nodes[#nodes + 1] = last_node - end - else - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - nodes[#nodes + 1] = node - end - end - if #nodes == 0 then - return false - end - return true, nodes - end, - nodes_needed = check_region, - func = function(name, nodes) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.set(pos1, pos2, nodes) - worldedit.player_notify(name, count .. " nodes set") - end, -}) - -local check_replace = function(param) - local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+(.+)$") - if found == nil then - return false - end - local newsearchnode = worldedit.normalize_nodename(searchnode) - if not newsearchnode then - return false, "invalid search node name: " .. searchnode - end - local newreplacenode = worldedit.normalize_nodename(replacenode) - if not newreplacenode then - return false, "invalid replace node name: " .. replacenode - end - return true, newsearchnode, newreplacenode -end - -worldedit.register_command("replace", { - params = " ", - description = "Replace all instances of with in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - parse = check_replace, - nodes_needed = check_region, - func = function(name, search_node, replace_node) - local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], - search_node, replace_node) - worldedit.player_notify(name, count .. " nodes replaced") - end, -}) - -worldedit.register_command("replaceinverse", { - params = " ", - description = "Replace all nodes other than with in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - parse = check_replace, - nodes_needed = check_region, - func = function(name, search_node, replace_node) - local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], - search_node, replace_node, true) - worldedit.player_notify(name, count .. " nodes replaced") - end, -}) - -local check_cube = function(param) - local found, _, w, h, l, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(w), tonumber(h), tonumber(l), node -end - -worldedit.register_command("hollowcube", { - params = " ", - description = "Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cube, - nodes_needed = function(name, w, h, l, node) - return w * h * l - end, - func = function(name, w, h, l, node) - local count = worldedit.cube(worldedit.pos1[name], w, h, l, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("cube", { - params = " ", - description = "Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cube, - nodes_needed = function(name, w, h, l, node) - return w * h * l - end, - func = function(name, w, h, l, node) - local count = worldedit.cube(worldedit.pos1[name], w, h, l, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_sphere = function(param) - local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(radius), node -end - -worldedit.register_command("hollowsphere", { - params = " ", - description = "Add hollow sphere centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_sphere, - nodes_needed = function(name, radius, node) - return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere - end, - func = function(name, radius, node) - local count = worldedit.sphere(worldedit.pos1[name], radius, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("sphere", { - params = " ", - description = "Add sphere centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_sphere, - nodes_needed = function(name, radius, node) - return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere - end, - func = function(name, radius, node) - local count = worldedit.sphere(worldedit.pos1[name], radius, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_dome = function(param) - local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(radius), node -end - -worldedit.register_command("hollowdome", { - params = " ", - description = "Add hollow dome centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_dome, - nodes_needed = function(name, radius, node) - return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome - end, - func = function(name, radius, node) - local count = worldedit.dome(worldedit.pos1[name], radius, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("dome", { - params = " ", - description = "Add dome centered at WorldEdit position 1 with radius , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_dome, - nodes_needed = function(name, radius, node) - return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome - end, - func = function(name, radius, node) - local count = worldedit.dome(worldedit.pos1[name], radius, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_cylinder = function(param) - -- two radii - local found, _, axis, length, radius1, radius2, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(%d+)%s+(.+)$") - if found == nil then - -- single radius - found, _, axis, length, radius1, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") - radius2 = radius1 - end - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, axis, tonumber(length), tonumber(radius1), tonumber(radius2), node -end - -worldedit.register_command("hollowcylinder", { - params = "x/y/z/? [radius2] ", - description = "Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cylinder, - nodes_needed = function(name, axis, length, radius1, radius2, node) - local radius = math.max(radius1, radius2) - return math.ceil(math.pi * (radius ^ 2) * length) - end, - func = function(name, axis, length, radius1, radius2, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - length = length * sign - end - local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("cylinder", { - params = "x/y/z/? [radius2] ", - description = "Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_cylinder, - nodes_needed = function(name, axis, length, radius1, radius2, node) - local radius = math.max(radius1, radius2) - return math.ceil(math.pi * (radius ^ 2) * length) - end, - func = function(name, axis, length, radius1, radius2, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - length = length * sign - end - local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -local check_pyramid = function(param) - local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, axis, tonumber(height), node -end - -worldedit.register_command("hollowpyramid", { - params = "x/y/z/? ", - description = "Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_pyramid, - nodes_needed = function(name, axis, height, node) - return math.ceil(((height * 2 + 1) ^ 2) * height / 3) - end, - func = function(name, axis, height, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - height = height * sign - end - local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node, true) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("pyramid", { - params = "x/y/z/? ", - description = "Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = check_pyramid, - nodes_needed = function(name, axis, height, node) - return math.ceil(((height * 2 + 1) ^ 2) * height / 3) - end, - func = function(name, axis, height, node) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - height = height * sign - end - local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("spiral", { - params = " ", - description = "Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of ", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - local found, _, length, height, space, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") - if found == nil then - return false - end - local node = worldedit.normalize_nodename(nodename) - if not node then - return false, "invalid node name: " .. nodename - end - return true, tonumber(length), tonumber(height), tonumber(space), node - end, - nodes_needed = function(name, length, height, space, node) - return (length + space) * height -- TODO: this is not the upper bound - end, - func = function(name, length, height, space, node) - local count = worldedit.spiral(worldedit.pos1[name], length, height, space, node) - worldedit.player_notify(name, count .. " nodes added") - end, -}) - -worldedit.register_command("copy", { - params = "x/y/z/? ", - description = "Copy the current WorldEdit region along the given axis by nodes", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, axis, tonumber(amount) - end, - nodes_needed = function(name, axis, amount) - return check_region(name) * 2 - end, - func = function(name, axis, amount) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - amount = amount * sign - end - - local count = worldedit.copy(worldedit.pos1[name], worldedit.pos2[name], axis, amount) - worldedit.player_notify(name, count .. " nodes copied") - end, -}) - -worldedit.register_command("move", { - params = "x/y/z/? ", - description = "Move the current WorldEdit region along the given axis by nodes", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, axis, tonumber(amount) - end, - nodes_needed = function(name, axis, amount) - return check_region(name) * 2 - end, - func = function(name, axis, amount) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - amount = amount * sign - end - - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.move(pos1, pos2, axis, amount) - - pos1[axis] = pos1[axis] + amount - pos2[axis] = pos2[axis] + amount - worldedit.marker_update(name) - worldedit.player_notify(name, count .. " nodes moved") - end, -}) - -worldedit.register_command("stack", { - params = "x/y/z/? ", - description = "Stack the current WorldEdit region along the given axis times", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, repetitions = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - return true, axis, tonumber(repetitions) - end, - nodes_needed = function(name, axis, repetitions) - return check_region(name) * math.abs(repetitions) - end, - func = function(name, axis, repetitions) - if axis == "?" then - local sign - axis, sign = worldedit.player_axis(name) - repetitions = repetitions * sign - end - - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.volume(pos1, pos2) * math.abs(repetitions) - worldedit.stack(pos1, pos2, axis, repetitions, function() - worldedit.player_notify(name, count .. " nodes stacked") - end) - end, -}) - -worldedit.register_command("stack2", { - params = " ", - description = "Stack the current WorldEdit region times by offset , , ", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local repetitions, incs = param:match("(%d+)%s*(.+)") - if repetitions == nil then - return false, "invalid count: " .. param - end - local x, y, z = incs:match("([+-]?%d+) ([+-]?%d+) ([+-]?%d+)") - if x == nil then - return false, "invalid increments: " .. param - end - - return true, tonumber(repetitions), {x=tonumber(x), y=tonumber(y), z=tonumber(z)} - end, - nodes_needed = function(name, repetitions, offset) - return check_region(name) * repetitions - end, - func = function(name, repetitions, offset) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count = worldedit.volume(pos1, pos2) * repetitions - worldedit.stack2(pos1, pos2, offset, repetitions, function() - worldedit.player_notify(name, count .. " nodes stacked") - end) - end, -}) - - -worldedit.register_command("stretch", { - params = " ", - description = "Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, stretchx, stretchy, stretchz = param:find("^(%d+)%s+(%d+)%s+(%d+)$") - if found == nil then - return false - end - stretchx, stretchy, stretchz = tonumber(stretchx), tonumber(stretchy), tonumber(stretchz) - if stretchx == 0 or stretchy == 0 or stretchz == 0 then - return false, "invalid scaling factors: " .. param - end - return true, stretchx, stretchy, stretchz - end, - nodes_needed = function(name, stretchx, stretchy, stretchz) - return check_region(name) * stretchx * stretchy * stretchz - end, - func = function(name, stretchx, stretchy, stretchz) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - local count, pos1, pos2 = worldedit.stretch(pos1, pos2, stretchx, stretchy, stretchz) - - --reset markers to scaled positions - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes stretched") - end, -}) - -worldedit.register_command("transpose", { - params = "x/y/z/? x/y/z/?", - description = "Transpose the current WorldEdit region along the given axes", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") - if found == nil then - return false - elseif axis1 == axis2 then - return false, "invalid usage: axes must be different" - end - return true, axis1, axis2 - end, - nodes_needed = check_region, - func = function(name, axis1, axis2) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - if axis1 == "?" then axis1 = worldedit.player_axis(name) end - if axis2 == "?" then axis2 = worldedit.player_axis(name) end - local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2) - - --reset markers to transposed positions - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes transposed") - end, -}) - -worldedit.register_command("flip", { - params = "x/y/z/?", - description = "Flip the current WorldEdit region along the given axis", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - if param ~= "x" and param ~= "y" and param ~= "z" and param ~= "?" then - return false - end - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - if param == "?" then param = worldedit.player_axis(name) end - local count = worldedit.flip(worldedit.pos1[name], worldedit.pos2[name], param) - worldedit.player_notify(name, count .. " nodes flipped") - end, -}) - -worldedit.register_command("rotate", { - params = "x/y/z/? ", - description = "Rotate the current WorldEdit region around the given axis by angle (90 degree increment)", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$") - if found == nil then - return false - end - angle = tonumber(angle) - if angle % 90 ~= 0 or angle % 360 == 0 then - return false, "invalid usage: angle must be multiple of 90" - end - return true, axis, angle - end, - nodes_needed = check_region, - func = function(name, axis, angle) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] - if axis == "?" then axis = worldedit.player_axis(name) end - local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle) - - --reset markers to rotated positions - worldedit.pos1[name] = pos1 - worldedit.pos2[name] = pos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes rotated") - end, -}) - -worldedit.register_command("orient", { - params = "", - description = "Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local found, _, angle = param:find("^([+-]?%d+)$") - if found == nil then - return false - end - angle = tonumber(angle) - if angle % 90 ~= 0 then - return false, "invalid usage: angle must be multiple of 90" - end - return true, angle - end, - nodes_needed = check_region, - func = function(name, angle) - local count = worldedit.orient(worldedit.pos1[name], worldedit.pos2[name], angle) - worldedit.player_notify(name, count .. " nodes oriented") - end, -}) - -worldedit.register_command("fixlight", { - params = "", - description = "Fix the lighting in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.fixlight(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " nodes updated") - end, -}) - -worldedit.register_command("drain", { - params = "", - description = "Remove any fluid node within the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - -- TODO: make an API function for this - local count = 0 - local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) - for x = pos1.x, pos2.x do - for y = pos1.y, pos2.y do - for z = pos1.z, pos2.z do - local n = minetest.get_node({x=x, y=y, z=z}).name - local d = minetest.registered_nodes[n] - if d ~= nil and (d["drawtype"] == "liquid" or d["drawtype"] == "flowingliquid") then - minetest.remove_node({x=x, y=y, z=z}) - count = count + 1 - end - end - end - end - worldedit.player_notify(name, count .. " nodes updated") - end, -}) - -local clearcut_cache - -local function clearcut(pos1, pos2) - -- decide which nodes we consider plants - if clearcut_cache == nil then - clearcut_cache = {} - for name, def in pairs(minetest.registered_nodes) do - local groups = def.groups or {} - if ( - -- the groups say so - groups.flower or groups.grass or groups.flora or groups.plant or - groups.leaves or groups.tree or groups.leafdecay or groups.sapling or - -- drawtype heuristic - (def.is_ground_content and def.buildable_to and - (def.sunlight_propagates or not def.walkable) - and def.drawtype == "plantlike") or - -- if it's flammable, it probably needs to go too - (def.is_ground_content and not def.walkable and groups.flammable) - ) then - clearcut_cache[name] = true - end - end - end - local plants = clearcut_cache - - local count = 0 - local prev, any - - for x = pos1.x, pos2.x do - for z = pos1.z, pos2.z do - prev = false - any = false - -- first pass: remove floating nodes that would be left over - for y = pos1.y, pos2.y do - local n = minetest.get_node({x=x, y=y, z=z}).name - if plants[n] then - prev = true - any = true - elseif prev then - local def = minetest.registered_nodes[n] or {} - local groups = def.groups or {} - if groups.attached_node or (def.buildable_to and groups.falling_node) then - minetest.remove_node({x=x, y=y, z=z}) - count = count + 1 - else - prev = false - end - end - end - - -- second pass: remove plants, top-to-bottom to avoid item drops - if any then - for y = pos2.y, pos1.y, -1 do - local n = minetest.get_node({x=x, y=y, z=z}).name - if plants[n] then - minetest.remove_node({x=x, y=y, z=z}) - count = count + 1 - end - end - end - end - end - - return count -end - -worldedit.register_command("clearcut", { - params = "", - description = "Remove any plant, tree or foilage-like nodes in the selected region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) - local count = clearcut(pos1, pos2) - worldedit.player_notify(name, count .. " nodes removed") - end, -}) - -worldedit.register_command("hide", { - params = "", - description = "Hide all nodes in the current WorldEdit region non-destructively", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.hide(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " nodes hidden") - end, -}) - -worldedit.register_command("suppress", { - params = "", - description = "Suppress all in the current WorldEdit region non-destructively", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local node = worldedit.normalize_nodename(param) - if not node then - return false, "invalid node name: " .. param - end - return true, node - end, - nodes_needed = check_region, - func = function(name, node) - local count = worldedit.suppress(worldedit.pos1[name], worldedit.pos2[name], node) - worldedit.player_notify(name, count .. " nodes suppressed") - end, -}) - -worldedit.register_command("highlight", { - params = "", - description = "Highlight in the current WorldEdit region by hiding everything else non-destructively", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - local node = worldedit.normalize_nodename(param) - if not node then - return false, "invalid node name: " .. param - end - return true, node - end, - nodes_needed = check_region, - func = function(name, node) - local count = worldedit.highlight(worldedit.pos1[name], worldedit.pos2[name], node) - worldedit.player_notify(name, count .. " nodes highlighted") - end, -}) - -worldedit.register_command("restore", { - params = "", - description = "Restores nodes hidden with WorldEdit in the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.restore(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " nodes restored") - end, -}) - -local function detect_misaligned_schematic(name, pos1, pos2) - pos1, pos2 = worldedit.sort_pos(pos1, pos2) - -- Check that allocate/save can position the schematic correctly - -- The expected behaviour is that the (0,0,0) corner of the schematic stays - -- sat pos1, this only works when the minimum position is actually present - -- in the schematic. - local node = minetest.get_node(pos1) - local have_node_at_origin = node.name ~= "air" and node.name ~= "ignore" - if not have_node_at_origin then - worldedit.player_notify(name, - "Warning: The schematic contains excessive free space and WILL be ".. - "misaligned when allocated or loaded. To avoid this, shrink your ".. - "area to cover exactly the nodes to be saved." - ) - end -end - -worldedit.register_command("save", { - params = "", - description = "Save the current WorldEdit region to \"(world folder)/schems/.we\"", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - local result, count = worldedit.serialize(worldedit.pos1[name], - worldedit.pos2[name]) - detect_misaligned_schematic(name, worldedit.pos1[name], worldedit.pos2[name]) - - local path = minetest.get_worldpath() .. "/schems" - -- Create directory if it does not already exist - minetest.mkdir(path) - - local filename = path .. "/" .. param .. ".we" - local file, err = io.open(filename, "wb") - if err ~= nil then - worldedit.player_notify(name, "Could not save file to \"" .. filename .. "\"") - return - end - file:write(result) - file:flush() - file:close() - - worldedit.player_notify(name, count .. " nodes saved") - end, -}) - -worldedit.register_command("allocate", { - params = "", - description = "Set the region defined by nodes from \"(world folder)/schems/.we\" as the current WorldEdit region", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - func = function(name, param) - local pos = worldedit.pos1[name] - - local filename = minetest.get_worldpath() .. "/schems/" .. param .. ".we" - local file, err = io.open(filename, "rb") - if err ~= nil then - worldedit.player_notify(name, "could not open file \"" .. filename .. "\"") - return - end - local value = file:read("*a") - file:close() - - local version = worldedit.read_header(value) - if version == nil or version == 0 then - worldedit.player_notify(name, "File is invalid!") - return - elseif version > worldedit.LATEST_SERIALIZATION_VERSION then - worldedit.player_notify(name, "File was created with newer version of WorldEdit!") - return - end - local nodepos1, nodepos2, count = worldedit.allocate(pos, value) - - if not nodepos1 then - worldedit.player_notify(name, "Schematic empty, nothing allocated") - return - end - - worldedit.pos1[name] = nodepos1 - worldedit.pos2[name] = nodepos2 - worldedit.marker_update(name) - - worldedit.player_notify(name, count .. " nodes allocated") - end, -}) - -worldedit.register_command("load", { - params = "", - description = "Load nodes from \"(world folder)/schems/[.we[m]]\" with position 1 of the current WorldEdit region as the origin", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - func = function(name, param) - local pos = worldedit.pos1[name] - - if param == "" then - worldedit.player_notify(name, "invalid usage: " .. param) - return - end - if not string.find(param, "^[%w \t.,+-_=!@#$%%^&*()%[%]{};'\"]+$") then - worldedit.player_notify(name, "invalid file name: " .. param) - return - end - - --find the file in the world path - local testpaths = { - minetest.get_worldpath() .. "/schems/" .. param, - minetest.get_worldpath() .. "/schems/" .. param .. ".we", - minetest.get_worldpath() .. "/schems/" .. param .. ".wem", - } - local file, err - for index, path in ipairs(testpaths) do - file, err = io.open(path, "rb") - if not err then - break - end - end - if err then - worldedit.player_notify(name, "could not open file \"" .. param .. "\"") - return - end - local value = file:read("*a") - file:close() - - local version = worldedit.read_header(value) - if version == nil or version == 0 then - worldedit.player_notify(name, "File is invalid!") - return - elseif version > worldedit.LATEST_SERIALIZATION_VERSION then - worldedit.player_notify(name, "File was created with newer version of WorldEdit!") - return - end - - local count = worldedit.deserialize(pos, value) - - worldedit.player_notify(name, count .. " nodes loaded") - end, -}) - -worldedit.register_command("lua", { - params = "", - description = "Executes as a Lua chunk in the global namespace", - privs = {worldedit=true, server=true}, - parse = function(param) - return true, param - end, - func = function(name, param) - local err = worldedit.lua(param) - if err then - worldedit.player_notify(name, "code error: " .. err) - minetest.log("action", name.." tried to execute "..param) - else - worldedit.player_notify(name, "code successfully executed", false) - minetest.log("action", name.." executed "..param) - end - end, -}) - -worldedit.register_command("luatransform", { - params = "", - description = "Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region", - privs = {worldedit=true, server=true}, - require_pos = 2, - parse = function(param) - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - local err = worldedit.luatransform(worldedit.pos1[name], worldedit.pos2[name], param) - if err then - worldedit.player_notify(name, "code error: " .. err, false) - minetest.log("action", name.." tried to execute luatransform "..param) - else - worldedit.player_notify(name, "code successfully executed", false) - minetest.log("action", name.." executed luatransform "..param) - end - end, -}) - -worldedit.register_command("mtschemcreate", { - params = "", - description = "Save the current WorldEdit region using the Minetest ".. - "Schematic format to \"(world folder)/schems/.mts\"", - privs = {worldedit=true}, - require_pos = 2, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - nodes_needed = check_region, - func = function(name, param) - local path = minetest.get_worldpath() .. "/schems" - -- Create directory if it does not already exist - minetest.mkdir(path) - - local filename = path .. "/" .. param .. ".mts" - local ret = minetest.create_schematic(worldedit.pos1[name], - worldedit.pos2[name], worldedit.prob_list[name], - filename) - if ret == nil then - worldedit.player_notify(name, "Failed to create Minetest schematic") - else - worldedit.player_notify(name, "Saved Minetest schematic to " .. param) - end - worldedit.prob_list[name] = {} - end, -}) - -worldedit.register_command("mtschemplace", { - params = "", - description = "Load nodes from \"(world folder)/schems/.mts\" with position 1 of the current WorldEdit region as the origin", - privs = {worldedit=true}, - require_pos = 1, - parse = function(param) - if param == "" then - return false - end - if not check_filename(param) then - return false, "Disallowed file name: " .. param - end - return true, param - end, - func = function(name, param) - local pos = worldedit.pos1[name] - - local path = minetest.get_worldpath() .. "/schems/" .. param .. ".mts" - if minetest.place_schematic(pos, path) == nil then - worldedit.player_notify(name, "failed to place Minetest schematic") - else - worldedit.player_notify(name, "placed Minetest schematic " .. param .. - " at " .. minetest.pos_to_string(pos)) - end - end, -}) - -worldedit.register_command("mtschemprob", { - params = "start/finish/get", - description = "Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry", - privs = {worldedit=true}, - parse = function(param) - if param ~= "start" and param ~= "finish" and param ~= "get" then - return false, "unknown subcommand: " .. param - end - return true, param - end, - func = function(name, param) - if param == "start" then --start probability setting - worldedit.set_pos[name] = "prob" - worldedit.prob_list[name] = {} - worldedit.player_notify(name, "select Minetest schematic probability values by punching nodes") - elseif param == "finish" then --finish probability setting - worldedit.set_pos[name] = nil - worldedit.player_notify(name, "finished Minetest schematic probability selection") - elseif param == "get" then --get all nodes that had probabilities set on them - local text = "" - local problist = worldedit.prob_list[name] - if problist == nil then - return - end - for k,v in pairs(problist) do - local prob = math.floor(((v.prob / 256) * 100) * 100 + 0.5) / 100 - text = text .. minetest.pos_to_string(v.pos) .. ": " .. prob .. "% | " - end - worldedit.player_notify(name, "currently set node probabilities:") - worldedit.player_notify(name, text) - end - end, -}) - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "prob_val_enter" and not (fields.text == "" or fields.text == nil) then - local name = player:get_player_name() - local prob_entry = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} - local index = table.getn(worldedit.prob_list[name]) + 1 - worldedit.prob_list[name][index] = prob_entry - end -end) - -worldedit.register_command("clearobjects", { - params = "", - description = "Clears all objects within the WorldEdit region", - privs = {worldedit=true}, - require_pos = 2, - nodes_needed = check_region, - func = function(name) - local count = worldedit.clear_objects(worldedit.pos1[name], worldedit.pos2[name]) - worldedit.player_notify(name, count .. " objects cleared") - end, -}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt b/mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt new file mode 100644 index 00000000..33433cb8 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/locale/template.txt @@ -0,0 +1,153 @@ +# textdomain: worldedit_commands +Outset the selected region.= +Invalid direction: @1= +Invalid number of arguments= +Region outset by @1 nodes= +Inset the selected region.= +Region inset by @1 nodes= +Shifts the selection area without moving its contents= +Invalid if looking straight up or down= +Region shifted by @1 nodes= +Expands the selection in the selected absolute or relative axis= +Region expanded by @1 nodes= +Contracts the selection in the selected absolute or relative axis= +Region contracted by @1 nodes= +Select a cube with side length around position 1 and run on region= +invalid usage: @1 cannot be used with cubeapply= +Missing privileges: @1= +Region operations= +Can use WorldEdit commands= +no region selected= +no position 1 selected= +invalid usage= +ERROR: the operation was cancelled because the region has changed.= +Could not open file "@1"= +Invalid file format!= +Schematic was created with a newer version of WorldEdit.= +Get information about the WorldEdit mod= +WorldEdit @1 is available on this server. Type @2 to get a list of commands, or find more information at @3= +Get help for WorldEdit commands= +alias to @1= +You are not allowed to use any WorldEdit commands.= +Available commands: @1@nUse '@2' to get more information, or '@3' to list everything.= +Available commands:@n= +Command not available: = +Enable or disable node inspection= +inspector: inspection enabled for @1, currently facing the @2 axis= +inspector: inspection disabled= +inspector: @1 at @2 (param1@=@3, param2@=@4, received light@=@5) punched facing the @6 axis= +Reset the region so that it is empty= +region reset= +Show markers at the region positions= +region marked= +Hide markers if currently shown= +region unmarked= +Set WorldEdit region position @1 to the player's location= +position @1 set to @2= +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region= +unknown subcommand: @1= +select positions by punching two nodes= +select position @1 by punching a node= +position @1: @2= +position @1 not set= +Set a WorldEdit region position to the position at (, , )= +Display the volume of the current WorldEdit region= +current region has a volume of @1 nodes (@2*@3*@4)= +Remove all MapBlocks (16x16x16) containing the selected area from the map= +Node manipulation= +Area deleted.= +There was an error during deletion of the area.= +Set the current WorldEdit region to = +invalid node name: @1= +@1 nodes set= +Set param2 of all nodes in the current WorldEdit region to = +Param2 is out of range (must be between 0 and 255 inclusive!)= +@1 nodes altered= +Fill the current WorldEdit region with a random mix of , ...= +invalid search node name: @1= +invalid replace node name: @1= +Replace all instances of with in the current WorldEdit region= +@1 nodes replaced= +Replace all nodes other than with in the current WorldEdit region= +Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .= +Shapes= +@1 nodes added= +Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .= +Add hollow sphere centered at WorldEdit position 1 with radius , composed of = +Add sphere centered at WorldEdit position 1 with radius , composed of = +Add hollow dome centered at WorldEdit position 1 with radius , composed of = +Add dome centered at WorldEdit position 1 with radius , composed of = +Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of = +Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of = +Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of = +Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of = +Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of = +Copy the current WorldEdit region along the given axis by nodes= +Transformations= +@1 nodes copied= +Move the current WorldEdit region along the given axis by nodes= +@1 nodes moved= +Stack the current WorldEdit region along the given axis times= +@1 nodes stacked= +Stack the current WorldEdit region times by offset , , = +invalid count: @1= +invalid increments: @1= +Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin= +invalid scaling factors: @1= +@1 nodes stretched= +Transpose the current WorldEdit region along the given axes= +invalid usage: axes must be different= +@1 nodes transposed= +Flip the current WorldEdit region along the given axis= +@1 nodes flipped= +Rotate the current WorldEdit region around the given axis by angle (90 degree increment)= +invalid usage: angle must be multiple of 90= +@1 nodes rotated= +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)= +@1 nodes oriented= +Fix the lighting in the current WorldEdit region= +@1 nodes updated= +Remove any fluid node within the current WorldEdit region= +Remove any plant, tree or foliage-like nodes in the selected region= +@1 nodes removed= +Hide all nodes in the current WorldEdit region non-destructively= +@1 nodes hidden= +Suppress all in the current WorldEdit region non-destructively= +@1 nodes suppressed= +Highlight in the current WorldEdit region by hiding everything else non-destructively= +@1 nodes highlighted= +Restores nodes hidden with WorldEdit in the current WorldEdit region= +@1 nodes restored= +Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.= +Save the current WorldEdit region to "(world folder)/schems/.we"= +Schematics= +Disallowed file name: @1= +Could not save file to "@1"= +@1 nodes saved= +Set the region defined by nodes from "(world folder)/schems/.we" as the current WorldEdit region= +Schematic empty, nothing allocated= +@1 nodes allocated= +Load nodes from "(world folder)/schems/[.we[m]]" with position 1 of the current WorldEdit region as the origin= +Loading failed!= +@1 nodes loaded= +Executes as a Lua chunk in the global namespace= +Code= +Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region= +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/.mts"= +Failed to create Minetest schematic= +Saved Minetest schematic to @1= +Load nodes from "(world folder)/schems/.mts" with position 1 of the current WorldEdit region as the origin= +failed to place Minetest schematic= +placed Minetest schematic @1 at @2= +Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry= +select Minetest schematic probability values by punching nodes= +finished Minetest schematic probability selection= +currently set node probabilities:= +invalid node probability given, not saved= +Clears all objects within the WorldEdit region= +@1 objects cleared= +WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel= +Confirm a pending operation= +no operation pending= +Abort a pending operation= +WorldEdit Wand tool@nLeft-click to set 1st position, right-click to set 2nd= diff --git a/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr new file mode 100644 index 00000000..61ffb90c --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.de.tr @@ -0,0 +1,164 @@ +# textdomain: worldedit_commands +## +# Ãœbersetzungshinweise: +# node = Block +# command = Befehl +# region = Gebiet +# position 1/2 = Position 1/2 +# schematic = Schematic +# Der Anwender wird gesiezt. +# Diese Datei auf Rechtschreibfehler prüfen (unter Linux): +# sed -rne 's|^.*[^@]=(.*)$|\1|gp' worldedit_commands/locale/worldedit_commands.de.tr | sed -re 's/\b(WorldEdit|Schematic|Minetest)\b/Beispiel/g' | LANG=de_DE.UTF-8 hunspell -L +## +Outset the selected region.=Ausgewähltes Gebiet vergrößern. +Invalid direction: @1=Ungültige Richtung: @1 +Invalid number of arguments=Ungültige Anzahl der Argumente +Region outset by @1 nodes=Gebiet um @1 Blöcke vergrößert +Inset the selected region.=Ausgewähltes Gebiet verkleinern. +Region inset by @1 nodes=Gebiet um @1 Blöcke verkleinert +Shifts the selection area without moving its contents=Verschiebt das ausgewählte Gebiet ohne dessen Inhalt +Invalid if looking straight up or down=Nicht zulässig bei gerader Blickrichtung nach unten oder oben +Region shifted by @1 nodes=Gebiet um @1 Blöcke verschoben +Expands the selection in the selected absolute or relative axis=Erweitert das Gebiet in Richtung einer absoluten oder relativen Achse +Region expanded by @1 nodes=Gebiet um @1 Blöcke erweitert +Contracts the selection in the selected absolute or relative axis=Schrumpft das Gebiet in Richtung einer absoluten oder relativen Achse +Region contracted by @1 nodes=Gebiet um @1 Blöcke geschrumpft +Select a cube with side length around position 1 and run on region=Einen Würfel mit Seitenlänge um Position 1 auswählen und auf diesem Gebiet ausführen +invalid usage: @1 cannot be used with cubeapply=Ungültige Verwendung: @1 kann nicht mit cubeapply verwendet werden +Missing privileges: @1=Fehlende Privilegien: @1 +Region operations=Gebietsoperationen +Can use WorldEdit commands=Kann WorldEdit-Befehle benutzen +no region selected=Kein Gebiet ausgewählt +no position 1 selected=Keine Position 1 ausgewählt +invalid usage=Ungültige Verwendung +ERROR: the operation was cancelled because the region has changed.=FEHLER: Der Vorgang wurde abgebrochen, weil das Gebiet verändert wurde. +Could not open file "@1"=Konnte die Datei „@1“ nicht öffnen +Invalid file format!=Ungültiges Dateiformat! +Schematic was created with a newer version of WorldEdit.=Schematic wurde mit einer neueren Version von WorldEdit erstellt. +Get information about the WorldEdit mod=Informationen über die WorldEdit-Mod erhalten +WorldEdit @1 is available on this server. Type @2 to get a list of commands, or find more information at @3=WorldEdit @1 ist auf diesem Server verfügbar. Nutzen Sie @2, um eine Liste der Befehle zu erhalten, oder finden Sie weitere Informationen unter @3 +Get help for WorldEdit commands=Hilfe für WorldEdit-Befehle erhalten +alias to @1=Alias für @1 +You are not allowed to use any WorldEdit commands.=Ihnen ist nicht erlaubt, WorldEdit-Befehle zu nutzen. +Available commands: @1@nUse '@2' to get more information, or '@3' to list everything.=Verfügbare Befehle: @1@n„@2“ benutzen, um mehr Informationen zu erhalten, oder „@3“, um alles aufzulisten. +Available commands:@n=Verfügbare Befehle:@n +Command not available: =Befehl nicht verfügbar: +Enable or disable node inspection=Inspizieren von Blöcken ein- oder ausschalten +inspector: inspection enabled for @1, currently facing the @2 axis=Inspektur: für @1 aktiviert, aktuell der @2-Achse zugewandt +inspector: inspection disabled=Inspektur: deaktiviert +inspector: @1 at @2 (param1@=@3, param2@=@4, received light@=@5) punched facing the @6 axis=Inspektur: @1 bei @2 (param1@=@3, param2@=@4, einfallendes Licht@=@5), der „@6“-Achse zugewandt, gehauen +Reset the region so that it is empty=Gebiet zurücksetzen, sodass es leer ist +region reset=Gebiet zurückgesetzt +Show markers at the region positions=Markierungen bei den Gebietspositionen anzeigen +region marked=Gebiet markiert +Hide markers if currently shown=Markierungen verstecken, falls derzeit sichtbar +region unmarked=Gebiet nicht mehr markiert +Set WorldEdit region position @1 to the player's location=Position @1 des WorldEdit-Gebiets auf die Position des Spielers setzen +position @1 set to @2=Position @1 auf @2 gesetzt +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region=WorldEdit-Gebiet, WorldEdit-Position 1 oder WorldEdit-Position 2 durch Schlagen von Blöcken setzen oder aktuelles WorldEdit-Gebiet anzeigen +unknown subcommand: @1=Unbekannter Unterbefehl: @1 +select positions by punching two nodes=Wählen Sie die Position durch Hauen zweier Blöcke +select position @1 by punching a node=Wählen Sie Position @1 durch Hauen eines Blocks +position @1: @2=Position @1: @2 +position @1 not set=Position @1 ist nicht gesetzt +Set a WorldEdit region position to the position at (, , )=Eine Position des WorldEdit-Gebiets auf (, , ) setzen +Display the volume of the current WorldEdit region=Volumen des aktuellen WorldEdit-Gebiets anzeigen +current region has a volume of @1 nodes (@2*@3*@4)=Das aktuelle Gebiet hat ein Volumen von @1 Blöcken (@2×@3×@4) +Remove all MapBlocks (16x16x16) containing the selected area from the map=Alle Kartenblöcke (16×16×16) entfernen, die das gewählte Gebiet enthalten +Node manipulation=Block-Manipulation +Area deleted.=Gebiet gelöscht. +There was an error during deletion of the area.=Während des Löschens des Gebiets trat ein Fehler auf. +Set the current WorldEdit region to =Das aktuelle WorldEdit-Gebiet mit füllen +invalid node name: @1=Ungültiger Blockname: @1 +@1 nodes set=@1 Blöcke gesetzt +Set param2 of all nodes in the current WorldEdit region to =Den param2 aller Blocke im aktuellen WorldEdit-Gebiet auf setzen +Param2 is out of range (must be between 0 and 255 inclusive!)=Param2 muss zwischen 0 und 255 (inklusiv) sein +@1 nodes altered=@1 Blöcke verändert +Fill the current WorldEdit region with a random mix of , ...=Das aktuelle WorldEdit-Gebiet mit einer zufälligen Mischung aus , … füllen +invalid search node name: @1=Ungültiger Blockname für die Suche: @1 +invalid replace node name: @1=Ungültiger Blockname für das Ersetzen: @1 +Replace all instances of with in the current WorldEdit region=Alle Vorkommen von im aktuellen WorldEdit-Gebiet mit ersetzen +@1 nodes replaced=@1 Blöcke ersetzt +Replace all nodes other than with in the current WorldEdit region=Alle Blöcke außer im aktuellen WorldEdit-Gebiet mit ersetzen +Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=Einen hohlen Würfel mit der Unterseite zentriert auf WorldEdit-Position 1 setzen, mit den Abmessungen ××, bestehend aus . +Shapes=Formen +@1 nodes added=@1 Blöcke hinzugefügt +Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=Einen Würfel mit der Unterseite zentriert auf WorldEdit-Position 1 setzen, mit den Abmessungen ××, bestehend aus . +Add hollow sphere centered at WorldEdit position 1 with radius , composed of =Eine hohle Kugel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add sphere centered at WorldEdit position 1 with radius , composed of =Eine Kugel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add hollow dome centered at WorldEdit position 1 with radius , composed of =Eine hohle Kuppel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add dome centered at WorldEdit position 1 with radius , composed of =Eine Kuppel zentriert auf WorldEdit-Position 1 setzen mit Radius , bestehend aus +Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =Einen hohlen Zylinder zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge , Bodenradius (und oberen Radius [radius2]) setzen, bestehend aus +Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =Einen Zylinder zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge , Bodenradius (und oberen Radius [radius2]) setzen, bestehend aus +Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of =Eine hohle Pyramide zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge setzen, bestehend aus +Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of =Eine Pyramide zentriert auf WorldEdit-Position 1 entlang der gegebenen Achse mit Länge setzen, bestehend aus +Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of =Eine Spirale zentriert auf WorldEdit-Position 1 mit Seitenlänge , Höhe , Wandabstand setzen, bestehend aus +Copy the current WorldEdit region along the given axis by nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um Blöcke kopieren +Transformations=Transformationen +@1 nodes copied=@1 Blöcke kopiert +Move the current WorldEdit region along the given axis by nodes=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse um Blöcke verschieben +@1 nodes moved=@1 Blöcke verschoben +Stack the current WorldEdit region along the given axis times=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse mal stapeln +@1 nodes stacked=@1 Blöcke gestapelt +Stack the current WorldEdit region times by offset , , =Das aktuelle WorldEdit-Gebiet mal um , , versetzt stapeln +invalid count: @1=Ungültige Anzahl: @1 +invalid increments: @1=Ungültige Schrittweite: @1 +Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin=Die aktuellen WorldEdit-Positionen und -Region um einen Faktor von , , entlang der X-, Y- und Z-Achsen skalieren, mit Position 1 als Ausgangspunkt +invalid scaling factors: @1=Ungültige Skalierungsfaktoren: @1 +@1 nodes stretched=@1 Blöcke gestreckt +Transpose the current WorldEdit region along the given axes=Das aktuelle WorldEdit-Gebiet entlang den gegebenen Achsen transponieren +invalid usage: axes must be different=Ungültige Verwendung: Achsen müssen verschieden sein +@1 nodes transposed=@1 Blöcke transponiert +Flip the current WorldEdit region along the given axis=Das aktuelle WorldEdit-Gebiet entlang der gegebenen Achse spiegeln +@1 nodes flipped=@1 Blöcke gespiegelt +Rotate the current WorldEdit region around the given axis by angle (90 degree increment)=Das aktuelle WorldEdit-Gebiet um der gegebenen Achse um den Winkel rotieren (90-Grad-Schritte) +invalid usage: angle must be multiple of 90=Ungültige Verwendung: Winkel muss ein Vielfaches von 90 sein +@1 nodes rotated=@1 Blöcke rotiert +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)=Ausgerichtete Blöcke im aktuellen WorldEdit-Gebiet um die Y-Achse mit dem Winkel rotieren (90-Grad-Schritte) +@1 nodes oriented=@1 Blöcke ausgerichtet +Fix the lighting in the current WorldEdit region=Belichtung im aktuellen WorldEdit-Gebiet korrigieren +@1 nodes updated=@1 Blöcke verändert +Remove any fluid node within the current WorldEdit region=Alle flüssigen Blöcke im WorldEdit-Gebiet entfernen +Remove any plant, tree or foliage-like nodes in the selected region=Alle pflanzen-, baum- oder laubähnliche Blöcke im WorldEdit-Gebiet entfernen +@1 nodes removed=@1 Blöcke entfernt +Hide all nodes in the current WorldEdit region non-destructively=Alle Blöcke im WorldEdit-Gebiet nicht-destruktiv verstecken +@1 nodes hidden=@1 Blöcke versteckt +Suppress all in the current WorldEdit region non-destructively=Alle Blöcke vom Typ in der aktuellen WorldEdit-Region nicht-destruktiv verstecken +@1 nodes suppressed=@1 Blöcke versteckt +Highlight in the current WorldEdit region by hiding everything else non-destructively=Alle Blöcke vom Typ im WorldEdit-Gebiet hervorheben, indem alle anderen nicht-destruktiv versteckt werden +@1 nodes highlighted=@1 Blöcke hervorgehoben +Restores nodes hidden with WorldEdit in the current WorldEdit region=Stellt die von WorldEdit versteckten Blöcke im aktuellen WorldEdit-Gebiet wieder her +@1 nodes restored=@1 Blöcke wiederhergestellt +Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=Warnung: Das Schematic hat überschüssigen freien Platz und WIRD nach dem Laden falsch ausgerichtet sein. Um dies zu vermeiden, verkleinern Sie das Gebiet, sodass es die zu speichernden Blöcke exakt umfasst. +Save the current WorldEdit region to "(world folder)/schems/.we"=Das aktuelle WorldEdit-Gebiet in „(Weltordner)/schems/.we“ speichern +Schematics=Schematic +Disallowed file name: @1=Nicht erlaubter Dateiname: @1 +Could not save file to "@1"=Konnte die Datei nicht unter „@1“ speichern +@1 nodes saved=@1 Blöcke gespeichert +Set the region defined by nodes from "(world folder)/schems/.we" as the current WorldEdit region=Das aktuelle WorldEdit-Gebiet anhand der Blöcke in „(Weltordner)/schems/.we“ setzen +Schematic empty, nothing allocated=Schematic leer, nichts reserviert +@1 nodes allocated=@1 Blöcke reserviert +Load nodes from "(world folder)/schems/[.we[m]]" with position 1 of the current WorldEdit region as the origin=Blöcke aus „(Weltordner)/schems/[.we[m]]“ mit Position 1 als Ausgangspunkt laden +Loading failed!=Laden fehlgeschlagen! +@1 nodes loaded=@1 Blöcke geladen +Executes as a Lua chunk in the global namespace= als einen Lua-Chunk im globalen Namensraum ausführen +Code=Code +Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region=Führt als einen Lua-Chunk im globalen Namensraum aus, wobei die Variable pos verfügbar ist, für jeden Block im aktuellen WorldEdit-Gebiet +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/.mts"=Das aktuelle WorldEdit-Gebiet als Minetest-Schematic in „(Weltordner)/schems/.mts“ speichern +Failed to create Minetest schematic=Konnte Minetest-Schematic nicht erstellen +Saved Minetest schematic to @1=Minetest-Schematic in @1 gespeichert +Load nodes from "(world folder)/schems/.mts" with position 1 of the current WorldEdit region as the origin=Blöcke aus „(Weltordner)/schems/.mts“ mit Position 1 des aktuellen WorldEdit-Gebiets als Ausgangspunkt laden +failed to place Minetest schematic=Konnte Minetest-Schematic nicht platzieren +placed Minetest schematic @1 at @2=Minetest-Schematic @1 bei @2 platziert +Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry=Startet die Eingabe von Block-Wahrscheinlichkeiten für Minetest-Schematics, holt die Blöcke, welche Wahrscheinlichkeiten gesetzt haben, oder beendet die Eingabe von Block-Wahrscheinlichkeiten +select Minetest schematic probability values by punching nodes=Minetest-Schematic-Wahrscheinlichkeitswerte mit Hauen eingeben +finished Minetest schematic probability selection=Minetest-Schematic-Wahrscheinlichkeitsauswahl abgeschlossen +currently set node probabilities:=Momentan gesetzte Block-Wahrscheinlichkeiten: +invalid node probability given, not saved=Ungültige Block-Wahrscheinlichkeit übergeben, nicht gespeichert +Clears all objects within the WorldEdit region=Löscht alle Objekte innerhalb des WorldEdit-Gebiets +@1 objects cleared=@1 Objekte gelöscht +WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel=WARNUNG: Dieser Vorgang könnte bis zu @1 Blöcke betreffen; @2 zum Fortfahren oder @3 zum Abbrechen +Confirm a pending operation=Einen ausstehenden Vorgang bestätigen +no operation pending=Kein Vorgang ausstehend +Abort a pending operation=Einen ausstehenden Vorgang abbrechen +WorldEdit Wand tool@nLeft-click to set 1st position, right-click to set 2nd=WorldEdit-Zauberstab@nSetzen der 1. Position mit Linksklick, der 2. mit Rechtsklick diff --git a/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr new file mode 100644 index 00000000..af242689 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/locale/worldedit_commands.ru.tr @@ -0,0 +1,155 @@ +# textdomain: worldedit_commands + +### init.lua ### +Can use WorldEdit commands=ВозможноÑÑ‚ÑŒ редактировать мир Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команд WorldEdit + +no region selected=не выделен регион +no position 1 selected=не уÑтановлена Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° 1 +invalid usage=не верное иÑпользование команды +Could not open file "@1"=Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл "@1" +Invalid file format!=Ðе верный формат файла! +Schematic was created with a newer version of WorldEdit.=Схема была Ñоздана Ñ Ð¸Ñпользованием более новой верÑии WorldEdit. + +Get information about the WorldEdit mod=ВывеÑти информацию о WorldEdit +WorldEdit @1 is available on this server. Type @2 to get a list of commands, or get more information at @3=WorldEdit @1 доÑтупен на Ñтом Ñервере. Ðаберите команду @2 чтобы увидеть ÑпиÑок команд, больше информации по ÑÑылке @3 +Get help for WorldEdit commands=ВывеÑти информацию об иÑпользовании команд WorldEdit +You are not allowed to use any WorldEdit commands.=У Ð²Ð°Ñ Ð½ÐµÑ‚ привилегий, чтобы иÑпользовать команды WorldEdit. +Available commands: @1@nUse '@2' to get more information, or '@3' to list everything.=ДоÑтупные команды: @1@nИÑпользуйте '@2' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ по команде или '@3' Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° подÑказок по вÑем командам. +Available commands:@n=ДоÑтупные команды:@n +Command not available: =Команда не найдена: +Enable or disable node inspection=Включить/отключить инÑпекцию блоков +inspector: inspection enabled for @1, currently facing the @2 axis=inspector: инÑÐ¿ÐµÐºÑ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° Ð´Ð»Ñ @1, текущий взор в направлении оÑи @2 +inspector: inspection disabled=inspector: инÑÐ¿ÐµÐºÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° +inspector: @1 at @2 (param1@=@3, param2@=@4, received light@=@5) punched facing the @6 axis=inspector: @1 в @2 (param1@=@3, param2@=@4, received light@=@5) ударен по поверхноÑти @6 +Reset the region so that it is empty=СброÑить выделение облаÑти +region reset=регион Ñброшен +Show markers at the region positions=Отобразить маркеры выделенной облаÑти +region marked=маркеры отображены +Hide markers if currently shown=Скрыть маркеры выделенной облаÑти +region unmarked=маркеры Ñкрыты +Set WorldEdit region position @1 to the player's location=УÑтановить маркер @1 Ð´Ð»Ñ WorldEdit-региона в меÑте Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region=Выделить WorldEdit-регион или уÑтановить маркеры Ð´Ð»Ñ WorldEdit-региона, либо отобразить уже выбранную облаÑÑ‚ÑŒ +unknown subcommand: @1=неизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð´ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: @1 +select positions by punching two nodes=выберите позиции, ударив по блокам +select position @1 by punching a node=выберите позицию @1, ударив по блоку +position @1: @2=Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ @1: @2 +position @1 not set=Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ @1 не уÑтановлена +Set a WorldEdit region position to the position at (, , )=УÑтановить маркер Ð´Ð»Ñ WorldEdit в позиции (, , ) +position @1 set to @2=Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ @1 уÑтановлена в @2 +Display the volume of the current WorldEdit region=ВывеÑти информацию об объёме текущей выделенной облаÑти WorldEdit (кол-во нод, размеры) +current region has a volume of @1 nodes (@2*@3*@4)=текущий регион имеет объем @1 нод (@2*@3*@4) +Remove all MapBlocks (16x16x16) containing the selected area from the map=Удалить MapBlocks (16x16x16), Ñодержащие выбранную облаÑÑ‚ÑŒ +Area deleted.=ОблаÑÑ‚ÑŒ удалена. +There was an error during deletion of the area.=Что-то пошло не так при удалении облаÑти. +Set the current WorldEdit region to =Заполнить выбранный WorldEdit-регион указанным типом блоков +invalid node name: @1=неверное название блока: @1 +@1 nodes set=@1 блок(а/ов) уÑтановленно +Set param2 of all nodes in the current WorldEdit region to =ПроÑтавить param2 Ð´Ð»Ñ Ð²Ñех блоков в текущем WorldEdit-регионе +Param2 is out of range (must be between 0 and 255 inclusive!)=Значение param2 должно быть от 0 до 255 (включительно!) +@1 nodes altered=изменено @1 блок(а/ов) +Fill the current WorldEdit region with a random mix of , ...=Заполнить выбранный WorldEdit-регион ÑмеÑью указанных типов блоков +invalid search node name: @1=неверное название блока-поиÑка: @1 +invalid replace node name: @1=неверное название блока-замены: @1 +Replace all instances of with in the current WorldEdit region=Заменить вÑе блоки на в выбранной WorldEdit-облаÑти +@1 nodes replaced=заменено @1 нод(а/Ñ‹) +Replace all nodes other than with in the current WorldEdit region=Заменить вÑе блоки, кроме , на в выбранной WorldEdit-облаÑти +Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=УÑтановить полый куб Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ нижней грани в позиции 1 и указанными размерами, ÑоÑтоÑщий из блоков . +@1 nodes added=добавлен(о) @1 блок(а/ов) +Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of .=УÑтановить куб Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ нижней грани в позиции 1 и указанными размерами, ÑоÑтоÑщий из блоков . +Add hollow sphere centered at WorldEdit position 1 with radius , composed of =УÑтановить полую Ñферу Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 радиуÑом , ÑоÑтоÑщую из блоков +Add sphere centered at WorldEdit position 1 with radius , composed of =УÑтановить Ñферу Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 радиуÑом , ÑоÑтоÑщую из блоков +Add hollow dome centered at WorldEdit position 1 with radius , composed of =УÑтановить полый купол Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 радиуÑом , ÑоÑтоÑщий из блоков +Add dome centered at WorldEdit position 1 with radius , composed of =УÑтановить купол Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 радиуÑом , ÑоÑтоÑщий из блоков +Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =УÑтановить полый цилиндр вдоль указанной оÑи, Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в позиции 1, выÑотой/длинной , Ñ Ñ€Ð°Ð´Ð¸ÑƒÑом оÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ (и радиуÑом вершины [radius 2]), ÑоÑтоÑщий из блоков +Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of =УÑтановить цилиндр вдоль указанной оÑи, Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в позиции 1, выÑотой/длинной , Ñ Ñ€Ð°Ð´Ð¸ÑƒÑом оÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ (и радиуÑом вершины [radius 2]), ÑоÑтоÑщий из блоков +Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of =УÑтановить полую пирамиду вдоль указанной оÑи, Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 выÑотой , ÑоÑтоÑщую из блоков +Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of =УÑтановить пирамиду вдоль указанной оÑи, Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 выÑотой , ÑоÑтоÑщую из блоков +Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of =УÑтановить Ñпираль Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в WorldEdit-позиции 1 шириной , выÑотой и Ñ Ñ€Ð°ÑÑтоÑнием между витками , ÑоÑтоÑщую из блоков +Copy the current WorldEdit region along the given axis by nodes=Копировать текущий WorldEdit-регион Ñо Ñмещением вдоль указанной оÑи (x/y/z) на блоков +@1 nodes copied=Ñкопировано @1 нод(а/Ñ‹) +Move the current WorldEdit region along the given axis by nodes=ПеремеÑтить текущий WorldEdit-регион вдоль указанной оÑи (x/y/z) на блоков +@1 nodes moved=перемещено @1 нод(а/Ñ‹) +Stack the current WorldEdit region along the given axis times=Размножить текущий WorldEdit-регион вдоль указанной оÑи раз +@1 nodes stacked=размножено @1 нод(а/Ñ‹) +Stack the current WorldEdit region times by offset , , =Размножить текущий WorldEdit-регион раз Ñ ÑˆÐ°Ð³Ð¾Ð¼ , , по ÑоответÑтвующим оÑÑм +invalid count: @1=неверное количеÑтво: @1 +invalid increments: @1=неверные приращениÑ(шаг) +Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin=МаÑштабировать текущий WorldEdit-регион Ñ ÐºÐ¾Ñффициентами , , вдоль оÑей X, Y и Z, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ WorldEdit-позицию 1 в качеÑтве точки отÑчёта +invalid scaling factors: @1=неверные коÑффициенты маÑштабированиÑ: @1 +@1 nodes stretched=маÑштабировано @1 нод(а/Ñ‹) +Transpose the current WorldEdit region along the given axes=ТранÑпонировать текущий WorldEdit-регион по заданным оÑÑм. +invalid usage: axes must be different=недопуÑтимое иÑпользование: оÑи должны быть разными +@1 nodes transposed=транÑпонировано @1 нод(а/Ñ‹) +Flip the current WorldEdit region along the given axis=Перевернуть/Отразить текущий WorldEdit-регион вдоль указанной оÑи +@1 nodes flipped=отражено @1 нод(а/Ñ‹) +Rotate the current WorldEdit region around the given axis by angle (90 degree increment)=Повернуть текущий WorldEdit-регион вокруг оÑи на угол (шаг - 90 градуÑов) +invalid usage: angle must be multiple of 90=недопуÑтимое иÑпользование: угол должен быть кратен 90 +@1 nodes rotated=повёрнуто @1 нод(а/Ñ‹) +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)=Повернуть блоки в текущем WorldEdit-регионе вокруг оÑи Y на угол (шаг - 90 градуÑов) +@1 nodes oriented=повёрнуто @1 нод(а/Ñ‹) +Fix the lighting in the current WorldEdit region=ИÑправить оÑвещение в текущем WorldEdit-регионе +@1 nodes updated=обновлено @1 нод(а/Ñ‹) +Remove any fluid node within the current WorldEdit region=Удалить любые жидкоÑти в текущем WorldEdit-регионе +Remove any plant, tree or foliage-like nodes in the selected region=Удалить любые раÑтениÑ, Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¸Ð»Ð¸ лиÑтье-подобные ноды в текущем WorldEdit-регионе +@1 nodes removed=удалено @1 нод(а/Ñ‹) +Hide all nodes in the current WorldEdit region non-destructively=Скрыть узлы текущего WorldEdit-региона, не удалÑÑ Ð¸Ñ… +@1 nodes hidden=Ñкрыто @1 нод(а/Ñ‹) +Suppress all in the current WorldEdit region non-destructively=Скрыть вÑе блоки в текущем WorldEdit-регионе, не удалÑÑ Ð¸Ñ… +@1 nodes suppressed=Ñкрыто @1 нод(а/Ñ‹) +Highlight in the current WorldEdit region by hiding everything else non-destructively=Скрыть вÑе блоки, кроме , в текущем WorldEdit-регионе, не удалÑÑ Ð¸Ñ… +@1 nodes highlighted="подÑвечено" @1 нод(а/Ñ‹) +Restores nodes hidden with WorldEdit in the current WorldEdit region=ВоÑÑтановить Ñкрытые WorldEdit'ом узлы в текущем WorldEdit-регионе +@1 nodes restored=воÑÑтановлено @1 нод(а/Ñ‹) +Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.=Предупреждение: Схема Ñодержит Ñлишком много Ñвободного меÑта и будет Ñмещена при размещении или загрузке. Чтобы избежать Ñтого, уменьшите облаÑÑ‚ÑŒ так, чтобы она охватывала именно те узлы, которые необходимо Ñохранить. +Save the current WorldEdit region to "(world folder)/schems/.we"=Сохранить текущий WorldEdit-регион в файл "(world folder)/schems/.we" +Disallowed file name: @1=ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: @1 +Could not save file to "@1"=Ðе удалоÑÑŒ Ñохранить файл в "@1" +@1 nodes saved=Ñохранено @1 нод(а/Ñ‹) +Set the region defined by nodes from "(world folder)/schems/.we" as the current WorldEdit region=Выделить облаÑÑ‚ÑŒ, определённую узлами из "(world folder)/schems/.we", как текущий WorldEdit-регион +Schematic empty, nothing allocated=Схема пуÑта, ничего не выделено +@1 nodes allocated=выделено @1 нод(а/Ñ‹) +Load nodes from "(world folder)/schems/[.we[m]]" with position 1 of the current WorldEdit region as the origin=Загрузить регион из "(world folder)/schems/[.we[m]]" Ñ WorldEdit-позицией 1 в качеÑтве точки отÑчёта +Loading failed!=Ðе удалоÑÑŒ загрузить! +@1 nodes loaded=загружено @1 нод(а/Ñ‹) +Executes as a Lua chunk in the global namespace=Выполнить как Lua-код в глобальном проÑтранÑтве имён +Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region=Выполнить как Lua-код в глобальном проÑтранÑтве имён, Ñ Ð´Ð¾Ñтупом к переменным позиций Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ блока в текущем WordEdit-регионе +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/.mts"=Сохранить текущий WorldEdit-регион Ñ Ð¸Ñпользованием ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð² формат Minetest Schematic в файл "(world folder)/schems/.mts" +Failed to create Minetest schematic=Ðе удалоÑÑŒ Ñоздать Minetest-Ñхему +Saved Minetest schematic to @1=Minetest-Ñхема Ñохранена в @1 +Load nodes from "(world folder)/schems/.mts" with position 1 of the current WorldEdit region as the origin=Загрузить блоки из "(world folder)/schems/.mts" Ñ WorldEdit-позицией 1 в качеÑтве точки отÑчёта +failed to place Minetest schematic=не удалоÑÑŒ загрузить Minetest-Ñхему +placed Minetest schematic @1 at @2=Minetest-Ñхема @1 загружена в @2 +Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry=Ðачать запиÑÑŒ вероÑтноÑтей Ð´Ð»Ñ Minetest Schematic, ударÑÑ Ð¿Ð¾ блокам, закончить запиÑÑŒ вероÑтноÑтей или вывеÑти уже запиÑанные вероÑтноÑти +select Minetest schematic probability values by punching nodes=выберите Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ð¾ÑтноÑтей Ð´Ð»Ñ Minetest-Ñхемы, ÑƒÐ´Ð°Ñ€Ñ Ð¿Ð¾ нодам +finished Minetest schematic probability selection=выбор вероÑтноÑтей Ð´Ð»Ñ Minetest-Ñхемы завершен +currently set node probabilities:=заданные вероÑтноÑти нод на данный момент: +invalid node probability given, not saved=недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€Ð¾ÑтноÑÑ‚ÑŒ ноды, не Ñохранена +Clears all objects within the WorldEdit region=ОчиÑтить вÑе объекты в текущем WorldEdit-регионе +@1 objects cleared=очищено @1 объектов + +### safe.lua ### +WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel=ПРЕДУПРЕЖДЕÐИЕ: Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ затронуть до @1 нод; введите @2 Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ @3 Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ +Confirm a pending operation=Подтвердить отложенную операцию +no operation pending=нет ожидающей операции +Abort a pending operation=Отклонить отложенную операцию + +### cuboid.lua ### +Outset the selected region.=РаÑширить выделение региона. +Invalid direction: @1=ÐедопуÑтимое направление: @1 +Invalid number of arguments=ÐедопуÑтимое количеÑтво аргументов +Region outset by @1 nodes=Регион раÑширен на @1 нод(у/Ñ‹) +Inset the selected region.=Сузить выделение региона. +Region inset by @1 nodes=Регион Ñужен на @1 нод(у/Ñ‹) +Shifts the selection area without moving its contents=Сдвинуть выделение региона без Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ Ñодержимого +Invalid if looking straight up or down=ÐедопуÑтимо, еÑли Ñмотреть прÑмо вверх или вниз +Region shifted by @1 nodes=Регион Ñдвинут на @1 нод(у/Ñ‹) +Expands the selection in the selected absolute or relative axis=Увеличить выделение региона по выбранной абÑолютной или отноÑительной оÑи +Region expanded by @1 nodes=Регион увеличен на @1 нод(у/Ñ‹) +Contracts the selection in the selected absolute or relative axis=Уменьшить выделение региона по выбранной абÑолютной или отноÑительной оÑи +Region contracted by @1 nodes=Регион уменьшен на @1 нод(у/Ñ‹) +Select a cube with side length around position 1 and run on region=Выделить куб Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ Ñтороны вокруг позиции 1 и запуÑтите <команду> в облаÑти +invalid usage: @1 cannot be used with cubeapply=недопуÑтимое иÑпользование: @1 не может быть применено в cubeapply +Missing privileges: @1=ОтÑутÑтвуют привилегии: @1 + +### wand.lua ### +WorldEdit Wand tool@nLeft-click to set 1st position, right-click to set 2nd=ИнÑтрумент WorldEdit Wand@nÐ›ÐµÐ²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши, чтобы уÑтановить 1-ÑŽ позицию, Ð¿Ñ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши, чтобы уÑтановить 2-ÑŽ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua b/mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua new file mode 100644 index 00000000..2a6d36b0 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/manipulations.lua @@ -0,0 +1,366 @@ +local S = minetest.get_translator("worldedit_commands") + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + + +worldedit.register_command("deleteblocks", { + params = "", + description = S("Remove all MapBlocks (16x16x16) containing the selected area from the map"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local success = minetest.delete_area(pos1, pos2) + if success then + return true, S("Area deleted.") + else + return false, S("There was an error during deletion of the area.") + end + end, +}) + +worldedit.register_command("clearobjects", { + params = "", + description = S("Clears all objects within the WorldEdit region"), + category = S("Node manipulation"), -- not really, but it doesn't fit anywhere else + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.clear_objects(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 objects cleared", count) + end, +}) + +worldedit.register_command("set", { + params = "", + description = S("Set the current WorldEdit region to "), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local node = worldedit.normalize_nodename(param) + if not node then + return false, S("invalid node name: @1", param) + end + return true, node + end, + nodes_needed = check_region, + func = function(name, node) + local count = worldedit.set(worldedit.pos1[name], worldedit.pos2[name], node) + return true, S("@1 nodes set", count) + end, +}) + +worldedit.register_command("param2", { + params = "", + description = S("Set param2 of all nodes in the current WorldEdit region to "), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local param2 = tonumber(param) + if not param2 then + return false + elseif param2 < 0 or param2 > 255 then + return false, S("Param2 is out of range (must be between 0 and 255 inclusive!)") + end + return true, param2 + end, + nodes_needed = check_region, + func = function(name, param2) + local count = worldedit.set_param2(worldedit.pos1[name], worldedit.pos2[name], param2) + return true, S("@1 nodes altered", count) + end, +}) + +worldedit.register_command("mix", { + params = " [count1] [count2] ...", + description = S("Fill the current WorldEdit region with a random mix of , ..."), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local nodes = {} + for nodename in param:gmatch("[^%s]+") do + if tonumber(nodename) ~= nil and #nodes > 0 then + local last_node = nodes[#nodes] + for i = 1, tonumber(nodename) do + nodes[#nodes + 1] = last_node + end + else + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + nodes[#nodes + 1] = node + end + end + if #nodes == 0 then + return false + end + return true, nodes + end, + nodes_needed = check_region, + func = function(name, nodes) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.set(pos1, pos2, nodes) + return true, S("@1 nodes set", count) + end, +}) + +local check_replace = function(param) + local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+(.+)$") + if found == nil then + return false + end + local newsearchnode = worldedit.normalize_nodename(searchnode) + if not newsearchnode then + return false, S("invalid search node name: @1", searchnode) + end + local newreplacenode = worldedit.normalize_nodename(replacenode) + if not newreplacenode then + return false, S("invalid replace node name: @1", replacenode) + end + return true, newsearchnode, newreplacenode +end + +worldedit.register_command("replace", { + params = " ", + description = S("Replace all instances of with in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = check_replace, + nodes_needed = check_region, + func = function(name, search_node, replace_node) + local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], + search_node, replace_node) + return true, S("@1 nodes replaced", count) + end, +}) + +worldedit.register_command("replaceinverse", { + params = " ", + description = S("Replace all nodes other than with in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = check_replace, + nodes_needed = check_region, + func = function(name, search_node, replace_node) + local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], + search_node, replace_node, true) + return true, S("@1 nodes replaced", count) + end, +}) + +worldedit.register_command("fixlight", { + params = "", + description = S("Fix the lighting in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.fixlight(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes updated", count) + end, +}) + +local drain_cache + +local function drain(pos1, pos2) + if drain_cache == nil then + drain_cache = {} + for name, d in pairs(minetest.registered_nodes) do + if d.drawtype == "liquid" or d.drawtype == "flowingliquid" then + drain_cache[name] = true + end + end + end + + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local count = 0 + + local get_node, remove_node = minetest.get_node, minetest.remove_node + for x = pos1.x, pos2.x do + for y = pos1.y, pos2.y do + for z = pos1.z, pos2.z do + local p = vector.new(x, y, z) + local n = get_node(p).name + if drain_cache[n] then + remove_node(p) + count = count + 1 + end + end + end + end + return count +end + +worldedit.register_command("drain", { + params = "", + description = S("Remove any fluid node within the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = drain(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes updated", count) + end, +}) + +local clearcut_cache + +local function clearcut(pos1, pos2) + -- decide which nodes we consider plants + if clearcut_cache == nil then + clearcut_cache = {} + for name, def in pairs(minetest.registered_nodes) do + local groups = def.groups or {} + if ( + -- the groups say so + groups.flower or groups.grass or groups.flora or groups.plant or + groups.leaves or groups.tree or groups.leafdecay or groups.sapling or + -- drawtype heuristic + (def.is_ground_content and def.buildable_to and + (def.sunlight_propagates or not def.walkable) + and def.drawtype == "plantlike") or + -- if it's flammable, it probably needs to go too + (def.is_ground_content and not def.walkable and groups.flammable) + ) then + clearcut_cache[name] = true + end + end + end + local plants = clearcut_cache + + local count = 0 + local prev, any + + local get_node, remove_node = minetest.get_node, minetest.remove_node + for x = pos1.x, pos2.x do + for z = pos1.z, pos2.z do + prev = false + any = false + -- first pass: remove floating nodes that would be left over + for y = pos1.y, pos2.y do + local pos = vector.new(x, y, z) + local n = get_node(pos).name + if plants[n] then + prev = true + any = true + elseif prev then + local def = minetest.registered_nodes[n] or {} + local groups = def.groups or {} + if groups.attached_node or (def.buildable_to and groups.falling_node) then + remove_node(pos) + count = count + 1 + else + prev = false + end + end + end + + -- second pass: remove plants, top-to-bottom to avoid item drops + if any then + for y = pos2.y, pos1.y, -1 do + local pos = vector.new(x, y, z) + local n = get_node(pos).name + if plants[n] then + remove_node(pos) + count = count + 1 + end + end + end + end + end + + return count +end + +worldedit.register_command("clearcut", { + params = "", + description = S("Remove any plant, tree or foliage-like nodes in the selected region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local pos1, pos2 = worldedit.sort_pos(worldedit.pos1[name], worldedit.pos2[name]) + local count = clearcut(pos1, pos2) + return true, S("@1 nodes removed", count) + end, +}) + +worldedit.register_command("hide", { + params = "", + description = S("Hide all nodes in the current WorldEdit region non-destructively"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.hide(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes hidden", count) + end, +}) + +worldedit.register_command("suppress", { + params = "", + description = S("Suppress all in the current WorldEdit region non-destructively"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local node = worldedit.normalize_nodename(param) + if not node then + return false, S("invalid node name: @1", param) + end + return true, node + end, + nodes_needed = check_region, + func = function(name, node) + local count = worldedit.suppress(worldedit.pos1[name], worldedit.pos2[name], node) + return true, S("@1 nodes suppressed", count) + end, +}) + +worldedit.register_command("highlight", { + params = "", + description = S("Highlight in the current WorldEdit region by hiding everything else non-destructively"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local node = worldedit.normalize_nodename(param) + if not node then + return false, S("invalid node name: @1", param) + end + return true, node + end, + nodes_needed = check_region, + func = function(name, node) + local count = worldedit.highlight(worldedit.pos1[name], worldedit.pos2[name], node) + return true, S("@1 nodes highlighted", count) + end, +}) + +worldedit.register_command("restore", { + params = "", + description = S("Restores nodes hidden with WorldEdit in the current WorldEdit region"), + category = S("Node manipulation"), + privs = {worldedit=true}, + require_pos = 2, + nodes_needed = check_region, + func = function(name) + local count = worldedit.restore(worldedit.pos1[name], worldedit.pos2[name]) + return true, S("@1 nodes restored", count) + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/mark.lua b/mods/Minetest-WorldEdit/worldedit_commands/marker.lua similarity index 87% rename from mods/Minetest-WorldEdit/worldedit_commands/mark.lua rename to mods/Minetest-WorldEdit/worldedit_commands/marker.lua index a195280b..640f3730 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/mark.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/marker.lua @@ -6,16 +6,14 @@ local init_sentinel = "new" .. tostring(math.random(99999)) --marks worldedit region position 1 worldedit.mark_pos1 = function(name, region_too) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local pos1 = worldedit.pos1[name] if worldedit.marker1[name] ~= nil then --marker already exists worldedit.marker1[name]:remove() --remove marker worldedit.marker1[name] = nil end if pos1 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos1) + worldedit.keep_loaded(pos1, pos1) --add marker worldedit.marker1[name] = minetest.add_entity(pos1, "worldedit:pos1", init_sentinel) @@ -30,16 +28,14 @@ end --marks worldedit region position 2 worldedit.mark_pos2 = function(name, region_too) - local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local pos2 = worldedit.pos2[name] if worldedit.marker2[name] ~= nil then --marker already exists worldedit.marker2[name]:remove() --remove marker worldedit.marker2[name] = nil end if pos2 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos2, pos2) + worldedit.keep_loaded(pos2, pos2) --add marker worldedit.marker2[name] = minetest.add_entity(pos2, "worldedit:pos2", init_sentinel) @@ -77,15 +73,14 @@ worldedit.mark_region = function(name) local thickness = 0.2 local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos2) + -- TODO maybe we could skip this actually? + worldedit.keep_loaded(pos1, pos2) local markers = {} --XY plane markers for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do - local entpos = {x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z} + local entpos = vector.new(pos1.x + sizex - 0.5, pos1.y + sizey - 0.5, z) local marker = minetest.add_entity(entpos, "worldedit:region_cube", init_sentinel) if marker ~= nil then marker:set_properties({ @@ -99,7 +94,7 @@ worldedit.mark_region = function(name) --YZ plane markers for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do - local entpos = {x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5} + local entpos = vector.new(x, pos1.y + sizey - 0.5, pos1.z + sizez - 0.5) local marker = minetest.add_entity(entpos, "worldedit:region_cube", init_sentinel) if marker ~= nil then marker:set_properties({ diff --git a/mods/Minetest-WorldEdit/worldedit_commands/nodename.lua b/mods/Minetest-WorldEdit/worldedit_commands/nodename.lua new file mode 100644 index 00000000..ebf80e03 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/nodename.lua @@ -0,0 +1,85 @@ +-- Strips any kind of escape codes (translation, colors) from a string +-- https://github.com/minetest/minetest/blob/53dd7819277c53954d1298dfffa5287c306db8d0/src/util/string.cpp#L777 +local function strip_escapes(input) + local s = function(idx) return input:sub(idx, idx) end + local out = "" + local i = 1 + while i <= #input do + if s(i) == "\027" then -- escape sequence + i = i + 1 + if s(i) == "(" then -- enclosed + i = i + 1 + while i <= #input and s(i) ~= ")" do + if s(i) == "\\" then + i = i + 2 + else + i = i + 1 + end + end + end + else + out = out .. s(i) + end + i = i + 1 + end + --print(("%q -> %q"):format(input, out)) + return out +end + +local function string_endswith(full, part) + return full:find(part, 1, true) == #full - #part + 1 +end + +local description_cache = nil + +-- normalizes node "description" `nodename`, returning a string (or nil) +worldedit.normalize_nodename = function(nodename) + nodename = nodename:gsub("^%s*(.-)%s*$", "%1") -- strip spaces + if nodename == "" then return nil end + + local fullname = ItemStack({name=nodename}):get_name() -- resolve aliases + if minetest.registered_nodes[fullname] or fullname == "air" then -- full name + return fullname + end + nodename = nodename:lower() + + for key, _ in pairs(minetest.registered_nodes) do + if string_endswith(key:lower(), ":" .. nodename) then -- matches name (w/o mod part) + return key + end + end + + if description_cache == nil then + -- cache stripped descriptions + description_cache = {} + for key, value in pairs(minetest.registered_nodes) do + local desc = strip_escapes(value.description):gsub("\n.*", "", 1):lower() + if desc ~= "" then + description_cache[key] = desc + end + end + end + + for key, desc in pairs(description_cache) do + if desc == nodename then -- matches description + return key + end + end + for key, desc in pairs(description_cache) do + if desc == nodename .. " block" then + -- fuzzy description match (e.g. "Steel" == "Steel Block") + return key + end + end + + local match = nil + for key, value in pairs(description_cache) do + if value:find(nodename, 1, true) ~= nil then + if match ~= nil then + return nil + end + match = key -- substring description match (only if no ambiguities) + end + end + return match +end diff --git a/mods/Minetest-WorldEdit/worldedit_commands/primitives.lua b/mods/Minetest-WorldEdit/worldedit_commands/primitives.lua new file mode 100644 index 00000000..d36a403a --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/primitives.lua @@ -0,0 +1,276 @@ +local S = minetest.get_translator("worldedit_commands") + + +local check_cube = function(param) + local found, _, w, h, l, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(w), tonumber(h), tonumber(l), node +end + +worldedit.register_command("hollowcube", { + params = " ", + description = S("Add a hollow cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of ."), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cube, + nodes_needed = function(name, w, h, l, node) + return w * h * l + end, + func = function(name, w, h, l, node) + local count = worldedit.cube(worldedit.pos1[name], w, h, l, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("cube", { + params = " ", + description = S("Add a cube with its ground level centered at WorldEdit position 1 with dimensions x x , composed of ."), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cube, + nodes_needed = function(name, w, h, l, node) + return w * h * l + end, + func = function(name, w, h, l, node) + local count = worldedit.cube(worldedit.pos1[name], w, h, l, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_sphere = function(param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(radius), node +end + +worldedit.register_command("hollowsphere", { + params = " ", + description = S("Add hollow sphere centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_sphere, + nodes_needed = function(name, radius, node) + return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere + end, + func = function(name, radius, node) + local count = worldedit.sphere(worldedit.pos1[name], radius, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("sphere", { + params = " ", + description = S("Add sphere centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_sphere, + nodes_needed = function(name, radius, node) + return math.ceil((4 * math.pi * (radius ^ 3)) / 3) --volume of sphere + end, + func = function(name, radius, node) + local count = worldedit.sphere(worldedit.pos1[name], radius, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_dome = function(param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(radius), node +end + +worldedit.register_command("hollowdome", { + params = " ", + description = S("Add hollow dome centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_dome, + nodes_needed = function(name, radius, node) + return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome + end, + func = function(name, radius, node) + local count = worldedit.dome(worldedit.pos1[name], radius, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("dome", { + params = " ", + description = S("Add dome centered at WorldEdit position 1 with radius , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_dome, + nodes_needed = function(name, radius, node) + return math.ceil((2 * math.pi * (radius ^ 3)) / 3) --volume of dome + end, + func = function(name, radius, node) + local count = worldedit.dome(worldedit.pos1[name], radius, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_cylinder = function(param) + -- two radii + local found, _, axis, length, radius1, radius2, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + -- single radius + found, _, axis, length, radius1, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") + radius2 = radius1 + end + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, axis, tonumber(length), tonumber(radius1), tonumber(radius2), node +end + +worldedit.register_command("hollowcylinder", { + params = "x/y/z/? [radius2] ", + description = S("Add hollow cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cylinder, + nodes_needed = function(name, axis, length, radius1, radius2, node) + local radius = math.max(radius1, radius2) + return math.ceil(math.pi * (radius ^ 2) * length) + end, + func = function(name, axis, length, radius1, radius2, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + length = length * sign + end + local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("cylinder", { + params = "x/y/z/? [radius2] ", + description = S("Add cylinder at WorldEdit position 1 along the given axis with length , base radius (and top radius [radius2]), composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_cylinder, + nodes_needed = function(name, axis, length, radius1, radius2, node) + local radius = math.max(radius1, radius2) + return math.ceil(math.pi * (radius ^ 2) * length) + end, + func = function(name, axis, length, radius1, radius2, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + length = length * sign + end + local count = worldedit.cylinder(worldedit.pos1[name], axis, length, radius1, radius2, node) + return true, S("@1 nodes added", count) + end, +}) + +local check_pyramid = function(param) + local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, axis, tonumber(height), node +end + +worldedit.register_command("hollowpyramid", { + params = "x/y/z/? ", + description = S("Add hollow pyramid centered at WorldEdit position 1 along the given axis with height , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_pyramid, + nodes_needed = function(name, axis, height, node) + return math.ceil(((height * 2 + 1) ^ 2) * height / 3) + end, + func = function(name, axis, height, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + height = height * sign + end + local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node, true) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("pyramid", { + params = "x/y/z/? ", + description = S("Add pyramid centered at WorldEdit position 1 along the given axis with height , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = check_pyramid, + nodes_needed = function(name, axis, height, node) + return math.ceil(((height * 2 + 1) ^ 2) * height / 3) + end, + func = function(name, axis, height, node) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + height = height * sign + end + local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node) + return true, S("@1 nodes added", count) + end, +}) + +worldedit.register_command("spiral", { + params = " ", + description = S("Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of "), + category = S("Shapes"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + local found, _, length, height, space, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + return false + end + local node = worldedit.normalize_nodename(nodename) + if not node then + return false, S("invalid node name: @1", nodename) + end + return true, tonumber(length), tonumber(height), tonumber(space), node + end, + nodes_needed = function(name, length, height, space, node) + return (length + space) * height -- TODO: this is not the upper bound + end, + func = function(name, length, height, space, node) + local count = worldedit.spiral(worldedit.pos1[name], length, height, space, node) + return true, S("@1 nodes added", count) + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/region.lua b/mods/Minetest-WorldEdit/worldedit_commands/region.lua new file mode 100644 index 00000000..9045c8aa --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/region.lua @@ -0,0 +1,234 @@ +local S = minetest.get_translator("worldedit_commands") + +worldedit.set_pos = {} +worldedit.inspect = {} + + +worldedit.register_command("inspect", { + params = "[on/off/1/0/true/false/yes/no/enable/disable]", + description = S("Enable or disable node inspection"), + privs = {worldedit=true}, + parse = function(param) + if param == "on" or param == "1" or param == "true" or param == "yes" or param == "enable" or param == "" then + return true, true + elseif param == "off" or param == "0" or param == "false" or param == "no" or param == "disable" then + return true, false + end + return false + end, + func = function(name, enable) + if enable then + worldedit.inspect[name] = true + local axis, sign = worldedit.player_axis(name) + worldedit.player_notify(name, S( + "inspector: inspection enabled for @1, currently facing the @2 axis", + name, + axis .. (sign > 0 and "+" or "-") + ), "info") + else + worldedit.inspect[name] = nil + worldedit.player_notify(name, S("inspector: inspection disabled"), "info") + end + end, +}) + +local VEC_6DIRS = { + vector.new( 1, 0, 0), + vector.new(-1, 0, 0), + vector.new( 0, 1, 0), + vector.new( 0,-1, 0), + vector.new( 0, 0, 1), + vector.new( 0, 0,-1), +} +local function get_node_rlight(pos) + local ret = 0 + for _, v in ipairs(VEC_6DIRS) do + ret = math.max(ret, minetest.get_node_light(vector.add(pos, v))) + end + return ret +end + +minetest.register_on_punchnode(function(pos, node, puncher) + local name = puncher:get_player_name() + if worldedit.inspect[name] then + local axis, sign = worldedit.player_axis(name) + local message = S( + "inspector: @1 at @2 (param1=@3, param2=@4, received light=@5) punched facing the @6 axis", + node.name, + minetest.pos_to_string(pos), + node.param1, + node.param2, + get_node_rlight(pos), + axis .. (sign > 0 and "+" or "-") + ) + worldedit.player_notify(name, message, "info") + end +end) + + +worldedit.register_command("mark", { + params = "", + description = S("Show markers at the region positions"), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + worldedit.marker_update(name) + return true, S("region marked") + end, +}) + +worldedit.register_command("unmark", { + params = "", + description = S("Hide markers if currently shown"), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + worldedit.pos1[name] = nil + worldedit.pos2[name] = nil + worldedit.marker_update(name) + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + return true, S("region unmarked") + end, +}) + +local function set_pos1(name, pos) + assert(pos) + worldedit.pos1[name] = pos + worldedit.mark_pos1(name) + worldedit.player_notify(name, S("position @1 set to @2", 1, minetest.pos_to_string(pos)), "ok") +end + +local function set_pos2(name, pos) + assert(pos) + worldedit.pos2[name] = pos + worldedit.mark_pos2(name) + worldedit.player_notify(name, S("position @1 set to @2", 2, minetest.pos_to_string(pos)), "ok") +end + +worldedit.register_command("pos1", { + params = "", + description = S("Set WorldEdit region position @1 to the player's location", 1), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + set_pos1(name, vector.round(player:get_pos())) + end, +}) + +worldedit.register_command("pos2", { + params = "", + description = S("Set WorldEdit region position @1 to the player's location", 2), + category = S("Region operations"), + privs = {worldedit=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + set_pos2(name, vector.round(player:get_pos())) + end, +}) + +worldedit.register_command("p", { + params = "set/set1/set2/get", + description = S("Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region"), + category = S("Region operations"), + privs = {worldedit=true}, + parse = function(param) + if param == "set" or param == "set1" or param == "set2" or param == "get" then + return true, param + end + return false, S("unknown subcommand: @1", param) + end, + func = function(name, param) + local msg + if param == "set" then --set both WorldEdit positions + worldedit.set_pos[name] = "pos1" + msg = S("select positions by punching two nodes") + elseif param == "set1" then --set WorldEdit position 1 + worldedit.set_pos[name] = "pos1only" + msg = S("select position @1 by punching a node", 1) + elseif param == "set2" then --set WorldEdit position 2 + worldedit.set_pos[name] = "pos2" + msg = S("select position @1 by punching a node", 2) + elseif param == "get" then --display current WorldEdit positions + if worldedit.pos1[name] ~= nil then + msg = S("position @1: @2", 1, minetest.pos_to_string(worldedit.pos1[name])) + else + msg = S("position @1 not set", 1) + end + msg = msg .. "\n" + if worldedit.pos2[name] ~= nil then + msg = msg .. S("position @1: @2", 2, minetest.pos_to_string(worldedit.pos2[name])) + else + msg = msg .. S("position @1 not set", 2) + end + end + if msg then + worldedit.player_notify(name, msg, "info") + end + end, +}) + +worldedit.register_command("fixedpos", { + params = "set1/set2 ", + description = S("Set a WorldEdit region position to the position at (, , )"), + category = S("Region operations"), + privs = {worldedit=true}, + parse = function(param) + local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, flag, vector.new(tonumber(x), tonumber(y), tonumber(z)) + end, + func = function(name, flag, pos) + if flag == "set1" then + set_pos1(name, pos) + else --flag == "set2" + set_pos2(name, pos) + end + end, +}) + +minetest.register_on_punchnode(function(pos, node, puncher) + local name = puncher:get_player_name() + if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position + if worldedit.set_pos[name] == "pos1" then --setting position 1 + set_pos1(name, pos) + worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation + elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only + set_pos1(name, pos) + worldedit.set_pos[name] = nil --finished setting positions + elseif worldedit.set_pos[name] == "pos2" then --setting position 2 + set_pos2(name, pos) + worldedit.set_pos[name] = nil --finished setting positions + elseif worldedit.set_pos[name] == "prob" then --setting Minetest schematic node probabilities + worldedit.prob_pos[name] = pos + minetest.show_formspec(name, "prob_val_enter", "field[text;;]") + end + end +end) + +worldedit.register_command("volume", { + params = "", + description = S("Display the volume of the current WorldEdit region"), + category = S("Region operations"), + privs = {worldedit=true}, + require_pos = 2, + func = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + + local volume = worldedit.volume(pos1, pos2) + local abs = math.abs + worldedit.player_notify(name, S( + "current region has a volume of @1 nodes (@2*@3*@4)", + volume, + abs(pos2.x - pos1.x) + 1, + abs(pos2.y - pos1.y) + 1, + abs(pos2.z - pos1.z) + 1 + ), "info") + end, +}) diff --git a/mods/Minetest-WorldEdit/worldedit_commands/safe.lua b/mods/Minetest-WorldEdit/worldedit_commands/safe.lua index c83cac8a..cd8fee1f 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/safe.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/safe.lua @@ -1,15 +1,30 @@ +local S = minetest.get_translator("worldedit_commands") + +local safe_region_limit = tonumber(minetest.settings:get("worldedit_safe_region_limit") or "20000") + local safe_region_callback = {} --`count` is the number of nodes that would possibly be modified --`callback` is a callback to run when the user confirms local function safe_region(name, count, callback) - if count < 20000 then + if safe_region_limit <= 0 or count < safe_region_limit then return callback() end - --save callback to call later + -- save callback to call later safe_region_callback[name] = callback - worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //y to continue or //n to cancel") + + local count_str = tostring(count) + -- highlight millions, 1 mln <=> 100x100x100 cube + if #count_str > 6 then + count_str = minetest.colorize("#f33", count_str:sub(1, -7)) .. count_str:sub(-6, -1) + end + + local yes_cmd = minetest.colorize("#00ffff", "//y") + local no_cmd = minetest.colorize("#00ffff", "//n") + local msg = S("WARNING: this operation could affect up to @1 nodes; type @2 to continue or @3 to cancel", + count_str, yes_cmd, no_cmd) + worldedit.player_notify(name, msg, "info") end local function reset_pending(name) @@ -18,11 +33,11 @@ end minetest.register_chatcommand("/y", { params = "", - description = "Confirm a pending operation", + description = S("Confirm a pending operation"), func = function(name) local callback = safe_region_callback[name] if not callback then - worldedit.player_notify(name, "no operation pending") + worldedit.player_notify(name, S("no operation pending"), "error") return end @@ -33,10 +48,10 @@ minetest.register_chatcommand("/y", { minetest.register_chatcommand("/n", { params = "", - description = "Abort a pending operation", + description = S("Abort a pending operation"), func = function(name) if not safe_region_callback[name] then - worldedit.player_notify(name, "no operation pending") + worldedit.player_notify(name, S("no operation pending"), "error") return end diff --git a/mods/Minetest-WorldEdit/worldedit_commands/schematics.lua b/mods/Minetest-WorldEdit/worldedit_commands/schematics.lua new file mode 100644 index 00000000..1aae07e1 --- /dev/null +++ b/mods/Minetest-WorldEdit/worldedit_commands/schematics.lua @@ -0,0 +1,284 @@ +local S = minetest.get_translator("worldedit_commands") + +worldedit.prob_pos = {} +worldedit.prob_list = {} + +local function check_region(name) + return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) +end + +local function check_filename(name) + return name:find("^[%w%s%^&'@{}%[%],%$=!%-#%(%)%%%.%+~_]+$") ~= nil +end + +local function open_schematic(name, param) + -- find the file in the world path + local testpaths = { + minetest.get_worldpath() .. "/schems/" .. param, + minetest.get_worldpath() .. "/schems/" .. param .. ".we", + minetest.get_worldpath() .. "/schems/" .. param .. ".wem", + } + local file, err + for index, path in ipairs(testpaths) do + file, err = io.open(path, "rb") + if not err then + break + end + end + if err then + worldedit.player_notify(name, S("Could not open file \"@1\"", param), "error") + return + end + local value = file:read("*a") + file:close() + + local version = worldedit.read_header(value) + if version == nil or version == 0 then + worldedit.player_notify(name, S("Invalid file format!"), "error") + return + elseif version > worldedit.LATEST_SERIALIZATION_VERSION then + worldedit.player_notify(name, S("Schematic was created with a newer version of WorldEdit."), "error") + return + end + + return value +end + +local function detect_misaligned_schematic(name, pos1, pos2) + pos1 = worldedit.sort_pos(pos1, pos2) + -- Check that allocate/save can position the schematic correctly + -- The expected behaviour is that the (0,0,0) corner of the schematic stays + -- at pos1, this only works when the minimum position is actually present + -- in the schematic. + local node = minetest.get_node(pos1) + local have_node_at_origin = node.name ~= "air" and node.name ~= "ignore" + if not have_node_at_origin then + worldedit.player_notify(name, + S("Warning: The schematic contains excessive free space and WILL be ".. + "misaligned when allocated or loaded. To avoid this, shrink your ".. + "area to cover exactly the nodes to be saved.") + ) + end +end + + +worldedit.register_command("save", { + params = "", + description = S("Save the current WorldEdit region to \"(world folder)/schems/.we\""), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + local result, count = worldedit.serialize(worldedit.pos1[name], + worldedit.pos2[name]) + detect_misaligned_schematic(name, worldedit.pos1[name], worldedit.pos2[name]) + + local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + minetest.mkdir(path) + + local filename = path .. "/" .. param .. ".we" + local file, err = io.open(filename, "wb") + if err ~= nil then + return false, S("Could not save file to \"@1\"", filename) + end + file:write(result) + file:flush() + file:close() + + return true, S("@1 nodes saved", count) + end, +}) + +worldedit.register_command("allocate", { + params = "", + description = S("Set the region defined by nodes from \"(world folder)/schems/.we\" as the current WorldEdit region"), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + func = function(name, param) + local pos = worldedit.pos1[name] + + local value = open_schematic(name, param) + if not value then + return false + end + + local nodepos1, nodepos2, count = worldedit.allocate(pos, value) + if not nodepos1 then + return false, S("Schematic empty, nothing allocated") + end + + worldedit.pos1[name] = nodepos1 + worldedit.pos2[name] = nodepos2 + worldedit.marker_update(name) + + return true, S("@1 nodes allocated", count) + end, +}) + +worldedit.register_command("load", { + params = "", + description = S("Load nodes from \"(world folder)/schems/[.we[m]]\" with position 1 of the current WorldEdit region as the origin"), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + func = function(name, param) + local pos = worldedit.pos1[name] + + local value = open_schematic(name, param) + if not value then + return false + end + + local count = worldedit.deserialize(pos, value) + if count == nil then + return false, S("Loading failed!") + end + return true, S("@1 nodes loaded", count) + end, +}) + + +worldedit.register_command("mtschemcreate", { + params = "", + description = S("Save the current WorldEdit region using the Minetest ".. + "Schematic format to \"(world folder)/schems/.mts\""), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + if param == "" then + return false + end + if not check_filename(param) then + return false, S("Disallowed file name: @1", param) + end + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + minetest.mkdir(path) + + local filename = path .. "/" .. param .. ".mts" + local ret = minetest.create_schematic(worldedit.pos1[name], + worldedit.pos2[name], worldedit.prob_list[name], + filename) + worldedit.prob_list[name] = {} + if ret == nil then + return false, S("Failed to create Minetest schematic") + end + return true, S("Saved Minetest schematic to @1", param) + end, +}) + +worldedit.register_command("mtschemplace", { + params = "", + description = S("Load nodes from \"(world folder)/schems/.mts\" with position 1 of the current WorldEdit region as the origin"), + category = S("Schematics"), + privs = {worldedit=true}, + require_pos = 1, + parse = function(param) + local found, _, filename, rotation = param:find("^(.+)%s+([012789]+)$") + if found == nil then + filename = param + elseif rotation ~= "0" and rotation ~= "90" and rotation ~= "180" and rotation ~= "270" then + return false, S("Invalid rotation: @1", rotation) + end + if not check_filename(filename) then + return false, S("Disallowed file name: @1", filename) + end + return true, filename, rotation + end, + func = function(name, filename, rotation) + local pos = worldedit.pos1[name] + + local path = minetest.get_worldpath() .. "/schems/" .. filename .. ".mts" + if minetest.place_schematic(pos, path, rotation) == nil then + return false, S("failed to place Minetest schematic") + end + return true, S("placed Minetest schematic @1 at @2", + filename, minetest.pos_to_string(pos)) + end, +}) + +worldedit.register_command("mtschemprob", { + params = "start/finish/get", + description = S("Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry"), + category = S("Schematics"), + privs = {worldedit=true}, + parse = function(param) + if param ~= "start" and param ~= "finish" and param ~= "get" then + return false, S("unknown subcommand: @1", param) + end + return true, param + end, + func = function(name, param) + if param == "start" then --start probability setting + worldedit.set_pos[name] = "prob" + worldedit.prob_list[name] = {} + worldedit.player_notify(name, S("select Minetest schematic probability values by punching nodes"), "info") + elseif param == "finish" then --finish probability setting + worldedit.set_pos[name] = nil + worldedit.player_notify(name, S("finished Minetest schematic probability selection"), "info") + elseif param == "get" then --get all nodes that had probabilities set on them + local text = "" + local problist = worldedit.prob_list[name] + if problist == nil then + return + end + for k,v in pairs(problist) do + local prob = math.floor(((v.prob / 256) * 100) * 100 + 0.5) / 100 + text = text .. minetest.pos_to_string(v.pos) .. ": " .. prob .. "% | " + end + worldedit.player_notify(name, S("currently set node probabilities:") .. "\n" .. text, "info") + end + end, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "prob_val_enter" then + local name = player:get_player_name() + local problist = worldedit.prob_list[name] + if problist == nil then + return + end + local e = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} + if e.pos == nil or e.prob == nil or e.prob < 0 or e.prob > 256 then + worldedit.player_notify(name, S("invalid node probability given, not saved"), "error") + return + end + problist[#problist+1] = e + end +end) + diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_cube.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_cube.png index fde36a8782e7c44d2aea80a82ec486797e1a6497..73ff039f92eb5d4374eb53b1a5e5c5c782eac13c 100644 GIT binary patch delta 60 zcmbQt=s!WyjD>-LVe2pRS3pY4)5S5Q;#P9PkMj-k#sUFGb9^LB85vyv);BKJ{jn0L Og2B_(&t;ucLK6T|H(?D8gCb5n0T@z;_6Q8AUa`8i0cA zC7!;n?00!2gw({O8q2(aLJFQPjv*GOlM@mWew=4ud~!)7^WS-cS51N9J-ZSn>|kK< Xe^=kAud~wysFuOg)z4*}Q$iB}my0Nu diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos1.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos1.png index 4c304aa88d80420e8f4f005d7f0030234210d5ed..84559debe032a029457d9644b55c3dd1e12617c6 100644 GIT binary patch delta 81 zcmeBUOqn3*&BDOIu=SVuDEaktaVt6Dhd%?8pq#@drVXt>ME)FK&hRc~PZ&=b kt45>WET&VBne15@qE9zAm8(G>gI0)z4*}Q$iB};-e{m diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos2.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_pos2.png index 1502f165cade2b7af27af34b4d6d7b02aca03268..d0e7819295ec387490ad74ddbd99395b7b969b28 100644 GIT binary patch delta 93 zcmbQsSTI2{oP~jbVe2pRS3t_#)5S5Q;#P9P4}S(GK{mdKI;Vst0HD1ea{vGU delta 139 zcmXSz%Q!)@o{fQlLH_gqL?Fdk;1OBOz`%D1gc(IOyc&Rl{+=$5Ar_~%PCm%TpupkO z`t|>QpX+>ARi>p^z6c1Js7-{ZSO3!ZNWve}P6bc)I$rx~y|bXaWFaxHTRC diff --git a/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_wand.png b/mods/Minetest-WorldEdit/worldedit_commands/textures/worldedit_wand.png new file mode 100644 index 0000000000000000000000000000000000000000..b2baf1aa5c2ef43ad2ba3efdcd30799c38e88123 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}Z-7sT>;M1%rzM-rNRwR`Y}cCN zI3rrWH&JCujON4$+um5+#(0~`6!Yai=G_sBePPPAk>))iid7M&MX?4mgBUveO}c{Q z+k#a(!g$+*Ehsc)%=@$g)mHSE5dPz^Wm8kTTY;=*>rps95%~j(fxIvSl z*p#J0MY2wnp nodes"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, axis, tonumber(amount) + end, + nodes_needed = function(name, axis, amount) + return check_region(name) * 2 + end, + func = function(name, axis, amount) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + amount = amount * sign + end + + local count = worldedit.copy(worldedit.pos1[name], worldedit.pos2[name], axis, amount) + return true, S("@1 nodes copied", count) + end, +}) + +worldedit.register_command("move", { + params = "x/y/z/? ", + description = S("Move the current WorldEdit region along the given axis by nodes"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, axis, tonumber(amount) + end, + nodes_needed = function(name, axis, amount) + return check_region(name) * 2 + end, + func = function(name, axis, amount) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + amount = amount * sign + end + + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.move(pos1, pos2, axis, amount) + + pos1[axis] = pos1[axis] + amount + pos2[axis] = pos2[axis] + amount + worldedit.marker_update(name) + return true, S("@1 nodes moved", count) + end, +}) + +worldedit.register_command("stack", { + params = "x/y/z/? ", + description = S("Stack the current WorldEdit region along the given axis times"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, repetitions = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + return true, axis, tonumber(repetitions) + end, + nodes_needed = function(name, axis, repetitions) + return check_region(name) * math.abs(repetitions) + end, + func = function(name, axis, repetitions) + if axis == "?" then + local sign + axis, sign = worldedit.player_axis(name) + repetitions = repetitions * sign + end + + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.volume(pos1, pos2) * math.abs(repetitions) + worldedit.stack(pos1, pos2, axis, repetitions, function() + worldedit.player_notify(name, S("@1 nodes stacked", count), "ok") + end) + end, +}) + +worldedit.register_command("stack2", { + params = " ", + description = S("Stack the current WorldEdit region times by offset , , "), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local repetitions, incs = param:match("(%d+)%s*(.+)") + if repetitions == nil then + return false, S("invalid count: @1", param) + end + local x, y, z = incs:match("([+-]?%d+) ([+-]?%d+) ([+-]?%d+)") + if x == nil then + return false, S("invalid increments: @1", param) + end + + return true, tonumber(repetitions), vector.new(tonumber(x), tonumber(y), tonumber(z)) + end, + nodes_needed = function(name, repetitions, offset) + return check_region(name) * repetitions + end, + func = function(name, repetitions, offset) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.volume(pos1, pos2) * repetitions + worldedit.stack2(pos1, pos2, offset, repetitions, function() + worldedit.player_notify(name, S("@1 nodes stacked", count), "ok") + end) + end, +}) + +worldedit.register_command("stretch", { + params = " ", + description = S("Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, stretchx, stretchy, stretchz = param:find("^(%d+)%s+(%d+)%s+(%d+)$") + if found == nil then + return false + end + stretchx, stretchy, stretchz = tonumber(stretchx), tonumber(stretchy), tonumber(stretchz) + if stretchx == 0 or stretchy == 0 or stretchz == 0 then + return false, S("invalid scaling factors: @1", param) + end + return true, stretchx, stretchy, stretchz + end, + nodes_needed = function(name, stretchx, stretchy, stretchz) + return check_region(name) * stretchx * stretchy * stretchz + end, + func = function(name, stretchx, stretchy, stretchz) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count, pos1, pos2 = worldedit.stretch(pos1, pos2, stretchx, stretchy, stretchz) + + --reset markers to scaled positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.marker_update(name) + + return true, S("@1 nodes stretched", count) + end, +}) + +worldedit.register_command("transpose", { + params = "x/y/z/? x/y/z/?", + description = S("Transpose the current WorldEdit region along the given axes"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") + if found == nil then + return false + elseif axis1 == axis2 then + return false, S("invalid usage: axes must be different") + end + return true, axis1, axis2 + end, + nodes_needed = check_region, + func = function(name, axis1, axis2) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if axis1 == "?" then axis1 = worldedit.player_axis(name) end + if axis2 == "?" then axis2 = worldedit.player_axis(name) end + local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2) + + --reset markers to transposed positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.marker_update(name) + + return true, S("@1 nodes transposed", count) + end, +}) + +worldedit.register_command("flip", { + params = "x/y/z/?", + description = S("Flip the current WorldEdit region along the given axis"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + if param ~= "x" and param ~= "y" and param ~= "z" and param ~= "?" then + return false + end + return true, param + end, + nodes_needed = check_region, + func = function(name, param) + if param == "?" then param = worldedit.player_axis(name) end + local count = worldedit.flip(worldedit.pos1[name], worldedit.pos2[name], param) + return true, S("@1 nodes flipped", count) + end, +}) + +worldedit.register_command("rotate", { + params = "x/y/z/? ", + description = S("Rotate the current WorldEdit region around the given axis by angle (90 degree increment)"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + return false + end + angle = tonumber(angle) + if angle % 90 ~= 0 or angle % 360 == 0 then + return false, S("invalid usage: angle must be multiple of 90") + end + return true, axis, angle + end, + nodes_needed = check_region, + func = function(name, axis, angle) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if axis == "?" then axis = worldedit.player_axis(name) end + local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle) + + --reset markers to rotated positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.marker_update(name) + + return true, S("@1 nodes rotated", count) + end, +}) + +worldedit.register_command("orient", { + params = "", + description = S("Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)"), + category = S("Transformations"), + privs = {worldedit=true}, + require_pos = 2, + parse = function(param) + local found, _, angle = param:find("^([+-]?%d+)$") + if found == nil then + return false + end + angle = tonumber(angle) + if angle % 90 ~= 0 then + return false, S("invalid usage: angle must be multiple of 90") + end + return true, angle + end, + nodes_needed = check_region, + func = function(name, angle) + local count = worldedit.orient(worldedit.pos1[name], worldedit.pos2[name], angle) + return true, S("@1 nodes oriented", count) + end, +}) + diff --git a/mods/Minetest-WorldEdit/worldedit_commands/wand.lua b/mods/Minetest-WorldEdit/worldedit_commands/wand.lua index faa77ff5..05c0aeec 100644 --- a/mods/Minetest-WorldEdit/worldedit_commands/wand.lua +++ b/mods/Minetest-WorldEdit/worldedit_commands/wand.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator("worldedit_commands") + local function above_or_under(placer, pointed_thing) if placer:get_player_control().sneak then return pointed_thing.above @@ -9,11 +11,18 @@ end local punched_air_time = {} minetest.register_tool(":worldedit:wand", { - description = "WorldEdit Wand tool\nLeft-click to set 1st position, right-click to set 2nd", + description = S("WorldEdit Wand tool\nLeft-click to set 1st position, right-click to set 2nd"), inventory_image = "worldedit_wand.png", stack_max = 1, -- there is no need to have more than one liquids_pointable = true, -- ground with only water on can be selected as well + -- ignore marker cube so the clicking on the position markers works reliably + pointabilities = { + objects = { + ["worldedit:region_cube"] = false + } + }, + on_use = function(itemstack, placer, pointed_thing) if placer == nil or pointed_thing == nil then return end local name = placer:get_player_name() @@ -32,7 +41,7 @@ minetest.register_tool(":worldedit:wand", { local entity = pointed_thing.ref:get_luaentity() if entity and entity.name == "worldedit:pos2" then -- set pos1 = pos2 - worldedit.pos1[name] = worldedit.pos2[name] + worldedit.pos1[name] = vector.copy(worldedit.pos2[name]) worldedit.mark_pos1(name) end end @@ -57,7 +66,7 @@ minetest.register_tool(":worldedit:wand", { local entity = pointed_thing.ref:get_luaentity() if entity and entity.name == "worldedit:pos1" then -- set pos2 = pos1 - worldedit.pos2[name] = worldedit.pos1[name] + worldedit.pos2[name] = vector.copy(worldedit.pos1[name]) worldedit.mark_pos2(name) end return itemstack -- nothing consumed, nothing changed diff --git a/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua b/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua index 6279d8a8..75c205a5 100644 --- a/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua +++ b/mods/Minetest-WorldEdit/worldedit_gui/functionality.lua @@ -140,7 +140,7 @@ local function execute_worldedit_command(command_name, player_name, params) assert(chatcmd, "unknown command: " .. command_name) local _, msg = chatcmd.func(player_name, params) if msg then - worldedit.player_notify(player_name, msg) + minetest.chat_send_player(player_name, msg) end end diff --git a/mods/Minetest-WorldEdit/worldedit_gui/init.lua b/mods/Minetest-WorldEdit/worldedit_gui/init.lua index 378abab3..bb85df88 100644 --- a/mods/Minetest-WorldEdit/worldedit_gui/init.lua +++ b/mods/Minetest-WorldEdit/worldedit_gui/init.lua @@ -4,10 +4,10 @@ worldedit = worldedit or {} Example: worldedit.register_gui_function("worldedit_gui_hollow_cylinder", { - name = "Make Hollow Cylinder", - privs = {worldedit=true}, - get_formspec = function(name) return "some formspec here" end, - on_select = function(name) print(name .. " clicked the button!") end, + name = "Make Hollow Cylinder", + privs = {worldedit=true}, + get_formspec = function(name) return "some formspec here" end, + on_select = function(name) print(name .. " clicked the button!") end, }) Use `nil` for the `options` parameter to unregister the function associated with the given identifier. @@ -35,14 +35,14 @@ end Example: worldedit.register_gui_handler("worldedit_gui_hollow_cylinder", function(name, fields) - print(minetest.serialize(fields)) + print(minetest.serialize(fields)) end) ]] worldedit.register_gui_handler = function(identifier, handler) local enabled = true minetest.register_on_player_receive_fields(function(player, formname, fields) - if not enabled then return false end + if not enabled or formname ~= "" or fields.worldedit_gui then return false end enabled = false minetest.after(0.2, function() enabled = true end) local name = player:get_player_name() @@ -80,6 +80,7 @@ if minetest.global_exists("unified_inventory") then -- unified inventory install unified_inventory.register_button("worldedit_gui", { type = "image", image = "inventory_plus_worldedit_gui.png", + tooltip = "Edit your World!", condition = function(player) return minetest.check_player_privs(player:get_player_name(), {worldedit=true}) end, @@ -193,7 +194,8 @@ elseif minetest.global_exists("sfinv") then -- sfinv installed get = function(self, player, context) local can_worldedit = minetest.check_player_privs(player, {worldedit=true}) local fs = orig_get(self, player, context) - return fs .. (can_worldedit and "image_button[0,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]" or "") + return fs .. (can_worldedit and "image_button[0,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]" .. + "tooltip[worldedit_gui;Edit your World!]" or "") end }) @@ -262,7 +264,7 @@ worldedit.register_gui_handler("worldedit_gui", function(name, fields) --ensure player has permission to perform action local has_privs, missing_privs = minetest.check_player_privs(name, entry.privs) if not has_privs then - worldedit.player_notify(name, "you are not allowed to use this function (missing privileges: " .. table.concat(missing_privs, ", ") .. ")") + worldedit.player_notify(name, "you are not allowed to use this function (missing privileges: " .. table.concat(missing_privs, ", ") .. ")", "error") return false end if entry.on_select then diff --git a/mods/Minetest-WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png b/mods/Minetest-WorldEdit/worldedit_gui/textures/inventory_plus_worldedit_gui.png index ff9404b43787d0e60c28ee27dd8f18b58e7b5fac..86a7233482eb194b288537f78ccd5e9a242fb302 100644 GIT binary patch literal 20864 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 bx-R++@Yis)(UW;A00000NkvXXu0mjfg8}S+ literal 21724 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 Dhc;RF diff --git a/mods/Minetest-WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png b/mods/Minetest-WorldEdit/worldedit_gui/textures/worldedit_gui_unknown.png index f57436ca16aef91522a9af86f6254b837fbd5b30..fc80c2d30f318295319157b579a80c62d3ae5720 100644 GIT binary patch delta 366 zcmV-!0g?XI1pWe$8Gi%-0006sAte9+0YynfK~#9!V;}-7216=<#VC++gD5v}F+NC! zL6jS~m?TKpAj%C~ObH~)D3&F8hYmh`@%h{DpMT$fzxZOt1+}#V4a6>OwdwA=|7hU* zpU%@{7-qEL!*`JOpMOt2U3zudwL=fze}@>@dxm7gF1-M0ynp;s9quvS$?%P1xUVaf+jw-(QK1jUfBuR$NzKGpJnFm1PE3T1bSlr%e7nWZ$+JG(|y$592 z>Kk|sBNk3R2QsYf6cr4UUH$PVQ4v5GDzCZoj;y4C36u7{1E#aT|7TnP@+dKkX~~kS ze}QiL@FRI2kY`VsVcYLO5-=#NC^RhRAjqh5&)Am&d6XJ<;|(Z>g3Ala4f_cUuIsOn zMJSHVVQ!ekMo?V7`8u=>!!U4wYfq{-5GXc~-i<242GXq|O2sBJ0O)oG=}B)*pa1{> M07*qoM6N<$g13~Vm;e9( delta 583 zcmV-N0=WJD0@VbN8Gi!+005uk8JqwB010qNS#tmY3ljhU3ljkVnw%H_000McNliru z;R6c`7as+)`P2Xa0Kia8R7C&)000000s;aA1Ox{M2MrAk5D*X@9UUVhBPJ#$CnqN| zGBP+gI668yM@L6nTU%aUUSeWmV`F1!X=!Y1Y;JCDgoK2KhJS{MiHVJkjgym;mX?;7 zn3$WJo1UJYq@<*!rKP5(rl+T;sHmu`tE;!Sx4pf+!NI}8!otbP$FMe0?CkFD?(gsK@bK{P@bK~R@%Hxi_xJbs`1twx`ThO< z|NsBsW!ppm0Dk~JbW%=J0HdU&rKhK>tgWrEv9h+jy}rJ{!NSSP%goNu(9zP>)z;S5 z*xcXY;pOJ&=;`b1?(XyS_4oJp`1$+%{QbwHx{?3@00Cl4M?^n9V=#39007ZRL_t(I z%e~ac4#F@HMbQj3q4(ZKPofSiO?ZGTDwZ3#=1TjAFn2RhP|zAFKFH47f(M|h_%+%Du*a*Ioa6wFh)tL|CqNa;03#nM*&LQZYGz?Z3?}I3ECOu)z_>4v`<~g`fxT~AVg3LB002ovPDHLkV1hs3BC!Af diff --git a/mods/advtrains/.build.yml b/mods/advtrains/.build.yml index 303348fe..c2332f2a 100644 --- a/mods/advtrains/.build.yml +++ b/mods/advtrains/.build.yml @@ -6,17 +6,12 @@ packages: - unzip - wget - lua-busted +- luajit sources : - https://git.sr.ht/~gpcf/advtrains tasks: -- download_mt_server: | - mkdir bin - wget https://lifomaps.de/advtrains-test/builtin.tar.gz - tar xf builtin.tar.gz - curl https://lifomaps.de/advtrains-test/minetestserver -o ~/bin/minetestserver - chmod +x ~/bin/minetestserver - install_mt_game : | curl -L https://github.com/minetest/minetest_game/archive/master.zip -o master.zip mkdir -p .minetest/games/ @@ -45,4 +40,9 @@ tasks: git clone https://git.bananach.space/basic_trains.git/ - run_test_world: | echo "bind_address = 127.0.0.1" > minetest.conf - ~/bin/minetestserver --port 31111 --gameid minetest_game --config ~/minetest.conf --world ~/.minetest/worlds/advtrains_testworld + minetestserver --port 31111 --gameid minetest_game --config ~/minetest.conf --world ~/.minetest/worlds/advtrains_testworld --logfile ~/minetest.log +- test_po_files : | + cd advtrains/advtrains + for f in po/*.po; do + luajit -e 'require("poconvert").from_string("advtrains", io.input():read("*a"))' < $f + done diff --git a/mods/advtrains/README.md b/mods/advtrains/README.md index 41a35f57..e80e4b56 100644 --- a/mods/advtrains/README.md +++ b/mods/advtrains/README.md @@ -83,6 +83,7 @@ Small code contributions: * Inventory images : mbb * Node texture for LuaATC controller: Jeija (from Mesecons) * Mod Description : hajo +* 45 degree platforms design : Och_Noe #### Sounds: @@ -91,7 +92,7 @@ Small code contributions: * advtrains\_steam\_whistle : googol * advtrains\_subway\_horn : https://freesound.org/people/Mullumbimby/sounds/385283/ * advtrains\_subway\_\* : Gabriel (gbl08ma) -* 45 degree platforms design : Och_Noe + ### Testers: diff --git a/mods/advtrains/advtrains/api_doc.txt b/mods/advtrains/advtrains/api_doc.txt index 1e49df32..5668ba32 100644 --- a/mods/advtrains/advtrains/api_doc.txt +++ b/mods/advtrains/advtrains/api_doc.txt @@ -85,6 +85,13 @@ advtrains.register_wagon(name, prototype, description, inventory_image) wagon_span=2, ^- How far this wagon extends from its base position. Is the half of the wagon length. ^- Used to determine in which distance the other wagons have to be positioned. Will require tweaking. + wheel_positions = {1.5, -1.5}, + ^- Optional: if defined, the wagon will be placed so that these 2 wheel positions are on the track + ^- This parameter is recommended for long wagons (wagon_span >= 2). + ^- The position is a distance relative to the center of the wagon. + ^- Must have exactly 2 entries, corresponding to the front (1) and rear (2) wheel of the wagon object. 1st must be greater than 2nd. + ^- If not provided, the simple 1-position positioning logic will be used (wagon is positioned with the center on the track) + extent_h = 1, ^- Determines the collision box extent in x/z direction. Defaults to 1 (=3x3) ^- The actual bounding box size is (extent_h*2)+1, so 0 means 1x1, 1 means 3x3 and 2 means 5x5 diff --git a/mods/advtrains/advtrains/atc.lua b/mods/advtrains/advtrains/atc.lua index c1ff2186..b572cdc8 100644 --- a/mods/advtrains/advtrains/atc.lua +++ b/mods/advtrains/advtrains/atc.lua @@ -106,7 +106,7 @@ local apn_func=function(pos) -- FIX for long-persisting ndb bug: there's no node in parameter 2 of this function! local meta=minetest.get_meta(pos) if meta then - meta:set_string("infotext", attrans("ATC controller, unconfigured.")) + meta:set_string("infotext", attrans("Unconfigured ATC controller")) meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta)) end end @@ -233,7 +233,7 @@ local matchptn={ advtrains.train_ensure_init(id, train) -- no one minds if this failed... this shouldn't even be called without train being initialized... else - atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving!")) + atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving.")) end return 1 end, @@ -245,11 +245,11 @@ local matchptn={ end, ["K"] = function(id, train) if train.door_open == 0 then - atwarn(sid(id), attrans("ATC Kick command warning: Doors closed")) + atwarn(sid(id), attrans("ATC Kick command warning: doors are closed.")) return 1 end if train.velocity > 0 then - atwarn(sid(id), attrans("ATC Kick command warning: Train moving")) + atwarn(sid(id), attrans("ATC Kick command warning: train moving.")) return 1 end local tp = train.trainparts diff --git a/mods/advtrains/advtrains/copytool.lua b/mods/advtrains/advtrains/copytool.lua index 0c1cdfe9..ca5cae1b 100644 --- a/mods/advtrains/advtrains/copytool.lua +++ b/mods/advtrains/advtrains/copytool.lua @@ -26,7 +26,7 @@ minetest.register_tool("advtrains:copytool", { return itemstack end if not minetest.check_player_privs(placer, {train_operator = true }) then - minetest.chat_send_player(pname, "You don't have the train_operator privilege.") + minetest.chat_send_player(pname, S("You do not have the @1 privilege.", "train_operator")) return itemstack end if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then @@ -38,7 +38,7 @@ minetest.register_tool("advtrains:copytool", { local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true}) if not prevpos then - minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!") + minetest.chat_send_player(pname, attrans("The track you are trying to place the wagon on is not long enough.")) return end @@ -49,12 +49,12 @@ minetest.register_tool("advtrains:copytool", { end local clipboard = meta:get_string("clipboard") if (clipboard == "") then - minetest.chat_send_player(pname, "The clipboard is empty."); + minetest.chat_send_player(pname, attrans("The clipboard is empty.")); return end clipboard = minetest.deserialize(clipboard) if (clipboard.wagons == nil) then - minetest.chat_send_player(pname, "The clipboard is empty."); + minetest.chat_send_player(pname, attrans("The clipboard is empty.")); return end @@ -71,7 +71,7 @@ minetest.register_tool("advtrains:copytool", { local train = advtrains.trains[id] train.off_track = train.end_index advtrains.TRAIN_MAX_WAGONS then + atwarn("Cannot couple",stat_train.id,"and",init_train.id,"- train would have length",tot_len,"which is above the limit of",advtrains.TRAIN_MAX_WAGONS) + return + end + + advtrains.te_run_callbacks_on_couple(init_train, stat_train) if stat_train_opposite then -- insert wagons in inverse order and set their wagon_flipped state @@ -310,7 +335,7 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front) --atdebug("CMCT: t1",t1_cplt,"t2",t2_cplt,"") -- if at least one of the trains has no couplers table, it always couples (fallback behavior and mode for universal shunters) - if not t1_cplt or not t2_cplt then + if minetest.settings:get_bool("advtrains_universal_couplers", false) or not t1_cplt or not t2_cplt then return true end @@ -326,11 +351,11 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front) for typ,_ in pairs(t1_cplt) do table.insert(t1_cplhr, advtrains.coupler_types[typ] or typ) end - if #t1_cplhr==0 then t1_cplhr[1]=attrans("") end + if #t1_cplhr==0 then t1_cplhr[1]=attrans("") end for typ,_ in pairs(t2_cplt) do table.insert(t2_cplhr, advtrains.coupler_types[typ] or typ) end - if #t2_cplhr==0 then t2_cplhr[1]=attrans("") end + if #t2_cplhr==0 then t2_cplhr[1]=attrans("") end return false, attrans("Can not couple: The couplers of the trains do not match (@1 and @2).", table.concat(t1_cplhr, ","), table.concat(t2_cplhr, ",")) end @@ -428,7 +453,7 @@ minetest.register_entity("advtrains:discouple", { self.object:remove() return end - --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. + --get_yaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. if not self.wagon.object:get_yaw() then self.object:remove() return @@ -475,7 +500,7 @@ minetest.register_entity("advtrains:couple", { self.object:remove() end, on_step=function(self, dtime) - if advtrains.wagon_outside_range(self.object:getpos()) then + if advtrains.wagon_outside_range(self.object:get_pos()) then --atdebug("Couple Removing outside range") self.object:remove() return @@ -514,7 +539,7 @@ minetest.register_entity("advtrains:couple", { tp2=advtrains.path_get_interpolated(train2, train2.end_index) end local pos_median=advtrains.pos_median(tp1, tp2) - if not vector.equals(pos_median, self.object:getpos()) then + if not vector.equals(pos_median, self.object:get_pos()) then self.object:set_pos(pos_median) end self.position_set=true diff --git a/mods/advtrains/advtrains/craft_items.lua b/mods/advtrains/advtrains/craft_items.lua index 0e693ebc..1188b64a 100644 --- a/mods/advtrains/advtrains/craft_items.lua +++ b/mods/advtrains/advtrains/craft_items.lua @@ -6,7 +6,7 @@ core.register_craftitem("advtrains:boiler", { core.register_craftitem("advtrains:driver_cab", { - description = attrans("driver's cab"), + description = attrans("Driver's cab"), inventory_image = "advtrains_driver_cab.png", }) diff --git a/mods/advtrains/advtrains/crafting.lua b/mods/advtrains/advtrains/crafting.lua index 7626d55b..9f804566 100644 --- a/mods/advtrains/advtrains/crafting.lua +++ b/mods/advtrains/advtrains/crafting.lua @@ -21,6 +21,14 @@ minetest.register_craft({ }, }) --Wallmounted Signal +minetest.register_craft({ + output = 'advtrains:signal_wall_l_off 2', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'dye:red'}, + {'', 'default:steel_ingot', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'dye:dark_green'}, + }, +}) minetest.register_craft({ output = 'advtrains:signal_wall_r_off 2', recipe = { @@ -29,6 +37,15 @@ minetest.register_craft({ {'dye:dark_green', 'default:steel_ingot', 'default:steel_ingot'}, }, }) +minetest.register_craft({ + output = 'advtrains:signal_wall_t_off 2', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'dye:dark_green', '', 'dye:red'}, + }, +}) + --Wallmounted Signals can be converted into every orientation by shapeless crafting minetest.register_craft({ diff --git a/mods/advtrains/advtrains/debugitems.lua b/mods/advtrains/advtrains/debugitems.lua index e672308c..e5982165 100644 --- a/mods/advtrains/advtrains/debugitems.lua +++ b/mods/advtrains/advtrains/debugitems.lua @@ -51,3 +51,33 @@ minetest.register_chatcommand("atyaw", end end, }) + +minetest.register_tool("advtrains:wagonpos_tester", +{ + description = "Wagon position tester", + groups = {cracky=1}, -- key=name, value=rating; rating=1..3. + inventory_image = "drwho_screwdriver.png", + wield_image = "drwho_screwdriver.png", + stack_max = 1, + range = 7.0, + + on_place = function(itemstack, placer, pointed_thing) + + end, + --[[ + ^ Shall place item and return the leftover itemstack + ^ default: minetest.item_place ]] + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type=="node" then + local pos = pointed_thing.under + local trains = advtrains.occ.get_trains_at(pos) + for train_id, index in pairs(trains) do + local wagon_num, wagon_id, wagon_data, offset_from_center = advtrains.get_wagon_at_index(train_id, index) + if wagon_num then + atdebug(wagon_num, wagon_id, offset_from_center) + end + end + end + end, +} +) diff --git a/mods/advtrains/advtrains/init.lua b/mods/advtrains/advtrains/init.lua index a7e57649..4a0b928c 100644 --- a/mods/advtrains/advtrains/init.lua +++ b/mods/advtrains/advtrains/init.lua @@ -22,9 +22,6 @@ Copyright (C) 2016-2020 Moritz Blei (orwell96) and contributors local lot = os.clock() minetest.log("action", "[advtrains] Loading...") --- There is no need to support 0.4.x anymore given that the compatitability with it is already broken by 1bb1d825f46af3562554c12fba35a31b9f7973ff -attrans = minetest.get_translator ("advtrains") - --advtrains advtrains = {trains={}, player_to_train_mapping={}} @@ -48,6 +45,9 @@ advtrains.IGNORE_WORLD = false local NO_SAVE = false -- Do not save any data to advtrains save files +advtrains.TRAIN_MAX_WAGONS = 20 +-- Limit on the maximum number of wagons that may be in a train + -- ========================================================================== -- Use a global slowdown factor to slow down train movements. Now a setting @@ -178,7 +178,7 @@ function assertt(var, typ) end end -dofile(advtrains.modpath.."/helpers.lua"); +dofile(advtrains.modpath.."/helpers.lua") --dofile(advtrains.modpath.."/debugitems.lua"); advtrains.meseconrules = @@ -198,13 +198,19 @@ advtrains.meseconrules = advtrains.fpath=minetest.get_worldpath().."/advtrains" +advtrains.poconvert = dofile(advtrains.modpath.."/poconvert.lua") +advtrains.poconvert.from_flat("advtrains") +attrans = minetest.get_translator("advtrains") + advtrains.speed = dofile(advtrains.modpath.."/speed.lua") +advtrains.texture = dofile(advtrains.modpath.."/texture.lua") dofile(advtrains.modpath.."/path.lua") dofile(advtrains.modpath.."/trainlogic.lua") dofile(advtrains.modpath.."/trainhud.lua") dofile(advtrains.modpath.."/trackplacer.lua") dofile(advtrains.modpath.."/copytool.lua") +dofile(advtrains.modpath.."/wagonprop_tool.lua") dofile(advtrains.modpath.."/tracks.lua") dofile(advtrains.modpath.."/occupation.lua") dofile(advtrains.modpath.."/atc.lua") @@ -229,7 +235,6 @@ end dofile(advtrains.modpath.."/lzb.lua") - --load/save -- backup variables, used if someone should accidentally delete a sub-mod @@ -471,6 +476,7 @@ advtrains.avt_save = function(remove_players_from_wagons) "text_outside", "text_inside", "line", "routingcode", "il_sections", "speed_restriction", "speed_restrictions_t", "is_shunt", "points_split", "autocouple", "atc_wait_autocouple", "ars_disable", + "staticdata", }) --then save it tmp_trains[id]=v @@ -734,6 +740,21 @@ minetest.register_chatcommand("at_whereis", end end, }) +minetest.register_chatcommand("at_tp", + { + params = "", + description = "Teleports you to the position of the train with the given id", + privs = {train_operator = true, teleport = true}, + func = function(name,param) + local train = advtrains.trains[param] + if not train or not train.last_pos then + return false, "Train "..param.." does not exist or is invalid" + else + minetest.get_player_by_name(name):set_pos(train.last_pos) + return true, "Teleporting to train "..param + end + end, +}) minetest.register_chatcommand("at_disable_step", { params = "", @@ -755,6 +776,16 @@ minetest.register_chatcommand("at_disable_step", end, }) +minetest.register_chatcommand("at_status", + { + params = "", + description = "Print advtrains status info", + privs = {train_operator = true}, + func = function(name, param) + return true, advtrains.print_concat_table({"Advtrains Status: no_action",no_action,"slowdown",advtrains.global_slowdown,"(log",math.log(advtrains.global_slowdown),")"}) + end, +}) + advtrains.is_no_action = function() return no_action end diff --git a/mods/advtrains/advtrains/locale/README.md b/mods/advtrains/advtrains/locale/README.md new file mode 120000 index 00000000..61e473c2 --- /dev/null +++ b/mods/advtrains/advtrains/locale/README.md @@ -0,0 +1 @@ +../po/README.md \ No newline at end of file diff --git a/mods/advtrains/advtrains/locale/advtrains.de.tr b/mods/advtrains/advtrains/locale/advtrains.de.tr deleted file mode 100644 index 6abbc123..00000000 --- a/mods/advtrains/advtrains/locale/advtrains.de.tr +++ /dev/null @@ -1,77 +0,0 @@ -# textdomain: advtrains -This wagon is owned by @1, you can't destroy it.=Dieser Waggon gehört @1, du kannst ihn nicht abbauen. -Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=Warnung: Du erhältst nur etwas Stahl zurück. Wenn du sicher bist, dass du den Waggon zerstören willst, halte 'Schleichen' und klicke links. -Show Inventory=Zeige Inventar -Select seat:=Wähle einen Sitzplatz aus: -ATC controller, unconfigured.=Zugbeeinflussungsschiene, nicht konfiguiert. -ATC controller=Zugbeeinflussungsschiene -ATC controller, mode @1@nChannel: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nKanal: @2 -ATC controller, mode @1@nCommand: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nBefehl: @2 -Command=Befehl -Command (on)=Befehl (wenn ein) -Digiline channel=Digiline-Kanal -Save=Speichern -ATC Reverse command warning: didn't reverse train, train moving!=Zugbeeinflussung - Warnung: Befehl 'R' nicht ausgeführt, Zug in Bewegung! -ATC command syntax error: I statement not closed: @1=Zugbeeinflussung - Syntaxfehler: I-Anweisung nicht geschlossen: @1 -ATC command parse error: Unknown command: @1=Zugbeeinflussung - Fehler: Unbekannter Befehl: @1 -This position is protected!=Diese Position ist geschützt! -You need to own at least one neighboring wagon to destroy this couple.=Du musst Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln. -@1 Platform (low)=Niedriger @1-Bahnsteig -@1 Platform (high)=Hoher @1-Bahnsteig -off=aus -on=ein -Lampless Signal (@1)=Mechanisches Signal (@1) -Signal (@1)=Lichtsignal (@1) -Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=Schienenwerkzeug@n@nLinksklick: Schienentyp ändern, Rechtsklick: Objekt drehen. -This node can't be rotated using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug drehen. -This node can't be changed using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug bearbeiten. -Can't place: not pointing at node=Kann nicht platzieren: Du zeigst nicht auf einen Block. -Can't place: space occupied!=Kann nicht platzieren: Platz besetzt. -Can't place: protected position!=Kann nicht platzieren: Position geschützt. -Can't place: Not enough slope items left (@1 required)=Kann nicht platzieren: nicht genug Steigungsblöcke, es werden insgesamt @1 benötigt. -Can't place: There's no slope of length @1=Kann nicht platzieren: Keine Steigung der Länge @1 definiert. -Can't place: no supporting node at upper end.=Kann nicht platzieren: kein unterstützender Block am Ende der Steigung. -Deprecated Track=ausrangierte Schiene, nicht verwenden. -Track=Schiene -Bumper=Prellbock -Detector Rail=Detektorschiene -Speed:=Geschw.: -Target:=Zielges.: -@1 Slope=@1 Steigung -Can't get on: wagon full or doors closed!=Kann nicht einsteigen: Waggon voll oder Türen geschlossen. -Use Sneak+rightclick to bypass closed doors!=Nutze Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem einzusteigen. -Lock couples=Kupplungen sperren -Save wagon properties=Waggon-Einstellungen speichern -Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=Türen sind geschlossen! Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem auszusteigen. -Wagon properties=Waggon-Einstellungen -Get off=Aussteigen -Get off (forced)=Aussteigen (erzwingen) -(Doors closed)=(Türen geschlossen) -Access to @1=Zugang zu @1 -Default Seat=Standardsitzplatz -Default Seat (driver stand)=Standardsitzplatz (Führerstand) -Driver Stand=Führerstand -Driver Stand (left)=Führerstand Links -Driver Stand (right)=Führerstand Rechts -Industrial Train Engine=Industrielle Lokomotive -Industrial tank wagon=Tankwaggon -Industrial wood wagon=Holztransportwaggon -Japanese Train Engine=Japanische Personenzug-Lokomotive -Japanese Train Wagon=Japanischer Personenzug-Passagierwaggon -Steam Engine=Dampflokomotive -Detailed Steam Engine=detaillierte Dampflokomotive -Passenger Wagon=Passagierwaggon -Box wagon=Güterwaggon -Subway Passenger Wagon=U-Bahn-Waggon -The wagon's inventory is not empty!=Das Inventar dieses Waggons ist nicht leer! -This track can not be changed!=Diese Schiene kann nicht geändert werden! -This track can not be rotated!=Diese Schiene kann nicht gedreht werden! -This track can not be removed!=Diese Schiene kann nicht entfernt werden! -Position is occupied by a train.=Ein Zug steht an dieser Position. -There's a Track Circuit Break here.=Hier ist eine Gleisabschnittsgrenze (TCB). -There's a Signal Influence Point here.=Hier ist ein Signal-Beeinflussungspunkt. -Buffer and Chain Coupler=Schraubenkupplung -Scharfenberg Coupler=Scharfenbergkupplung -Japanese Train Inter-Wagon Connection=Waggonzwischenverbindung Japanischer Personenzug -Can not couple: The couplers of the trains do not match (@1 and @2).=Kann nicht ankuppeln: Die Kupplungen der Züge passen nicht zueinander (@1 und @2) -= diff --git a/mods/advtrains/advtrains/locale/advtrains.zh_CN.tr b/mods/advtrains/advtrains/locale/advtrains.zh_CN.tr deleted file mode 100644 index ef9c99b4..00000000 --- a/mods/advtrains/advtrains/locale/advtrains.zh_CN.tr +++ /dev/null @@ -1,107 +0,0 @@ -# textdomain: advtrains - -# Advtrains Core (unorganized) -This wagon is owned by @1, you can't destroy it.=这是@1的车厢, ä½ ä¸èƒ½æ‘§æ¯å®ƒ. -Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=警告: 如果你摧æ¯æ­¤è½¦åŽ¢, ä½ åªèƒ½æ‹¿åˆ°ä¸€äº›é’¢æ–¹å—. 如果你确定è¦æ‘§æ¯è¿™ä¸ªè½¦åŽ¢,请按潜行键并左键å•å‡»æ­¤è½¦åŽ¢. -ATC controller, unconfigured.=ATC控制器 (未é…ç½®) -ATC controller=ATC控制器 -ATC controller, mode @1@nChannel: @2=ATC控制器@n模å¼: @1@n频é“: @2 -ATC controller, mode @1@nCommand: @2=ATC控制器@n模å¼: @1@n命令: @2 -Command=命令 -Command (on)=命令(激活时) -Digiline channel=Digiline é¢‘é“ -ATC Reverse command warning: didn't reverse train, train moving!=ATC警告:未执行“Râ€å‘½ä»¤, ç«è½¦åœ¨ç§»åŠ¨ -ATC command syntax error: I statement not closed: @1=ATC语法错误: "I"命令ä¸å®Œæ•´: @1 -ATC command parse error: Unknown command: @1=ATC语法错误: 未知命令: @1 -This position is protected!=这里已被ä¿æŠ¤. -You need to own at least one neighboring wagon to destroy this couple.=你必须至少拥有其中一个车厢æ‰èƒ½è§£è€¦è¿™ä¸¤ä¸ªè½¦åŽ¢. -This node can't be rotated using the trackworker!=ä½ ä¸èƒ½ä½¿ç”¨é“路调整工具旋转这个方å—. -This node can't be changed using the trackworker!=ä½ ä¸èƒ½ä½¿ç”¨é“路调整工具调整这个方å—. -Can't place: not pointing at node=无法放置: 你没有选择任何方å—. -Can't place: space occupied!=无法放置: 此区域已被å ç”¨. -Can't place: protected position!=无法放置: 此区域已被ä¿æŠ¤. -Can't place: Not enough slope items left (@1 required)=无法放置: 你没有足够的é“路斜å¡æ”¾ç½®å·¥å…· (你需è¦@1个) -Can't place: There's no slope of length @1=无法放置: advtrainsä¸æ”¯æŒé•¿åº¦ä¸º@1mçš„æ–œå¡. -Can't place: no supporting node at upper end.=无法放置: 较高端没有支撑方å—. -Deprecated Track=请ä¸è¦ä½¿ç”¨ -Can't get on: wagon full or doors closed!=无法上车: 车门已关闭或车厢已满 -Use Sneak+rightclick to bypass closed doors!=请使用潜行+å³é”®ä¸Šè½¦ -Lock couples=é”定连接处 -Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=车门已关闭, 请使用潜行+å³é”®å•å‡»ä¸‹è½¦ -Access to @1=å¯å‰å¾€@1 -The clipboard couldn't access the metadata. Paste failed.=无法粘贴: 剪贴æ¿æ— æ³•è®¿é—®å…ƒæ•°æ® -The clipboard couldn't access the metadata. Copy failed.=无法å¤åˆ¶: 剪贴æ¿æ— æ³•è®¿é—®å…ƒæ•°æ® - -# Train HUD/Formspecs -Speed:=速度: -Target:=目标速度: -Show Inventory=显示物å“æ  -Select seat:=è¯·é€‰æ‹©åº§ä½ -Wagon properties=车厢属性 -Save wagon properties=ä¿å­˜è½¦åŽ¢å±žæ€§ -Text displayed outside on train=车厢外部显示 -Text displayed inside train=车厢内部显示 -Line=ç«è½¦çº¿è·¯ -Routingcode=è·¯ç”±ç  -Get off=下车 -Get off (forced)=强制下车 -(Doors closed)=(车门已关闭) - -# General -Save=ä¿å­˜ -# "off" and "on" can be translated differently depending on the context and are therefore not translated. -off=off -on=on - -# Line automation -Station Code=è½¦ç«™ä»£ç  -Station Name=车站å称 -Door Delay=车门关闭时间 -Departure Speed=出å‘速度 -Stop Time=åœç«™æ—¶é—´ - -# Items -Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=é“路调整工具@n@n左键å•å‡»: 切æ¢è½¨é“类型@nå³é”®å•å‡»: æ—‹è½¬æ–¹å— -Passive Component Naming Tool@n@nRight-click to name a passive component.=被动元件命å工具@n@nå³é”®å•å‡»å‘½å所选元件. -Train copy/paste tool@n@nLeft-click: copy train@nRight-click: paste train=ç«è½¦å¤åˆ¶å·¥å…·@n@n左键å•å‡»: å¤åˆ¶@nå³é”®å•å‡»: 粘帖 -Track=é“轨 -Perpendicular Diamond Crossing Track=垂直交å‰é“轨 -45/90 Degree Diamond Crossing Track=45度交å‰é“轨 -Unloading Track=å¸è´§é“轨 -Loading Track=装货é“轨 -Bumper=ä¿é™©æ  -Detector Rail=探测é“轨 -@1 Slope=@1æ–œå¡ -@1 Platform (low)=50cm高的@1ç«™å° -@1 Platform (high)=1m高的@1ç«™å° -@1 Platform (45 degree)=1m高的@1ç«™å° (45度) -Lampless Signal (@1)=臂æ¿ä¿¡å·æœº (@1) -Signal (@1)=ä¿¡å·ç¯ (@1) -Wallmounted Signal (l)=å£æŒ‚å¼ä¿¡å·ç¯ (左侧) -Wallmounted Signal (r)=å£æŒ‚å¼ä¿¡å·ç¯ (å³ä¾§) -Wallmounted Signal (t)=悬挂å¼ä¿¡å·ç¯ -Andrew's Cross=é“è·¯é“å£ä¿¡å·ç¯ -Boiler=锅炉 -driver's cab=驾驶室 -Wheel=车轮 -Chimney=烟囱 - -# Seats -Default Seat=é»˜è®¤åº§ä½ -Default Seat (driver stand)=é»˜è®¤åº§ä½ (å¸æœºåº§ä½) -Driver Stand=å¸æœºåº§ä½ -Driver Stand (left)=左侧å¸æœºåº§ä½ -Driver Stand (right)=å³ä¾§å¸æœºåº§ä½ - -# Wagon/engine types -Industrial Train Engine=工业用ç«è½¦å¤´ -Big Industrial Train Engine=大型工业用ç«è½¦å¤´ -Industrial tank wagon=液体è¿è¾“车厢 -Industrial wood wagon=木æè¿è¾“车厢 -Japanese Train Engine=高速列车车头 -Japanese Train Wagon=高速列车车厢 -Steam Engine=蒸汽机车 -Detailed Steam Engine=精细的蒸汽机车 -Passenger Wagon=客车 -Box Wagon=è´§è¿è½¦åŽ¢ -Subway Passenger Wagon=地é“车厢 diff --git a/mods/advtrains/advtrains/occupation.lua b/mods/advtrains/advtrains/occupation.lua index db399910..26e1f79b 100644 --- a/mods/advtrains/advtrains/occupation.lua +++ b/mods/advtrains/advtrains/occupation.lua @@ -86,9 +86,10 @@ end function o.set_item(train_id, pos, idx) local t = occgetcreate(pos) + assert(idx) local i = 1 while t[i] do - if t[i]==train_id then + if t[i]==train_id and t[i+1]==index then break end i = i + 2 @@ -98,25 +99,30 @@ function o.set_item(train_id, pos, idx) end -function o.clear_item(train_id, pos) +function o.clear_all_items(train_id, pos) local t = occget(pos) if not t then return end local i = 1 - local moving = false while t[i] do if t[i]==train_id then - if moving then - -- if, for some occasion, there should be a duplicate entry, erase this one too - atwarn("Duplicate occupation entry at",pos,"for train",train_id,":",t) - i = i - 2 - end - moving = true + table.remove(t, i) + table.remove(t, i) + else + i = i + 2 end - if moving then - t[i] = t[i+2] - t[i+1] = t[i+3] + end +end +function o.clear_specific_item(train_id, pos, index) + local t = occget(pos) + if not t then return end + local i = 1 + while t[i] do + if t[i]==train_id and t[i+1]==index then + table.remove(t, i) + table.remove(t, i) + else + i = i + 2 end - i = i + 2 end end @@ -143,64 +149,88 @@ function o.check_collision(pos, train_id) return false end --- Gets a mapping of train id's to indexes of trains that share this path item with this train --- The train itself will not be included. --- If the requested index position is off-track, returns {}. --- returns (table with train_id->index), position -function o.get_occupations(train, index) - local ppos, ontrack = advtrains.path_get(train, index) - if not ontrack then - atlog("Train",train.id,"get_occupations requested off-track",index) - return {}, ppos - end +-- Gets a mapping of train id's to indexes of trains that have a path item at this position +-- Note that the case where 2 or more indices are at a position only occurs if there is a track loop. +-- returns (table with train_id->{index1, index2...}) +function o.reverse_lookup(ppos) local pos = advtrains.round_vector_floor_y(ppos) local t = occget(pos) if not t then return {} end local r = {} local i = 1 - local train_id = train.id while t[i] do - if t[i]~=train_id then - r[t[i]] = t[i+1] - end + if not r[t[i]] then r[t[i]] = {} end + table.insert(r[t[i]], t[i+1]) i = i + 2 end + return r +end + +-- Gets a mapping of train id's to indexes of trains that have a path item at this position. +-- Quick variant: will only return one index per train (the latest one added) +-- returns (table with train_id->index) +function o.reverse_lookup_quick(ppos) + local pos = advtrains.round_vector_floor_y(ppos) + local t = occget(pos) + if not t then return {} end + local r = {} + local i = 1 + while t[i] do + r[t[i]] = t[i+1] + i = i + 2 + end + return r +end + +local OCC_CLOSE_PROXIMITY = 3 +-- Gets a mapping of train id's to index of trains that have a path item at this position. Selects at most one index based on a given heuristic, or even none if it does not match the heuristic criterion +-- returns (table with train_id->index), position +-- "in_train": first index that lies between train index and end index +-- "train_at_node": first index where the train is standing on that node (like in_train but with +-0.5 added to index) +-- "first_ahead": smallest index that is > current index +-- "before_end"(default): smallest index that is > end index +-- "close_proximity": within 3 indices close to the train index and end_index +-- "any": just output the first index found and do not check further (also occurs if both "in_train" and "first_ahead" heuristics have failed +function o.reverse_lookup_sel(pos, heuristic) + if not heuristic then heuristic = "before_end" end + local om = o.reverse_lookup(pos) + local r = {} + for tid, idxs in pairs(om) do + r[tid] = idxs[1] + if heuristic~="any" then + --must run a heuristic + --atdebug("reverse_lookup_sel is running heuristic for", pos,heuristic,"idxs",table.concat(idxs,",")) + local otrn = advtrains.trains[tid] + advtrains.train_ensure_init(tid, otrn) + local h_value + for _,idx in ipairs(idxs) do + if heuristic == "first_ahead" and idx > otrn.index and (not h_value or h_value>idx) then + h_value = idx + end + if heuristic == "before_end" and idx > otrn.end_index and (not h_value or h_value>idx) then + h_value = idx + end + if heuristic == "in_train" and idx < otrn.index and idx > otrn.end_index then + h_value = idx + end + if heuristic == "train_at_node" and idx < (otrn.index+0.5) and idx > (otrn.end_index-0.5) then + h_value = idx + end + if heuristic == "close_proximity" and idx < (otrn.index + OCC_CLOSE_PROXIMITY) and idx > (otrn.end_index - OCC_CLOSE_PROXIMITY) then + h_value = idx + end + end + r[tid] = h_value + --atdebug(h_value,"chosen") + end + end return r, pos end -- Gets a mapping of train id's to indexes of trains that stand or drive over -- returns (table with train_id->index) function o.get_trains_at(ppos) local pos = advtrains.round_vector_floor_y(ppos) - local t = occget(pos) - if not t then return {} end - local r = {} - local i = 1 - while t[i] do - local train = advtrains.trains[t[i]] - local idx = t[i+1] - if train.end_index - 0.5 <= idx and idx <= train.index + 0.5 then - r[t[i]] = idx - end - i = i + 2 - end - return r -end - --- Gets a mapping of train id's to indexes of trains that have a path --- generated over this node --- returns (table with train_id->index) -function o.get_trains_over(ppos) - local pos = advtrains.round_vector_floor_y(ppos) - local t = occget(pos) - if not t then return {} end - local r = {} - local i = 1 - while t[i] do - local idx = t[i+1] - r[t[i]] = idx - i = i + 2 - end - return r + return o.reverse_lookup_sel(pos, "train_at_node") end advtrains.occ = o diff --git a/mods/advtrains/advtrains/path.lua b/mods/advtrains/advtrains/path.lua index f2b8a13a..76769473 100644 --- a/mods/advtrains/advtrains/path.lua +++ b/mods/advtrains/advtrains/path.lua @@ -119,7 +119,7 @@ function advtrains.path_invalidate(train, ignore_lock) if train.path then for i,p in pairs(train.path) do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(p)) + advtrains.occ.clear_all_items(train.id, advtrains.round_vector_floor_y(p)) end end train.path = nil @@ -162,7 +162,7 @@ function advtrains.path_invalidate_ahead(train, start_idx, ignore_when_passed) -- leave current node in path, it won't change. What might change is the path onward from here (e.g. switch) local i = idx + 1 while train.path[i] do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i])) + advtrains.occ.clear_specific_item(train.id, advtrains.round_vector_floor_y(train.path[i]), i) i = i+1 end train.path_ext_f=idx @@ -375,12 +375,25 @@ function advtrains.path_get_index_by_offset(train, index, offset) return c_idx + frac end + +-- The path_dist[] table contains absolute distance values for every whole index. +-- Use this function to retrieve the correct absolute distance for a fractional index value (interpolate between floor and ceil index) +-- returns: absolute distance from path item 0 +function advtrains.path_get_path_dist_fractional(train, index) + local start_index_f = atfloor(index) + local frac = index - start_index_f + -- ensure path exists + advtrains.path_get_adjacent(train, index) + local dist1, dist2 = train.path_dist[start_index_f], train.path_dist[start_index_f+1] + return dist1 + (dist2-dist1)*frac +end + local PATH_CLEAR_KEEP = 4 function advtrains.path_clear_unused(train) local i for i = train.path_ext_b, train.path_req_b - PATH_CLEAR_KEEP do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i])) + advtrains.occ.clear_specific_item(train.id, advtrains.round_vector_floor_y(train.path[i]), i) train.path[i] = nil train.path_dist[i-1] = nil train.path_cp[i] = nil @@ -421,18 +434,19 @@ end -- Projects the path of "train" onto the path of "onto_train_id", and returns the index on onto_train's path -- that corresponds to "index" on "train"'s path, as well as whether both trains face each other -- index may be fractional +-- heuristic: see advtrains.occ.reverse_lookup_sel() -- returns: res_index, trains_facing -- returns nil when path can not be projected, either because trains are on different tracks or -- node at "index" happens to be on a turnout and it's the wrong direction -- Note - duplicate with similar functionality is in train_step_b() - that code combines train detection with projecting -function advtrains.path_project(train, index, onto_train_id) +function advtrains.path_project(train, index, onto_train_id, heuristic) local base_idx = atfloor(index) local frac_part = index - base_idx local base_pos = advtrains.path_get(train, base_idx) local base_cn = train.path_cn[base_idx] local otrn = advtrains.trains[onto_train_id] -- query occupation - local occ = advtrains.occ.get_trains_over(base_pos) + local occ = advtrains.occ.reverse_lookup_sel(base_pos, heuristic) -- is wanted train id contained? local ob_idx = occ[onto_train_id] if not ob_idx then diff --git a/mods/advtrains/advtrains/po/README.md b/mods/advtrains/advtrains/po/README.md new file mode 100644 index 00000000..3e94682c --- /dev/null +++ b/mods/advtrains/advtrains/po/README.md @@ -0,0 +1,70 @@ +# Translations +Please read this document before working on any translations. + +Unlike many other mods, Advtrains uses `.po` files for localization, +which are then automatically converted to `.tr` files when the mod is +loaded. Therefore, please submit patches that edit the `.po` files. + +## Getting Started +The translation files can be edited like any other `.po` file. + +If the translation file for your language does not exist, create it by +copying `template.txt` to `advtrains.XX.tr`, where `XX` is replaced by +the language code. + +Feel free to use the [discussion mailing list][srht-discuss] if you +have any questions regarding localization. + +You can share your `.po` file directly or [as a patch][gsm] to the [dev +mailing list][srht-devel]. The latter is encouraged, but, unlike code +changes, translation files sent directly are also accepted. + +[tr-format]: https://minetest.gitlab.io/minetest/translations/#translation-file-format +[srht-discuss]: https://lists.sr.ht/~gpcf/advtrains-discuss +[srht-devel]: https://lists.sr.ht/~gpcf/advtrains-devel +[gsm]: https://git-send-email.io + +## Translation Notes +* Translations should be consistent. You can use other entries or the +translations in Minetest as a reference. +* Translations do not have to fully correspond to the original text - +they only need to provide the same information. In particular, +translations do not need to have the same linguistical structure as the +original text. +* Replacement sequences (`@1`, `@2`, etc) should not be translated. +* Certain abbreviations or names, such as "Ks" or "Zs 3", should +generally not be translated. + +### (de) German +* Verwenden Sie die neue Rechtschreibung und die Sie-Form. +* Mit der deutschen Tastaturbelegung unter Linux können die +Anführungszeichen „“ mit AltGr-V bzw. AltGr-B eingegeben werden. + +### (zh) Chinese +(This section is written in English to avoid writing the note twice or +using only one of the variants, as most of this section applies to both +the traditional and simplified variants.) + +* Please use the 「〠quotation marks for Traditional Chinese and Ҡ+for Simplified Chinese. +* Please use the fullwidth variants of: , 〠。 ? ï¼ ï¼š ï¼› +* Please use the halfwidth variants of: ( ) [ ] / \ | +* Please do not leave any space between Han characters (including +fullwidth punctuation marks). +* Please leave a space between Han characters (excluding fullwidth +punctuation marks) and characters from other scripts (including +halfwidth punctuation marks). However, do not leave any space between +Han characters and Arabic numerals. + +## Notes for developers +* The `update-translations.sh` script can be used to update the +translation files. However, please make sure to install the +`basic_trains` mod before running the script. +* Please make sure that the first argument to `S` (or `attrans`) _only_ +includes string literals without formatting or concatenation. This is +unfortunately a limitation of the `xgettext` utility. +* Avoid word-by-word translations. +* Avoid manipulating translated strings (except for concatenation). Use +server-side translations if you have to modify the text sent to users. +* Avoid truncating strings unless multibyte characters are handled +properly. diff --git a/mods/advtrains/advtrains/po/advtrains.pot b/mods/advtrains/advtrains/po/advtrains.pot new file mode 100644 index 00000000..6fda1d7d --- /dev/null +++ b/mods/advtrains/advtrains/po/advtrains.pot @@ -0,0 +1,632 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the advtrains package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "" diff --git a/mods/advtrains/advtrains/po/de.po b/mods/advtrains/advtrains/po/de.po new file mode 100644 index 00000000..8821fe38 --- /dev/null +++ b/mods/advtrains/advtrains/po/de.po @@ -0,0 +1,724 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:18+0200\n" +"Last-Translator: Y. Wang \n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"Zugbeeinflussungsgleis in Betriebsart „@1“\n" +"Befehl: @2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "Befehl" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "Befehl (wenn aktiviert)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline-Kanal" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "Speichern" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" +"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt " +"werden." + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "" +"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum " +"Ausstieg gezwungen." + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "" +"Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden nicht " +"zum Ausstieg gezwungen." + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "Zugbeeinflussung: Unbekannter Befehl: @1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Werkzeug zur Erstellung von Zugkopien\n" +"\n" +"Linksklick: Zug ins Clipboard kopieren\n" +"Right-click: Kopierten Zug einfügen" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Ihnen fehlt das „@1“-Privileg." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz." + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des " +"Zuges nicht eingefügt werden." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Das Clipboard ist leer." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "" +"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden " +"kann." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht " +"kopiert werden." + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "Der Zug wurde Kopiert." + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Schraubenkupplung" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenbergkupplung" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "Sie dürfen ohne das „train_operator“-Privileg keine Züge ankuppeln." + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)." + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "Führerstand" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "Niedriger @1-Bahnsteig" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "Hoher @1-Bahnsteig" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "Hoher @1-Bahnsteig (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "Niedriger @1-Bahnsteig (45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Sie dürfen ohne das „track_builder“-Privileg nicht in der Nähe von Gleisen " +"bauen." + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "Sie dürfen ohne das „track_builder“-Privileg kein Gleis bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Sie dürfen ohne das „railway_operator“-Privileg keine Bahnanlage operieren." + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Mechanisches Signal" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "Lichtsignal" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "An der linken Seite montiertes Signal" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "An der rechten Seite montiertes Signal" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "An der Decke montiertes Signal" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Andreaskreuz" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"Gleiswerkzeug\n" +"\n" +"Linksklick: Gleistyp ändern\n" +"Rechtsklick: Objekt drehen" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden." + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "Dieses Gleis kann nicht gedreht werden." + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden." + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "Dieses Gleis kann nicht geändert werden." + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "Dieses Gleis kann nicht entfernt werden." + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Ein Zug steht an dieser Position." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Hier ist ein Signal-Beeinflussungspunkt." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1 Steigung" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block." + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "Es kann nicht platziert werden: Diese Position ist besetzt." + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" +"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es " +"werden insgesamt @1 benötigt." + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "" +"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht " +"definiert." + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "" +"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende " +"der Steigung." + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen." + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "Das Inventar dieses Waggons ist nicht leer." + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können." + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. " +"Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen." + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "Inventar Zeigen" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "Waggon-Einstellungen" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "Aussteigen" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "Ausstieg zwingen" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(Türen geschlossen)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "In diesem Waggon ist kein Sitzplatz vorhanden." + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "Der Waggon ist voll." + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "Die Türen sind geschlossen." + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "Sie können nicht in diesen Waggon einsteigen." + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "Wählen Sie einen Sitzplatz aus:" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "Waggon-Einstellungen speichern" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "Äußere Anzeige" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "Innere Anzeige" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "Linie" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" +"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz " +"geschlossener Türen auszusteigen." + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "Sie haben keinen Zugang zum Führerstand." + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "Geschwindigkeitskontrolle: @1" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "Sie dürfen ohne das „@1“-Privileg dieses Gleis nicht konfigurieren." + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "Sie dürfen dieses Gleis nicht konfigurieren." + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "Geschwindigkeitskontrollgleis" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "Kennzeichen der Haltestelle" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "Name der Haltestelle" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "Zeit für die Türschließung" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "Zielgeschwindigkeit bei Abfahrt" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "Gleis" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "Wartezeit" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "Türseite" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "Zug Umkehren" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "Fahrgäste zum Ausstieg zwingen" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" +"Die Haltestelle mit dem Kennzeichen „@1“ ist bereits vorhanden und wird von " +"@2 verwaltet." + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" +"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen." + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "Gleis zur Kennzeichnung einer Haltestelle" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "Nicht konfiguierter LuaATC-Bauteil" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" +"Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren." + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "LuaATC-Bauteil mit Fehlermeldung: @1" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" +"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche " +"Programme ausführen)" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"PC-Benennungswerkzeug\n" +"\n" +"Rechtsklick zur Benennung der passiven Komponente." + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "Sie dürfen ohne das „@1“ keinen passiven LuaATC-Bauteil benennen." + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "Führerstand Rechts" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "Führerstand Links" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "Industrielle Lokomotive" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "Große Industrielle Lokomotive" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "Tankwaggon" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "Holztransportwaggon" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "Waggonzwischenverbindung Japanischer Personenzüge" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "Führerstand" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "Japanische Personenzug-Lokomotive" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "Japanischer Personenzug-Passagierwaggon" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "Dampflokomotive" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "Detaillierte Dampflokomotive" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "Passagierwaggon" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "Güterwaggon" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "U-Bahn-Waggon" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Y-Weiche" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Dreiwegweiche" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Kreuzung mit zueinander orthogonalen Gleisen" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Kreuzung mit einem achsenparallelen Gleis" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Diagonale Gleiskreuzung" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Prellbock" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Zugbeeinflussungsgleis" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Abladungsgleis" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Beladungsgleis" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Detektorgleis" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n" +#~ "Kanal: @2" + +#~ msgid "Access to @1" +#~ msgstr "Zugang zu @1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "" +#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind " +#~ "geschlossen." + +#~ msgid "Can't place: protected position!" +#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt." + +#~ msgid "Default Seat" +#~ msgstr "Standardsitzplatz" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Standardsitzplatz (Führerstand)" + +#~ msgid "Deprecated Track" +#~ msgstr "ausrangiertes Gleis, nicht verwenden." + +#~ msgid "Lock couples" +#~ msgstr "Kupplungen sperren" + +#~ msgid "Speed:" +#~ msgstr "Geschw.:" + +#~ msgid "Target:" +#~ msgstr "Zielges.:" + +#~ msgid "This position is protected!" +#~ msgstr "Diese Position ist geschützt!" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen " +#~ "einzusteigen." + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln." diff --git a/mods/advtrains/advtrains/po/fr.po b/mods/advtrains/advtrains/po/fr.po new file mode 100644 index 00000000..c744d2ca --- /dev/null +++ b/mods/advtrains/advtrains/po/fr.po @@ -0,0 +1,728 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2024-11-02 21:31+0100\n" +"Last-Translator: Tanavit \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "Controlleur ATC, non-configuré" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"Controlleur ATC, mode @1\n" +"Commande : @2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "Commande" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "Commande (marche)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Canal Digiline" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "Sauvegarder" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" +"Attention : Commande ATC de renversement impossible car le train se déplace." + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "Avertissement commande ATC Éjecter : portes closes." + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "Avertissement commande ATC Éjecter : train en mouvement." + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Outil de copie/collage de train\n" +"\n" +"Clic-Gauche : copie\n" +"\n" +"Clic-Droit : collage" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Vous ne possédez pas le privilège \"@1\"." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte." + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Le presse-papier est vide." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "La fin du train serait hors voie : annulation." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "Pas de telle entité lua." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "Pas de tel wagon : @1." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "Pas de tel train : @1." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie." + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "Train copié." + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Attelage à tampon et vis" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Attelage Scharfenberg" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" +"Vous n'êtes pas autorisé à coupler des trains sans le privilège " +"\"train_operator\"." + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" +"Accouplement impossible: les attelages des trains ne concordent pas (@1 et " +"@2)." + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "Chaudière à vapeur" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "Cabine de pilotage" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "Roue" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "Cheminée" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "Quai @1 (bas)" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "Quai @1 (haut)" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "Quai @1 (haut, 45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "Quai @1 (bas, 45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "Possibilité de poser, retirer ou opérer les trains" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" +"Possibilité de poser, retirer ou opérer un quelconque train, indépendamment " +"du propriétaire, de la liste blanche ou de protection" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "Possibilité de poser ou retirer des voies dans les zones non protégées" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" +"Possibilité d'opérer des embranchements et signaux dans les zones non " +"protégées" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie sans le privilège " +"\"track_builder\" (?)" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement " +"protégé." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé." + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège " +"\"railway_operator\" manquant)" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Sémaphore" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "Signal" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "Signal mural (gauche)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "Signal mural (droit)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "Signal mural (plafond)" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Croix de Saint André" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"Outil \"Trackworker\"\n" +"\n" +"Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n" +"\n" +"Clic-Droit : tourne l'objet" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "Ce nÅ“ud ne peut être tourné avec l'outil \"Trackworker\"." + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "Cette voie ne peut pas être tournée." + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "Ce nÅ“ud ne peut être modifié avec l'outil \"Trackworker\"." + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "Cette voie ne peut pas être modifiée." + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "Cette voie ne peut pas être enlevée." + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Cet emplacement est occupé par un train." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Il y a un \"Track Circuit Break\" ici." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Il y a un \"Signal Influence Point\" ici." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "Pente @1" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "Placement impossible : ne pointe pas un nÅ“ud." + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "Placement impossible : espace occupé." + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" +"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)." + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1." + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "Placement impossible : pas de nÅ“ud d'appui à l'extrémité supérieure." + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" +"Franchissement de signal rouge : examinez la situation et inversez le sens " +"de marche du train." + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire." + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "Le stock de ce wagon n'est pas vide." + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" +"Les wagons doivent être désaccouplés des autres pour pouvoir être détruits." + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"Attention: Si vous détruisez ce wagon, vous ne récupérerez que de la " +"ferraille ! Si vous êtes sûr de vous, appuyez la touche \"Marcher lentement " +"(Sneak)\" et Clic-Gauche." + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "Montrer le stock" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "Ordinateur embarqué" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "Propriétés du wagon" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "Débarquer" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "Débarquer (de force)" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(Portes closes)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "Ce wagon n'a pas de siège." + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "Ce wagon est plein." + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "Portes closes : (Essayez la \"sneak key\"!\")" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "Montée impossible dans ce wagon." + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "Choisir le siège :" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "Sauvegarder les propriétés du wagon" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "Texte affiché à l'extérieur du train" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "Texte affiché à l'intérieur du train" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "Ligne" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "Code de routage" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" +"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour " +"franchir les portes et débarquer." + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "Accès interdit au poste de pilotage." + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "Point de limitation de vitesse : @1" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "Placez un point de limitation de vitesse :" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "Vous n'êtes pas autorisé à configurer cette voie sans le privilège @1." + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "Vous n'êtes pas autorisé à configurer cette voie." + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "Voie de point de limitation de vitesse" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "Code de Station" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "Nom de Station" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "Durée d'ouverture des portes" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "Vitesse de départ" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "Voie" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "Durée d'arrêt" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "Coté d'ouvertures des portes" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "Inversion du sens de marche" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "Éjecter les passagers" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "Le code de station \"@1\" existe et est possédé par @2." + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" +"Cette station est la propriété de @1. Vous n'êtes pas autorisé à modifier " +"son nom." + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "Voie d'arrêt en station" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "Composant LuaATC non configuré" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "Environnement LuaATC" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "Effacer l'environnement LuaATC" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "Code" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "Vous ne pouvez configurer ce composant LuaATC sans le privilege @1." + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "Composant LuaATC assigné à l'environnement '@1'" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "Composant LuaATC assigné à un environnement invalide" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "Erreur @1 du composant LuaATC" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" +"Permet le placement et la configuration de composants LuaATC avec risque " +"d'exécution de code Lua dangereux" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "Commande Mesecon de LuaATC" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "Panneau de commande de LuaATC" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"Outil de nommage de composant passif\n" +"\n" +"Clic-Droit pour nommer un composant passif." + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1." + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "Nommer le composant (chaîne vide pour effacer)" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "Poste de pilotage (droit)" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "Poste de pilotage (gauche)" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "Locomotive industrielle" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "Grosse locomotive industrielle" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "Wagon-citerne industriel" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "Wagon grumier industriel" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "Passage inter-voiture de train Japonais" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "Poste de pilotage" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "Motrice Japonaise" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "Voiture Japonaise" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "Locomotive à vapeur" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "Locomotive à vapeur complexe" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "Voiture passager" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "Wagon de frêt" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "Voiture de Métropolitain" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Embranchement en Y" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Embranchement triple" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Croisement perpendiculaire" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Croisement perpendiculo-diagonal" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Croisement diagonal" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Heurtoir" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Controlleur ATC" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Voie de Déchargement" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Voie de Chargement" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Voie détectrice" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "Controlleur ATC, mode @1\n" +#~ "Canal : @2" + +#~ msgid "Access to @1" +#~ msgstr "Accès à @1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "" +#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !" + +#~ msgid "Can't place: protected position!" +#~ msgstr "Placement impossible : emplacement protégé" + +#~ msgid "Default Seat" +#~ msgstr "Siège par défaut" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Siège par défaut (poste de pilotage)" + +#~ msgid "Deprecated Track" +#~ msgstr "Voie déconseillée" + +#~ msgid "Lock couples" +#~ msgstr "Verrouiller l'accouplement" + +#~ msgid "Speed:" +#~ msgstr "Vitesse : " + +#~ msgid "Target:" +#~ msgstr "Destination : " + +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "Ce nÅ“ud ne peut être tourné avec l'outil \"Trackworker\" !" + +#~ msgid "This position is protected!" +#~ msgstr "Cet emplacement est protégé !" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les " +#~ "portes closes !" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer " +#~ "cet attelage." diff --git a/mods/advtrains/advtrains/po/update-translations.sh b/mods/advtrains/advtrains/po/update-translations.sh new file mode 100755 index 00000000..3a56c7ce --- /dev/null +++ b/mods/advtrains/advtrains/po/update-translations.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# NOTE: Please make sure you also have basic_trains installed, as it uses attrans for historical reasons + +PODIR=`dirname "$0"` +ATDIR="$PODIR/../.." +BTDIR="$ATDIR/../basic_trains" +POTFILE="$PODIR/advtrains.pot" + +xgettext \ + -D "$ATDIR" \ + -D "$BTDIR" \ + -d advtrains \ + -o "$POTFILE" \ + -p . \ + -L lua \ + --from-code=UTF-8 \ + --sort-by-file \ + --keyword='attrans' \ + --keyword='S' \ + --package-name='advtrains' \ + --msgid-bugs-address='advtrains-discuss@lists.sr.ht' \ + `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \ + && +for i in "$PODIR"/*.po; do + msgmerge -U \ + --sort-by-file \ + $i "$POTFILE" +done diff --git a/mods/advtrains/advtrains/po/zh_CN.po b/mods/advtrains/advtrains/po/zh_CN.po new file mode 100644 index 00000000..5bcc316c --- /dev/null +++ b/mods/advtrains/advtrains/po/zh_CN.po @@ -0,0 +1,696 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:24+0200\n" +"Last-Translator: Y. Wang \n" +"Language-Team: Chinese (Simplified)\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "ATC 控制器 (未é…ç½®)" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"ATC 控制器\n" +"模å¼ï¼š@1\n" +"命令:@2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "命令" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "命令 (激活时)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline 频é“" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "ä¿å­˜" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "ATC 警告:ç«è½¦æ­£åœ¨ç§»åŠ¨ï¼Œæ— æ³•æ”¹å˜è¡Œè½¦æ–¹å‘。" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "ATC 警告:车门已关闭,无法踢出乘客。" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "ATC 警告:ç«è½¦æ­£åœ¨ç§»åŠ¨ï¼Œæ— æ³•è¸¢å‡ºä¹˜å®¢ã€‚" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "ATC 语法错误:“Iâ€å‘½ä»¤ä¸å®Œæ•´ï¼š@1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "ATC 语法错误:未知命令:@1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"ç«è½¦å¤åˆ¶å·¥å…·\n" +"\n" +"左键å•å‡»ï¼šå¤åˆ¶\n" +"å³é”®å•å‡»ï¼šç²˜å¸–" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您没有“@1â€æƒé™ã€‚" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "轨é“太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "无法粘贴:剪贴æ¿æ— æ³•è®¿é—®å…ƒæ•°æ®ã€‚" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪贴æ¿æ˜¯ç©ºçš„。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "ç«è½¦åŽéƒ¨ä¸åœ¨è½¨é“上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "您没有指å‘一个å¯ä»¥ç”¨ç«è½¦å¤åˆ¶å·¥å…·å¤åˆ¶çš„物体。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "ID 为“@1â€çš„车厢ä¸å­˜åœ¨ã€‚" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "ID 为“@1â€çš„列车ä¸å­˜åœ¨ã€‚" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "无法å¤åˆ¶ï¼šå‰ªè´´æ¿æ— æ³•è®¿é—®å…ƒæ•°æ®ã€‚" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "å·²å¤åˆ¶åˆ—车。" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "链å¼è½¦é’©" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg å¼è½¦é’©" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您没有“train_operatorâ€æƒé™ï¼Œä¸èƒ½è¿žæŽ¥è¿™ä¸¤èŠ‚车厢。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "<没有车钩>" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您无法连接这两节车厢:这两节车厢使用ä¸åŒçš„车钩 (@1å’Œ@2)。" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "锅炉" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "驾驶室" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "车轮" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "烟囱" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "较低的@1ç«™å°" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "较高的@1ç«™å°" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "较高的@1ç«™å° (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "较低的@1ç«™å° (45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您没有“train_operatorâ€æƒé™ï¼Œä¸èƒ½åœ¨é“路附近建任何东西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您没有“train_operatorâ€æƒé™ï¼Œä¸èƒ½åœ¨è¿™é‡Œå»ºé€ é“路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "这里已被ä¿æŠ¤ï¼Œæ‚¨ä¸èƒ½åœ¨è¿™é‡Œçš„é“路附近建任何东西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "这里已被ä¿æŠ¤ï¼Œæ‚¨ä¸èƒ½åœ¨è¿™é‡Œå»ºé€ é“路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您没有“railway_operatorâ€æƒé™ï¼Œä¸èƒ½æŽ§åˆ¶é“路设施。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂æ¿ä¿¡å·æœº" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "ä¿¡å·ç¯" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "å£æŒ‚å¼ä¿¡å·ç¯ (左侧)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "å£æŒ‚å¼ä¿¡å·ç¯ (å³ä¾§)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "悬挂å¼ä¿¡å·ç¯" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "é“è·¯é“å£ä¿¡å·ç¯" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"é“路调整工具\n" +"\n" +"左键å•å‡»ï¼šåˆ‡æ¢è½¨é“类型\n" +"å³é”®å•å‡»ï¼šæ—‹è½¬æ–¹å—" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "您ä¸èƒ½ä½¿ç”¨é“路调整工具旋转这个方å—。" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "您ä¸èƒ½æ—‹è½¬è¿™æ®µè½¨é“。" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "您ä¸èƒ½ä½¿ç”¨é“路调整工具调整这个方å—。" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "您ä¸èƒ½è°ƒæ•´è¿™æ®µè½¨é“。" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "您ä¸èƒ½ç§»é™¤è¿™æ®µè½¨é“。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1æ–œå¡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "无法放置斜å¡ï¼šæ‚¨æ²¡æœ‰é€‰æ‹©ä»»ä½•æ–¹å—。" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "无法放置斜å¡ï¼šæ­¤åŒºåŸŸå·²è¢«å ç”¨ã€‚" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "无法放置斜å¡ï¼šæ‚¨æ²¡æœ‰è¶³å¤Ÿçš„é“路斜å¡æ”¾ç½®å·¥å…· (您总共需è¦@1个)" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "无法放置斜å¡ï¼šadvtrains ä¸æ”¯æŒé•¿åº¦ä¸º@1米的斜å¡ã€‚" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "无法放置斜å¡ï¼šè¾ƒé«˜ç«¯æ²¡æœ‰æ”¯æ’‘æ–¹å—。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "这是 @1 的车厢,您ä¸èƒ½æ‘§æ¯å®ƒã€‚" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"警告:如果您摧æ¯æ­¤è½¦åŽ¢ï¼Œæ‚¨åªèƒ½æ‹¿åˆ°ä¸€äº›é’¢æ–¹å—。如果您确定è¦æ‘§æ¯è¿™èŠ‚车厢,请按" +"潜行键并左键å•å‡»æ­¤è½¦åŽ¢ã€‚" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "显示物å“æ " + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "车厢属性" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "下车" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "强制下车" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(车门已关闭)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "这节车厢没有座ä½ã€‚" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "车厢已满。" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "请选择座ä½ï¼š" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "ä¿å­˜è½¦åŽ¢å±žæ€§" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "车厢外部显示" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "车厢内部显示" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "ç«è½¦çº¿è·¯" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "路由ç " + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "车门已关闭,请使用潜行+å³é”®å•å‡»ä¸‹è½¦ã€‚" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "您没有“@1â€æƒé™ï¼Œä¸èƒ½è°ƒæ•´è¿™æ®µè½¨é“。" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "您ä¸èƒ½è°ƒæ•´è¿™æ®µè½¨é“。" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "车站代ç " + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "车站å称" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "车门关闭时间" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "出å‘速度" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "轨é“" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "åœç«™æ—¶é—´" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "改å˜è¡Œè½¦æ–¹å‘" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "踢出乘客" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "车站轨é“" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "LuaATC 部件 (未é…ç½®)" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "您没有“@1â€æƒé™ï¼Œä¸èƒ½é…置这个 LuaATC 部件。" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被动元件命å工具\n" +"\n" +"å³é”®å•å‡»å‘½å所选元件。" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "您没有“@1â€æƒé™ï¼Œä¸èƒ½å‘½å被动元件。" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "å³ä¾§å¸æœºåº§ä½" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "左侧å¸æœºåº§ä½" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "工业用ç«è½¦å¤´" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "大型工业用ç«è½¦å¤´" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "液体è¿è¾“车厢" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "木æè¿è¾“车厢" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "日本ç«è½¦è½¦é’©" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "å¸æœºåº§ä½" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "高速列车车头" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "高速列车车厢" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "蒸汽机车" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "精细的蒸汽机车" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "客车" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "è´§è¿è½¦åŽ¢" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "地é“车厢" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "对称é“å²”" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三开é“å²”" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交å‰è½¨é“" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交å‰è½¨é“ (其中一æ¡è½¨é“与å标轴平行)" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交å‰è½¨é“" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "ä¿é™©æ " + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "å¸è´§è½¨é“" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "装货轨é“" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探测轨é“" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "ATC 控制器\n" +#~ "模å¼ï¼š@1\n" +#~ "频é“:@2" + +#~ msgid "Access to @1" +#~ msgstr "å¯å‰å¾€@1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "无法上车:车门已关闭或车厢已满。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "无法放置:此区域已被ä¿æŠ¤ã€‚" + +#~ msgid "Default Seat" +#~ msgstr "默认座ä½" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "é»˜è®¤åº§ä½ (å¸æœºåº§ä½)" + +#~ msgid "Deprecated Track" +#~ msgstr "请ä¸è¦ä½¿ç”¨" + +#~ msgid "Lock couples" +#~ msgstr "é”定连接处" + +#~ msgid "Speed:" +#~ msgstr "速度" + +#~ msgid "Target:" +#~ msgstr "目标速度" + +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "您ä¸èƒ½ä½¿ç”¨é“路调整工具旋转这个方å—。" + +#~ msgid "This position is protected!" +#~ msgstr "这里已被ä¿æŠ¤ã€‚" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "请使用潜行+å³é”®ä¸Šè½¦ã€‚" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "这里已被ä¿æŠ¤ï¼Œæ‚¨ä¸èƒ½åœ¨è¿™é‡Œå»ºé€ é“路。" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必须至少拥有其中一节车厢æ‰èƒ½åˆ†å¼€è¿™ä¸¤èŠ‚车厢。" diff --git a/mods/advtrains/advtrains/po/zh_TW.po b/mods/advtrains/advtrains/po/zh_TW.po new file mode 100644 index 00000000..ece82c3f --- /dev/null +++ b/mods/advtrains/advtrains/po/zh_TW.po @@ -0,0 +1,696 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:31+0200\n" +"Last-Translator: Y. Wang \n" +"Language-Team: Chinese (Traditional)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "ATC 控制器 (未é…ç½®)" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"ATC 控制器\n" +"模å¼ï¼š@1\n" +"命令:@2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "命令" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "命令 (啟用時)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline é »é“" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "儲存" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "ATC 警告:ç«è»Šæ­£åœ¨ç§»å‹•ï¼Œç„¡æ³•æ”¹è®Šè¡Œè»Šæ–¹å‘。" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "ATC 警告:車門已關閉,無法踢出乘客。" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "ATC 警告:ç«è»Šæ­£åœ¨ç§»å‹•ï¼Œç„¡æ³•è¸¢å‡ºä¹˜å®¢ã€‚" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "ATC 語法錯誤:「Iã€å‘½ä»¤ä¸å®Œæ•´ï¼š@1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "ATC 語法錯誤:未知命令:@1" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"ç«è»Šè¤‡è£½å·¥å…·\n" +"\n" +"å·¦éµå–®æ“Šï¼šè¤‡è£½\n" +"å³éµå–®æ“Šï¼šç²˜å¸–" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您沒有「@1ã€è¨±å¯æ¬Šã€‚" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "軌é“太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "無法貼上:剪貼簿無法訪å•å…ƒè³‡æ–™ã€‚" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪貼簿是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "ç«è»Šå¾Œéƒ¨ä¸åœ¨è»Œé“上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "您沒有指å‘一個å¯ä»¥ç”¨ç«è»Šè¤‡è£½å·¥å…·è¤‡è£½çš„物體。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "ID 為「@1ã€çš„車廂ä¸å­˜åœ¨ã€‚" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "ID 為「@1ã€çš„列車ä¸å­˜åœ¨ã€‚" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "無法複製:剪貼簿無法訪å•å…ƒè³‡æ–™ã€‚" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "已複製ç«è»Šã€‚" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "éˆå¼é€£çµå™¨" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg å¼é€£çµå™¨" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您沒有「train_operatorã€è¨±å¯æ¬Šï¼Œä¸èƒ½é€£çµé€™å…©ç¯€è»Šå»‚。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "<無連çµå™¨>" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您無法連çµé€™å…©ç¯€è»Šå»‚:這兩節車廂使用ä¸åŒçš„連çµå™¨ (@1å’Œ@2)。" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "é‹çˆ" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "駕駛室" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "車輪" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "煙囪" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "較低的@1月臺" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "較高的@1月臺" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "較高的@1月臺 (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "較低的@1月臺 (45°)" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您沒有「train_operatorã€è¨±å¯æ¬Šï¼Œä¸èƒ½åœ¨éµè·¯é™„近建任何æ±è¥¿ã€‚" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您沒有「train_operatorã€è¨±å¯æ¬Šï¼Œä¸èƒ½åœ¨é€™è£¡å»ºé€ éµè·¯ã€‚" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "這裡已被ä¿è­·ï¼Œæ‚¨ä¸èƒ½åœ¨é€™è£¡çš„éµè·¯é™„近建任何æ±è¥¿ã€‚" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "這裡已被ä¿è­·ï¼Œæ‚¨ä¸èƒ½åœ¨é€™è£¡å»ºé€ éµè·¯ã€‚" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您沒有「railway_operatorã€è¨±å¯æ¬Šï¼Œä¸èƒ½æŽ§åˆ¶éµè·¯è¨­æ–½ã€‚" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂木å¼è™ŸèªŒæ©Ÿ" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "色燈號誌機" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "å£æŽ›å¼è‰²ç‡ˆè™ŸèªŒæ©Ÿ (å·¦å´)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "å£æŽ›å¼è‰²ç‡ˆè™ŸèªŒæ©Ÿ (å³å´)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "懸掛å¼è‰²ç‡ˆè™ŸèªŒæ©Ÿ" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "平交é“號誌燈" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" +"éµè·¯èª¿æ•´å·¥å…·\n" +"\n" +"å·¦éµå–®æ“Šï¼šåˆ‡æ›è»Œé“型別\n" +"å³éµå–®æ“Šï¼šæ—‹è½‰æ–¹å¡Š" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "您ä¸èƒ½ä½¿ç”¨éµè·¯èª¿æ•´å·¥å…·æ—‹è½‰é€™å€‹æ–¹å¡Šã€‚" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "您ä¸èƒ½æ—‹è½‰é€™æ®µè»Œé“。" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "您ä¸èƒ½ä½¿ç”¨éµè·¯èª¿æ•´å·¥å…·èª¿æ•´é€™å€‹æ–¹å¡Šã€‚" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "您ä¸èƒ½èª¿æ•´é€™æ®µè»Œé“。" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "您ä¸èƒ½ç§»é™¤é€™æ®µè»Œé“。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1æ–œå¡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "無法放置斜å¡ï¼šæ‚¨æ²’有é¸æ“‡ä»»ä½•æ–¹å¡Šã€‚" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "無法放置斜å¡ï¼šæ­¤å€åŸŸå·²è¢«ä½”用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "無法放置斜å¡ï¼šæ‚¨æ²’有足夠的éµè·¯æ–œå¡æ”¾ç½®å·¥å…· (您總共需è¦@1個)" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "無法放置斜å¡ï¼šadvtrains ä¸æ”¯æ´é•·åº¦ç‚º@1米的斜å¡ã€‚" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "無法放置斜å¡ï¼šè¼ƒé«˜éšŽæ²’有支æ’方塊。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "這是 @1 的車廂,您ä¸èƒ½æ‘§æ¯€å®ƒã€‚" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"警告:如果您摧毀此車廂,您åªèƒ½æ‹¿åˆ°ä¸€äº›é‹¼æ–¹å¡Šã€‚如果您確定è¦æ‘§æ¯€é€™ç¯€è»Šå»‚,請按" +"潛行éµä¸¦å·¦éµå–®æ“Šæ­¤è»Šå»‚。" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "顯示物å“欄" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "車廂屬性" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "下車" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "強制下車" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(車門已關閉)" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "這節車廂沒有座ä½ã€‚" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "車廂已滿。" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "è«‹é¸æ“‡åº§ä½ï¼š" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "儲存車廂屬性" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "車廂外部顯示" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "車廂內部顯示" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "ç«è»Šç·šè·¯" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "路由碼" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "車門已關閉,請使用潛行+å³éµå–®æ“Šä¸‹è»Šã€‚" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "您沒有「@1ã€è¨±å¯æ¬Šï¼Œä¸èƒ½èª¿æ•´é€™æ®µè»Œé“。" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "您ä¸èƒ½èª¿æ•´é€™æ®µè»Œé“。" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "車站碼" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "車站å稱" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "車門關閉時間" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "出發速度" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "軌é“" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "åœç«™æ™‚é–“" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "改變行車方å‘" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "踢出乘客" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "車站軌é“" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "LuaATC 元件 (未é…ç½®)" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "您沒有「@1ã€è¨±å¯æ¬Šï¼Œä¸èƒ½é…置這個 LuaATC 元件。" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被動元件命å工具\n" +"\n" +"å³éµå–®æ“Šå‘½å所é¸å…ƒä»¶ã€‚" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "您沒有「@1ã€è¨±å¯æ¬Šï¼Œä¸èƒ½å‘½å這個元件。" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "å³å´å¸æ©Ÿåº§ä½" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "å·¦å´å¸æ©Ÿåº§ä½" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "工業用ç«è»Šé ­" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "大型工業用ç«è»Šé ­" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "液體é‹è¼¸è»Šå»‚" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "木æé‹è¼¸è»Šå»‚" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "日本ç«è»Šé€£çµå™¨" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "å¸æ©Ÿåº§ä½" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "高速列車車頭" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "高速列車車廂" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "蒸汽機車" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "精細的蒸汽機車" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "客車" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "貨é‹è»Šå»‚" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "地éµè»Šå»‚" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "å°ç¨±é“å²”" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三開é“å²”" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交å‰è»Œé“" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交å‰è»Œé“ (其中一æ¢è»Œé“與座標軸平行)" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交å‰è»Œé“" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "ä¿éšªæ§“" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "å¸è²¨è»Œé“" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "è£è²¨è»Œé“" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探測軌é“" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "ATC 控制器\n" +#~ "模å¼ï¼š@1\n" +#~ "é »é“:@2" + +#~ msgid "Access to @1" +#~ msgstr "å¯å‰å¾€@1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "無法上車:車門已關閉或車廂已滿。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "無法放置:此å€åŸŸå·²è¢«ä¿è­·ã€‚" + +#~ msgid "Default Seat" +#~ msgstr "é è¨­åº§ä½" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "é è¨­åº§ä½ (å¸æ©Ÿåº§ä½)" + +#~ msgid "Deprecated Track" +#~ msgstr "è«‹ä¸è¦ä½¿ç”¨" + +#~ msgid "Lock couples" +#~ msgstr "鎖定連çµè™•" + +#~ msgid "Speed:" +#~ msgstr "速度" + +#~ msgid "Target:" +#~ msgstr "目標速度" + +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "您ä¸èƒ½ä½¿ç”¨éµè·¯èª¿æ•´å·¥å…·æ—‹è½‰é€™å€‹æ–¹å¡Šã€‚" + +#~ msgid "This position is protected!" +#~ msgstr "這裡已被ä¿è­·ã€‚" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "請使用潛行+å³éµä¸Šè»Šã€‚" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "這裡已被ä¿è­·ï¼Œæ‚¨ä¸èƒ½åœ¨é€™è£¡å»ºé€ éµè·¯ã€‚" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必須至少æ“有其中一節車廂æ‰èƒ½åˆ†é–‹é€™å…©ç¯€è»Šå»‚。" diff --git a/mods/advtrains/advtrains/poconvert.lua b/mods/advtrains/advtrains/poconvert.lua new file mode 100644 index 00000000..74f962ee --- /dev/null +++ b/mods/advtrains/advtrains/poconvert.lua @@ -0,0 +1,185 @@ +local unescape_string +do + local schartbl = { -- https://en.wikipedia.org/wiki/Escape_sequences_in_C + a = "\a", + b = "\b", + e = string.char(0x1b), + f = "\f", + n = "\n", + r = "\r", + t = "\t", + v = "\v", + } + local function replace_single(pfx, c) + local pl = #pfx + if pl % 2 == 0 then + return string.sub(pfx, 1, pl/2) .. c + end + return string.sub(pfx, 1, math.floor(pl/2)) .. (schartbl[c] or c) + end + unescape_string = function(str) + return string.gsub(str, [[(\+)([abefnrtv'"?])]], replace_single) + end +end + +local function readstring_aux(str, pos) + local _, spos = string.find(str, [[^%s*"]], pos) + if not spos then + return nil + end + local ipos = spos + while true do + local _, epos, m = string.find(str, [[(\*)"]], ipos+1) + if not epos then + return error("String extends beyond the end of input") + end + ipos = epos + if #m % 2 == 0 then + return unescape_string(string.sub(str, spos+1, epos-1)), epos+1 + end + end +end + +local function readstring(str, pos) + local st = {} + local nxt = pos + while true do + local s, npos = readstring_aux(str, nxt) + if not s then + if not st[1] then + return nil, nxt + else + return table.concat(st), nxt + end + end + nxt = npos + table.insert(st, s) + end +end + +local function readtoken(str, pos) + local _, epos, tok = string.find(str, [[^%s*(%S+)]], pos) + if epos == nil then + return nil, pos + end + return tok, epos+1 +end + +local function readcomment_add_flags(flags, s) + for flag in string.gmatch(s, ",%s*([^,]+)") do + flags[flag] = true + end +end + +local function readcomment_aux(str, pos) + local _, epos, sval = string.find(str, "^\n*#([^\n]*)", pos) + if not epos then + return nil + end + return sval, epos+1 +end + +local function readcomment(str, pos) + local st = {} + local nxt = pos + local flags = {} + while true do + local s, npos = readcomment_aux(str, nxt) + if not npos then + local t = { + comment = table.concat(st, "\n"), + flags = flags, + } + return t, nxt + end + if string.sub(s, 1, 1) == "," then + readcomment_add_flags(flags, s) + end + table.insert(st, s) + nxt = npos + end +end + +local function readpo(str) + local st = {} + local pos = 1 + while true do + local entry, nxt = readcomment(str, pos) + local msglines = 0 + while true do + local tok, npos = readtoken(str, nxt) + if tok == nil or string.sub(tok, 1, 1) == "#" then + break + elseif string.sub(tok, 1, 3) ~= "msg" then + return error("Invalid token: " .. tok) + elseif entry[tok] ~= nil then + break + else + local value, npos = readstring(str, npos) + assert(value ~= nil, "No string provided for " .. tok) + entry[tok] = value + nxt = npos + msglines = msglines+1 + end + end + if msglines == 0 then + return st + elseif entry.msgid ~= "" then + assert(entry.msgid ~= nil, "Missing untranslated string") + assert(entry.msgstr ~= nil, "Missing translated string") + table.insert(st, entry) + end + pos = nxt + end +end + +local escape_lookup = { + ["="] = "@=", + ["\n"] = "@n" +} +local function escape_string(st) + return (string.gsub(st, "[=\n]", escape_lookup)) +end + +local function convert_po_string(textdomain, str) + local st = {string.format("# textdomain: %s", textdomain)} + for _, entry in ipairs(readpo(str)) do + local line = ("%s=%s"):format(escape_string(entry.msgid), escape_string(entry.msgstr)) + if entry.flags.fuzzy then + line = "#" .. line + end + table.insert(st, line) + end + return table.concat(st, "\n") +end + +local function convert_po_file(textdomain, inpath, outpath) + local f, err = io.open(inpath, "rb") + assert(f, err) + local str = convert_po_string(textdomain, f:read("*a")) + f:close() + minetest.safe_file_write(outpath, str) + return str +end + +local function convert_flat_po_directory(textdomain, modpath) + assert(textdomain, "No textdomain specified for po file conversion") + local mp = modpath or minetest.get_modpath(textdomain) + assert(mp ~= nil, "No path to write for " .. textdomain) + local popath = mp .. "/po" + local trpath = mp .. "/locale" + for _, infile in pairs(minetest.get_dir_list(popath, false)) do + local lang = string.match(infile, [[^([^%.]+)%.po$]]) + if lang then + local inpath = popath .. "/" .. infile + local outpath = ("%s/%s.%s.tr"):format(trpath, textdomain, lang) + convert_po_file(textdomain, inpath, outpath) + end + end +end + +return { + from_string = convert_po_string, + from_file = convert_po_file, + from_flat = convert_flat_po_directory, +} diff --git a/mods/advtrains/advtrains/protection.lua b/mods/advtrains/advtrains/protection.lua index 7474977a..ac1cd66a 100644 --- a/mods/advtrains/advtrains/protection.lua +++ b/mods/advtrains/advtrains/protection.lua @@ -4,24 +4,24 @@ -- Privileges to control TRAIN DRIVING/COUPLING minetest.register_privilege("train_operator", { - description = "Without this privilege, a player can't do anything about trains, neither place or remove them nor drive or couple them (but he can build tracks if he has track_builder)", + description = attrans("Can place, remove and operate trains"), give_to_singleplayer= true, }); minetest.register_privilege("train_admin", { - description = "Player may drive, place or remove any trains from/to anywhere, regardless of owner, whitelist or protection", + description = attrans("Can place, remove and operate any train, regardless of owner, whitelist, or protection"), give_to_singleplayer= true, }); -- Privileges to control TRACK BUILDING minetest.register_privilege("track_builder", { - description = "Player can place and/or dig rails not protected from him. If he also has protection_bypass, he can place/dig any rails", + description = attrans("Can place and dig tracks in unprotected areas"), give_to_singleplayer= true, }); -- Privileges to control OPERATING TURNOUTS/SIGNALS minetest.register_privilege("railway_operator", { - description = "Player can operate turnouts and signals not protected from him. If he also has protection_bypass, he can operate any turnouts/signals", + description = attrans("Can operate turnouts and signals in unprotected areas"), give_to_singleplayer= true, }); @@ -145,12 +145,12 @@ function advtrains.check_track_protection(pos, pname, near, prot_p) --atdebug("CTP: ",pos,pname,near,prot_p,"priv=",priv,"prot=",prot,"dprot=",dprot) if not priv and (not boo or prot or not dprot) then - minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks without track_builder privilege") + minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks without the track_builder privilege.") or attrans("You are not allowed to build tracks without the track_builder privilege.")) minetest.log("action", pname.." tried to modify terrain "..nears.."track at "..minetest.pos_to_string(apos).." but is not permitted to (no privilege)") return false end if prot then - minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks at protected position!") + minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks at this protected position.") or attrans("You are not allowed to build tracks at this protected position.")) minetest.record_protection_violation(pos, pname) minetest.log("action", pname.." tried to modify "..nears.."track at "..minetest.pos_to_string(apos).." but position is protected!") return false @@ -181,7 +181,7 @@ function advtrains.check_turnout_signal_protection(pos, pname) nocheck=false return true else - minetest.chat_send_player(pname, "You are not allowed to operate turnouts and signals (missing railway_operator privilege)") + minetest.chat_send_player(pname, attrans("You are not allowed to operate turnouts and signals without the railway_operator privilege.")) minetest.log("action", pname.." tried to operate turnout/signal at "..minetest.pos_to_string(pos).." but does not have railway_operator") nocheck=false return false diff --git a/mods/advtrains/advtrains/settingtypes.txt b/mods/advtrains/advtrains/settingtypes.txt index 2b627cb5..a495d1e4 100644 --- a/mods/advtrains/advtrains/settingtypes.txt +++ b/mods/advtrains/advtrains/settingtypes.txt @@ -61,3 +61,6 @@ advtrains_save_interval (Save Interval) int 60 20 3600 # If enabled, trains only collide with nodes with "normal" drawtype. advtrains_forgiving_collision (Forgiving Collision mode) bool false +# Enable universal couplers for wagons +# If enabled, wagons will bypass the checks that compare the coupler types when coupling. +advtrains_universal_couplers (Universal Couplers) bool false \ No newline at end of file diff --git a/mods/advtrains/advtrains/signals.lua b/mods/advtrains/advtrains/signals.lua index b26c9500..c03afbf6 100644 --- a/mods/advtrains/advtrains/signals.lua +++ b/mods/advtrains/advtrains/signals.lua @@ -60,7 +60,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", tiles = {"advtrains_retrosignal.png"}, inventory_image="advtrains_retrosignal_inv.png", drop="advtrains:retrosignal_off", - description=attrans("Lampless Signal (@1)", attrans(r..rotation)), + description=attrans("Lampless Signal"), sunlight_propagates=true, groups = { cracky=3, @@ -124,7 +124,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", tiles = {"advtrains_signal_"..r..".png"}, inventory_image="advtrains_signal_inv.png", drop="advtrains:signal_off", - description=attrans("Signal (@1)", attrans(r..rotation)), + description=attrans("Signal"), groups = { cracky=3, not_blocking_trains=1, @@ -187,6 +187,11 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", if r=="off" then crea=0 end --tunnel signals. no rotations. + local swdesc = { -- needed for xgettext + l = attrans("Wallmounted Signal (left)"), + r = attrans("Wallmounted Signal (right)"), + t = attrans("Wallmounted Signal (top)"), + } for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, { drawtype = "mesh", @@ -200,7 +205,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", mesh = "advtrains_signal_wall_"..loc..".b3d", tiles = {"advtrains_signal_wall_"..r..".png"}, drop="advtrains:signal_wall_"..loc.."_off", - description=attrans("Wallmounted Signal ("..loc..")"), + description=swdesc[loc], groups = { cracky=3, not_blocking_trains=1, @@ -314,7 +319,7 @@ minetest.register_node("advtrains:across_on", { mesh = "advtrains_across.obj", tiles = {{name="advtrains_across_anim.png", animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.0}}}, drop="advtrains:across_off", - description=attrans("Andrew's Cross (on) (you hacker you)"), + description=attrans("Andrew's Cross"), groups = { cracky=3, not_blocking_trains=1, diff --git a/mods/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg b/mods/advtrains/advtrains/sounds/advtrains_crossing_bell.ogg index 74df6692f542060ba657b92a28b76b86f6dc9075..2b441ae794d26bd13db989bbd160866760f1d13a 100644 GIT binary patch literal 24656 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 literal 47722 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

c%CA3seZ1?8DM8p`f)u%Y?r??8SsqpM1NRZH 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%0A7NzqQH_0>&Ap4hw|#D8pUwc4&l{IbWlT{h6E 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 diff --git a/mods/advtrains/advtrains/spec/poconvert_spec.lua b/mods/advtrains/advtrains/spec/poconvert_spec.lua new file mode 100644 index 00000000..51f33e7c --- /dev/null +++ b/mods/advtrains/advtrains/spec/poconvert_spec.lua @@ -0,0 +1,70 @@ +package.path = "../?.lua;" .. package.path +advtrains = {} +_G.advtrains = advtrains +local poconvert = require("poconvert") + +describe("PO file converter", function() + it("should convert PO files", function() + assert.equals([[ +# textdomain: foo +foo=bar +baz= +#@=wh\at\\@n=@=w\as\\@n +multiline@nstrings=multiline@nresult +with context?=oder doch nicht]], poconvert.from_string("foo", [[ +msgid "" +msgstr "whatever metadata" + +msgid "foo" +msgstr "bar" + +msgid "baz" +msgstr "" + +#, fuzzy +msgid "=wh\\at\\\\\n" +msgstr "=w\\as\\\\\n" + +msgid "multi" +"line\n" +"strings" +msgstr "multi" +"line\n" +"result" + +msgctxt "i18n context" +msgid "with context?" +msgstr "oder doch nicht"]])) + end) + it("should reject invalid tokens", function() + assert.has.errors(function() + poconvert.from_string("", [[ +foo "" +bar ""]]) + end, "Invalid token: foo") + end) + it("should reject entries without a msgstr", function() + assert.has.errors(function() + poconvert.from_string("", [[msgid "foo"]]) + end, "Missing translated string") + end) + it("should reject entries without a msgid", function() + assert.has.errors(function() + poconvert.from_string("", [[msgstr "foo"]]) + end, "Missing untranslated string") + end) + it("should reject entries with improperly enclosed strings", function() + assert.has.errors(function() + poconvert.from_string("", [[ +msgid "foo" +msgstr "bar \]]) + end, "String extends beyond the end of input") + end) + it("should reject incomplete input", function() + assert.has.errors(function() + poconvert.from_string("", [[ +msgid "foo" +msgstr]]) + end, "No string provided for msgstr") + end) +end) diff --git a/mods/advtrains/advtrains/spec/texture_spec.lua b/mods/advtrains/advtrains/spec/texture_spec.lua new file mode 100644 index 00000000..2e3bd5d0 --- /dev/null +++ b/mods/advtrains/advtrains/spec/texture_spec.lua @@ -0,0 +1,19 @@ +package.path = "../?.lua;" .. package.path +local T = require "texture" + +describe("Texture creation", function() + it("works", function() + assert.same("^.png", tostring(T.raw"^.png")) + assert.same("foo\\:bar.png", tostring(T"foo:bar.png")) + end) +end) + +describe("Texture modifiers", function() + it("work", function() + assert.same("x^[colorize:c", tostring(T"x":colorize"c")) + assert.same("x^[colorize:c:alpha", tostring(T"x":colorize("c", "alpha"))) + assert.same("x^[multiply:c", tostring(T"x":multiply"c")) + assert.same("x^[resize:2x3", tostring(T"x":resize(2, 3))) + assert.same("x^[transformI", tostring(T"x":transform"I")) + end) +end) diff --git a/mods/advtrains/advtrains/spec/wagons_spec.lua b/mods/advtrains/advtrains/spec/wagons_spec.lua new file mode 100644 index 00000000..df0687be --- /dev/null +++ b/mods/advtrains/advtrains/spec/wagons_spec.lua @@ -0,0 +1,40 @@ +require "mineunit" +mineunit "core" + +_G.advtrains = { + wagon_load_range = 32 +} +sourcefile "wagons" + +local myproto = {_test = true} +advtrains.register_wagon(":mywagon", myproto, "My wagon", "", false) +advtrains.register_wagon_alias(":myalias", ":mywagon") +advtrains.register_wagon_alias(":myotheralias", ":myalias") + +local myotherproto = {_other = true} +advtrains.register_wagon(":noalias", myotherproto, "Not aliased wagon", "", false) +advtrains.register_wagon_alias(":noalias", ":mywagon") + +advtrains.register_wagon_alias(":nilalias", ":nil") + +advtrains.register_wagon_alias(":R1", ":R2") +advtrains.register_wagon_alias(":R2", ":R3") +advtrains.register_wagon_alias(":R3", ":R1") + +describe("wagon alias system", function() + it("should work", function() + assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myalias")}) + assert.equal(myproto, advtrains.wagon_prototypes[":myalias"]) + assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myotheralias")}) + end) + it("should respect wagon registration", function() + assert.same({":noalias", myotherproto}, {advtrains.resolve_wagon_alias(":noalias")}) + end) + it("should handle recursive loops", function() + assert.same({}, {advtrains.resolve_wagon_alias(":R1")}) + end) + it("should return nil for missing entries", function() + assert.same({}, {advtrains.resolve_wagon_alias(":what")}) + assert.same({}, {advtrains.resolve_wagon_alias(":nilalias")}) + end) +end) diff --git a/mods/advtrains/advtrains/texture.lua b/mods/advtrains/advtrains/texture.lua new file mode 100644 index 00000000..e6d83b06 --- /dev/null +++ b/mods/advtrains/advtrains/texture.lua @@ -0,0 +1,228 @@ +local tx = {} +setmetatable(tx, {__call = function(_, ...) return tx.base(...) end}) + +function tx.escape(str) + return (string.gsub(tostring(str), [[([%^:\])]], [[\%1]])) +end + +local function getargs(...) + return select("#", ...), {...} +end + +local function curry(f, x) + return function(...) + return f(x, ...) + end +end + +local function xmkmodifier(func) + return function(self, ...) + table.insert(self, (func(...))) + return self + end +end + +local function mkmodifier(fmt, spec) + return xmkmodifier(function(...) + local count = select("#", ...) + local args = {...} + for k, f in pairs(spec) do + args[k] = f(args[k]) + end + return string.format(fmt, unpack(args, 1, count)) + end) +end + +-- Texture object +local tx_lib = {} +local tx_mt = { + __index = tx_lib, + __tostring = function(self) + return table.concat(self, "^") + end, + __concat = function(a, b) + return tx.raw(("%s^%s"):format(tostring(a), tostring(b))) + end, +} + +function tx.raw(str) + return setmetatable({str}, tx_mt) +end +function tx.base(str) + return tx.raw(tx.escape(str)) +end +-- TODO: use [fill when 5.8.0 becomes widely used client-side +function tx.fill(w, h, color) + return tx"advtrains_hud_bg.png":resize(w, h):colorize(color) +end + +-- Most texture modifiers +tx_lib.colorize = xmkmodifier(function(c, a) + local str = ("[colorize:%s"):format(tx.escape(c)) + if a then + str = str .. ":" .. a + end + return str +end) +tx_lib.multiply = mkmodifier("[multiply:%s", {tx.escape}) +tx_lib.resize = mkmodifier("[resize:%dx%d", {}) +tx_lib.transform = mkmodifier("[transform%s", {tx.escape}) + +-- [combine + +local combine = {} + +function combine:add(x, y, ent) + table.insert(self.st, ([[%d,%d=%s]]):format(x, y, tx.escape(tostring(ent)))) + return self +end + +local combine_mt = { + __index = combine, + __tostring = function(self) + return table.concat(self.st, ":") + end, +} + +function tx.combine(w, h, bg) + local base = ("[combine:%dx%d"):format(w, h) + local obj = setmetatable({width = w, height = h, st = {base}}, combine_mt) + if bg then + obj:add_fill(0, 0, w, h, bg) + end + return obj +end + +function combine:add_fill(x, y, ...) + return self:add(x, y, tx.fill(...)) +end + +local function add_multicolor_fill(n, self, x, y, w, h, ...) + local argc, argv = getargs(...) + local t = 0 + for k = 1, argc, 2 do + t = t + argv[k] + end + local newargs = {x, y, w, h} + local sk, wk = n, n+2 + local s = newargs[wk]/t + for k = 1, argc, 2 do + local v = argv[k] * s + newargs[wk] = v + newargs[5] = argv[k+1] + self:add_fill(unpack(newargs)) + newargs[sk] = newargs[sk] + v + end + return self +end +combine.add_multicolor_fill_topdown = curry(add_multicolor_fill, 2) +combine.add_multicolor_fill_leftright = curry(add_multicolor_fill, 1) + +local function add_segmentbar(n, self, x, y, w, h, m, c, ...) + local argc, argv = getargs(...) + local baseargs = {x, y, w, h} + local ss = (baseargs[n+2]+m)/c + local bs = ss - m + for k = 1, argc, 3 do + local lower, upper, fill = argv[k], argv[k+1], argv[k+2] + lower = math.max(0, math.floor(lower))+1 + upper = math.min(c, math.floor(upper)) + if lower <= upper then + local args = {x, y, w, h, fill} + args[n+2] = bs + args[n] = args[n] + ss*(lower-1) + for i = lower, upper do + self:add_fill(unpack(args)) + args[n] = args[n] + ss + end + end + end + return self +end +combine.add_segmentbar_topdown = curry(add_segmentbar, 2) +combine.add_segmentbar_leftright = curry(add_segmentbar, 1) + +local function add_lever(n, self, x, y, w, h, hs, ss, val, hf, sf) + local baseargs = {x, y, w, h} + local sargs = {x, y, w, h, sf} + sargs[5-n] = ss + sargs[n+2] = baseargs[n+2] + ss - hs + for k = 1, 2 do + sargs[k] = baseargs[k] + (baseargs[k+2] - sargs[k+2])/2 + end + self:add_fill(unpack(sargs)) + local hargs = {x, y, w, h, hf} + hargs[n+2] = hs + hargs[n] = baseargs[n] + (baseargs[n+2]-hs)*val + self:add_fill(unpack(hargs)) + return self +end +combine.add_lever_topdown = curry(add_lever, 2) +combine.add_lever_leftright = curry(add_lever, 1) + +--[[ Seven-segment display + -1- +6 2 + -7- +5 3 + -4- +--]] +local sevenseg_digits = { + ["0"] = {1, 2, 3, 4, 5, 6}, + ["1"] = {2, 3}, + ["2"] = {1, 2, 4, 5, 7}, + ["3"] = {1, 2, 3, 4, 7}, + ["4"] = {2, 3, 6, 7}, + ["5"] = {1, 3, 4, 6, 7}, + ["6"] = {1, 3, 4, 5, 6, 7}, + ["7"] = {1, 2, 3}, + ["8"] = {1, 2, 3, 4, 5, 6, 7}, + ["9"] = {1, 2, 3, 4, 6, 7}, +} + +function combine:add_str7seg(x0, y0, tw, th, str, fill) + --[[ w and h (as width/height of individual (horizontal) segments) have the following properties: + tw = n(w+3h)-h + th = 2w+3h + --]] + local len = #str + local h = (2*tw-len*th)/(3*len-2) + local w = (th-3*h)/2 + local ws = w+3*h + local segs = { + {h, 0, w, h}, + {w+h, h, h, w}, + {w+h, w+2*h, h, w}, + {h, 2*(w+h), w, h}, + {0, w+2*h, h, w}, + {0, h, h, w}, + {h, w+h, w, h}, + } + for i = 1, len do + for _, k in pairs(sevenseg_digits[string.sub(str, i, i)] or {}) do + local s = segs[k] + self:add_fill(s[1]+x0, s[2]+y0, s[3], s[4], fill) + end + x0 = x0 + ws + end + return self +end + +function combine:add_n7seg(x, y, w, h, n, prec, ...) + if not (type(n) == "number" and type(prec) == "number") then + error("passed non-numeric value or precision to numeric display") + elseif prec < 0 then + error("negative length") + end + local pfx = "" + if n >= 0 then + n = math.min(10^prec-1, n) + else + n = math.min(10^(prec-1)-1, -n) + pfx = "-" + end + local str = ("%d"):format(n) + return self:add_str7seg(x, y, w, h, pfx .. ("0"):rep(prec-#str-#pfx) .. str, ...) +end + +return tx diff --git a/mods/advtrains/advtrains/textures/advtrains_wagon_prop_tool.png b/mods/advtrains/advtrains/textures/advtrains_wagon_prop_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..6352c55763065e5f5a2ec2d03b2196f2337ca375 GIT binary patch literal 779 zcmV+m1N8ifP)EX>4Tx04R}tkv&MmKpe$iTZ>XE4rUM)$xxjvh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0scmXsb<#%plX(p zipRukZdL4lMGyi)7{QRlOg)ia%)oPe-NVP%yC~1{KKJM7Rq`eSd?N82(+!JwgLr1s z(mC%F3#=q5#OK8023?T&k?XR{Z=8z``+25dWK#3Q0i6e@tQNBOx zvch?bvs$UK);;+P!+C8b&2^f?h+_!}Bq2gZ4P{hdAxf)8iis5M$2|Oljz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^zgf-koHF$#3=0?oQ@e;?a+^8^Sy16NwxUu^)hpQP8@ zTI2}m+XgPK+nT%wTbr*4*A&`#607GSt=b4RCM> zj1?(+-Q(RooxS~grq$mMbuMzKkBiU300006VoOIv08s!@08x!1c;Ns5010qNS#tmY zE+YT{E+YYWr9XB6000McNliru<^>cAIRqap(eeNQ0SHM%K~zY`?N-YT!Y~YttIPri zHed&k(pg{%n5C6q2R7gUvmluhkh-qx{92IkrKw}tetwA^WBxLcfY#7ChZ?)KZ6RBB z&N=i0OKWX{gV`N6i=KmvU5U=tk84l2Ki}CHR&umE-B^8H*PZ{SX;{1Cb~)(Vj+O+# zAff^IB#wx^J>TZFFG;21gE$0$w~l`4IvO#}UV}y>)m-;@w!l`)uU~4PbB<399l;z^ zT`cE8h$VzvWhOb*p~!aq#kcI@$(m-O${hjkzdL{m>JOMe2t?tLG))4>z002ov JPDHLkV1jNNTnGRF literal 0 HcmV?d00001 diff --git a/mods/advtrains/advtrains/trackplacer.lua b/mods/advtrains/advtrains/trackplacer.lua index fe762909..25880887 100644 --- a/mods/advtrains/advtrains/trackplacer.lua +++ b/mods/advtrains/advtrains/trackplacer.lua @@ -275,11 +275,24 @@ function tp.register_track_placer(nnprefix, imgprefix, dispname, def) groups={advtrains_trackplacer=1, digtron_on_place=1}, liquids_pointable = def.liquids_pointable, on_place = function(itemstack, placer, pointed_thing) - local name = placer:get_player_name() - if not name then - return itemstack, false - end if pointed_thing.type=="node" then + do + local pointed_pos = pointed_thing.under + local pointed_node = minetest.get_node(pointed_pos) + local pointed_def = minetest.registered_nodes[pointed_node.name] + if pointed_def and pointed_def.on_rightclick then + local controls = placer:get_player_control() + if not controls.sneak then + return pointed_def.on_rightclick(pointed_pos, pointed_node, placer, itemstack, pointed_thing) + end + end + end + + local name = placer:get_player_name() + if not name then + return itemstack, false + end + local pos=pointed_thing.above local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0}) if not advtrains.check_track_protection(pos, name) then @@ -310,7 +323,7 @@ end minetest.register_craftitem("advtrains:trackworker",{ - description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate rail/bumper/signal/etc."), + description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate object"), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "advtrains_trackworker.png", wield_image = "advtrains_trackworker.png", @@ -337,7 +350,7 @@ minetest.register_craftitem("advtrains:trackworker",{ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") rotation = "" if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then - minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!")) + minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker.")) return end end @@ -347,7 +360,7 @@ minetest.register_craftitem("advtrains:trackworker",{ -- is a track, we can query local can_modify, reason = advtrains.can_dig_or_modify_track(pos) if not can_modify then - local str = attrans("This track can not be rotated!") + local str = attrans("This track can not be rotated.") if reason then str = str .. " " .. reason end @@ -374,7 +387,7 @@ minetest.register_craftitem("advtrains:trackworker",{ if v==rotation then modpos=k end end if not modpos then - minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!")) + minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker.")) return end advtrains.ndb.swap_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2}) @@ -401,7 +414,7 @@ minetest.register_craftitem("advtrains:trackworker",{ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") rotation = "" if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then - minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker!")) + minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker.")) return end end @@ -411,7 +424,7 @@ minetest.register_craftitem("advtrains:trackworker",{ -- is a track, we can query local can_modify, reason = advtrains.can_dig_or_modify_track(pos) if not can_modify then - local str = attrans("This track can not be changed!") + local str = attrans("This track can not be changed.") if reason then str = str .. " " .. reason end diff --git a/mods/advtrains/advtrains/tracks.lua b/mods/advtrains/advtrains/tracks.lua index 261818e3..ee824260 100644 --- a/mods/advtrains/advtrains/tracks.lua +++ b/mods/advtrains/advtrains/tracks.lua @@ -446,7 +446,7 @@ Depending on the number of connections: local function can_dig_callback(pos, player) local ok, reason = advtrains.can_dig_or_modify_track(pos) if not ok and player then - minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed!") .. " " .. reason) + minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed.") .. " " .. reason) end return ok end @@ -468,10 +468,11 @@ function advtrains.register_tracks(tracktype, def, preset) drawtype = "mesh", paramtype="light", paramtype2="facedir", + use_texture_alpha = "blend", walkable = false, selection_box = { type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2}, }, mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix), @@ -645,17 +646,17 @@ end function sl.create_slopeplacer_on_place(def, preset) return function(istack, player, pt) if not pt.type=="node" then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: not pointing at node.")) return istack end local pos=pt.above if not pos then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: not pointing at node.")) return istack end local node=minetest.get_node(pos) if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: space occupied.")) return istack end if not advtrains.check_track_protection(pos, player:get_player_name()) then @@ -708,17 +709,17 @@ function sl.create_slopeplacer_on_place(def, preset) pos=vector.subtract(pos, dirvec) end else - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step)) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: Not enough slope items left (@1 required).", step)) end else - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step)) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: There's no slope of length @1.",step)) end return istack end step=step+1 pos=vector.add(pos, dirvec) end - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end.")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: no supporting node at upper end.")) return itemstack end end diff --git a/mods/advtrains/advtrains/trainhud.lua b/mods/advtrains/advtrains/trainhud.lua index 22aa6cf5..ce4b9136 100644 --- a/mods/advtrains/advtrains/trainhud.lua +++ b/mods/advtrains/advtrains/trainhud.lua @@ -1,5 +1,7 @@ --trainhud.lua: holds all the code for train controlling +local T = advtrains.texture + advtrains.hud = {} advtrains.hhud = {} @@ -8,6 +10,8 @@ advtrains.hud[player:get_player_name()] = nil advtrains.hhud[player:get_player_name()] = nil end) +local hud_type_key = minetest.features.hud_def_type_field and "type" or "hud_elem_type" + local mletter={[1]="F", [-1]="R", [0]="N"} function advtrains.on_control_change(pc, train, flip) @@ -101,19 +105,21 @@ function advtrains.set_trainhud(name, text, driver) if not player then return end + local drivertext = driver or "" local driverhud = { - hud_elem_type = "image", + [hud_type_key] = "image", name = "ADVTRAINS_DRIVER", position = {x=0.5, y=1}, offset = {x=0,y=-170}, - text = driver or "", + text = drivertext, alignment = {x=0,y=-1}, - scale = {x=1,y=1},} + scale = {x=1,y=1}, + } if not hud then - hud = {["driver"]={}} + hud = {} advtrains.hud[name] = hud hud.id = player:hud_add({ - hud_elem_type = "text", + [hud_type_key] = "text", name = "ADVTRAINS", number = 0xFFFFFF, position = {x=0.5, y=1}, @@ -122,17 +128,22 @@ function advtrains.set_trainhud(name, text, driver) scale = {x=200, y=60}, alignment = {x=0, y=-1}, }) - hud.oldText=text hud.driver = player:hud_add(driverhud) + hud.oldText = text + hud.oldDriver = drivertext else if hud.oldText ~= text then player:hud_change(hud.id, "text", text) hud.oldText=text end if hud.driver then - player:hud_change(hud.driver, "text", driver or "") + if hud.oldDriver ~= drivertext then + player:hud_change(hud.driver, "text", drivertext) + hud.oldDriver = drivertext + end elseif driver then hud.driver = player:hud_add(driverhud) + hud.oldDriver = drivertext end end end @@ -147,7 +158,7 @@ function advtrains.set_help_hud(name, text) hud = {} advtrains.hhud[name] = hud hud.id = player:hud_add({ - hud_elem_type = "text", + [hud_type_key] = "text", name = "ADVTRAINS_HELP", number = 0xFFFFFF, position = {x=1, y=0.3}, @@ -184,138 +195,94 @@ function advtrains.hud_train_format(train, flip) local vel = advtrains.abs_ceil(train.velocity) local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity)) - local tlev=train.lever or 1 + local tlev=train.lever or 3 if train.velocity==0 and not train.active_control then tlev=1 end if train.hud_lzb_effect_tmr then tlev=1 end - local ht = {"[combine:440x110:0,0=(advtrains_hud_bg.png^[resize\\:440x110)"} + local hud = T.combine(440, 110, "black") local st = {} if train.debug then st = {train.debug} end - -- seven-segment display - local function sevenseg(digit, x, y, w, h, m) - --[[ - -1- - 2 3 - -4- - 5 6 - -7- - ]] - local segs = { - {h, 0, w, h}, - {0, h, h, w}, - {w+h, h, h, w}, - {h, w+h, w, h}, - {0, w+2*h, h, w}, - {w+h, w+2*h, h, w}, - {h, 2*(w+h), w, h}} - local trans = { - [0] = {true, true, true, false, true, true, true}, - [1] = {false, false, true, false, false, true, false}, - [2] = {true, false, true, true, true, false, true}, - [3] = {true, false, true, true, false, true, true}, - [4] = {false, true, true, true, false, true, false}, - [5] = {true, true, false, true, false, true, true}, - [6] = {true, true, false, true, true, true, true}, - [7] = {true, false, true, false, false, true, false}, - [8] = {true, true, true, true, true, true, true}, - [9] = {true, true, true, true, false, true, true}} - local ent = trans[digit or 10] - if not ent then return end - for i = 1, 7, 1 do - if ent[i] then - local s = segs[i] - ht[#ht+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^%s)",x+s[1], y+s[2], s[3], s[4], m) - end - end - end - -- lever - ht[#ht+1] = "275,10=(advtrains_hud_bg.png^[colorize\\:cyan^[resize\\:5x18)" - ht[#ht+1] = "275,28=(advtrains_hud_bg.png^[colorize\\:white^[resize\\:5x18)" - ht[#ht+1] = "275,46=(advtrains_hud_bg.png^[colorize\\:orange^[resize\\:5x36)" - ht[#ht+1] = "275,82=(advtrains_hud_bg.png^[colorize\\:red^[resize\\:5x18)" - ht[#ht+1] = "292,16=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:6x78)" - ht[#ht+1] = sformat("280,%s=(advtrains_hud_bg.png^[colorize\\:gray^[resize\\:30x18)",18*(4-tlev)+10) + hud:add_multicolor_fill_topdown(275, 10, 5, 90, 1, "cyan", 1, "white", 2, "orange", 1, "red") + hud:add_lever_topdown(280, 10, 30, 90, 18, 6, (4-tlev)/4, "gray", "darkslategray") -- reverser - ht[#ht+1] = sformat("245,10=(advtrains_hud_arrow.png^[transformFY%s)", flip and "" or "^[multiply\\:cyan") - ht[#ht+1] = sformat("245,85=(advtrains_hud_arrow.png%s)", flip and "^[multiply\\:orange" or "") - ht[#ht+1] = "250,35=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:5x40)" - ht[#ht+1] = sformat("240,%s=(advtrains_hud_bg.png^[resize\\:25x15^[colorize\\:gray)", flip and 65 or 30) + hud:add(245, 10, T"advtrains_hud_arrow.png":transform"FY":multiply(flip and "gray" or "cyan")) + hud:add(245, 85, T"advtrains_hud_arrow.png":multiply(flip and "orange" or "gray")) + hud:add_lever_topdown(240, 30, 25, 50, 15, 5, flip and 1 or 0, "gray", "darkslategray") -- train control/safety indication - if train.tarvelocity or train.atc_command then - ht[#ht+1] = "10,10=(advtrains_hud_atc.png^[resize\\:30x30^[multiply\\:cyan)" - end - if train.hud_lzb_effect_tmr then - ht[#ht+1] = "50,10=(advtrains_hud_lzb.png^[resize\\:30x30^[multiply\\:red)" - end - if train.is_shunt then - ht[#ht+1] = "90,10=(advtrains_hud_shunt.png^[resize\\:30x30^[multiply\\:orange)" - end + hud:add(10, 10, T"advtrains_hud_atc.png":resize(30, 30):multiply((train.tarvelocity or train.atc_command) and "cyan" or "darkslategray")) + hud:add(50, 10, T"advtrains_hud_lzb.png":resize(30, 30):multiply(train.hud_lzb_effect_tmr and "red" or "darkslategray")) + hud:add(90, 10, T"advtrains_hud_shunt.png":resize(30, 30):multiply(train.is_shunt and "orange" or "darkslategray")) -- door - ht[#ht+1] = "187,10=(advtrains_hud_bg.png^[resize\\:26x30^[colorize\\:white)" - ht[#ht+1] = "189,12=(advtrains_hud_bg.png^[resize\\:22x11)" - ht[#ht+1] = sformat("170,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==-1 and "white" or "darkslategray") - ht[#ht+1] = "172,12=(advtrains_hud_bg.png^[resize\\:11x11)" - ht[#ht+1] = sformat("215,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==1 and "white" or "darkslategray") - ht[#ht+1] = "217,12=(advtrains_hud_bg.png^[resize\\:11x11)" + hud:add_fill(187, 10, 26, 30, "white"):add_fill(189, 12, 22, 11, "black") + hud:add_fill(170, 10, 15, 30, train.door_open==-1 and "white" or "darkslategray"):add_fill(172, 12, 11, 11, "black") + hud:add_fill(215, 10, 15, 30, train.door_open==1 and "white" or "darkslategray"):add_fill(217, 12, 11, 11, "black") -- speed indication(s) - sevenseg(math.floor(vel/10), 320, 10, 30, 10, "[colorize\\:red\\:255") - sevenseg(vel%10, 380, 10, 30, 10, "[colorize\\:red\\:255") - for i = 1, vel, 1 do - ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:white)", i*11-1) - end - for i = max+1, 20, 1 do - ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:darkslategray)", i*11-1) - end + hud:add_n7seg(320, 10, 110, 90, vel, 2, "red") + hud:add_segmentbar_leftright(10, 65, 217, 20, 3, 20, max, 20, "darkslategray", 0, vel, "white") if res and res > 0 then - ht[#ht+1] = sformat("%d,60=(advtrains_hud_bg.png^[resize\\:3x30^[colorize\\:red\\:255)", 7+res*11) + hud:add_fill(7+res*11, 60, 3, 30, "red") end if train.tarvelocity then - ht[#ht+1] = sformat("%d,85=(advtrains_hud_arrow.png^[multiply\\:cyan^[transformFY^[makealpha\\:#000000)", 1+train.tarvelocity*11) + hud:add(1+train.tarvelocity*11, 85, T"advtrains_hud_arrow.png":transform"FY":multiply"cyan") end + local lzbdisp local lzb = train.lzb if lzb and lzb.checkpoints then local oc = lzb.checkpoints for i = 1, #oc do + if advtrains.interlocking then + local udata = oc[i].udata + if udata and udata.signal_pos then + local sigd = advtrains.interlocking.db.get_sigd_for_signal(udata.signal_pos) + if sigd then + local tcbs = advtrains.interlocking.db.get_tcbs(sigd) or {} + if tcbs.route_rsn then + table.insert(st, ("%s: %s"):format(minetest.pos_to_string(sigd.p), tcbs.route_rsn)) + end + end + end + end local spd = oc[i].speed spd = advtrains.speed.min(spd, train.speed_restriction) if spd == -1 then spd = nil end local c = not spd and "lime" or (type(spd) == "number" and (spd == 0) and "red" or "orange") or nil if c then - ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) - ht[#ht+1] = sformat("130,35=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) if spd and spd~=0 then - ht[#ht+1] = sformat("%d,50=(advtrains_hud_arrow.png^[multiply\\:red^[makealpha\\:#000000)", 1+spd*11) + hud:add(1+spd*11, 50, T"advtrains_hud_arrow.png":multiply"red") end - local floor = math.floor - local dist = floor(((oc[i].index or train.index)-train.index)) + local dist = math.floor(((oc[i].index or train.index)-train.index)) dist = math.max(0, math.min(999, dist)) - for j = 1, 3, 1 do - sevenseg(floor((dist/10^(3-j))%10), 119+j*11, 18, 4, 2, "[colorize\\:"..c) - end + lzbdisp = {c = c, d = dist} break end end end + if not lzbdisp then + lzbdisp = {c = "darkslategray", d = 888} + end + hud:add_fill(130, 10, 30, 5, lzbdisp.c) + hud:add_fill(130, 35, 30, 5, lzbdisp.c) + hud:add_n7seg(131, 18, 28, 14, lzbdisp.d, 3, lzbdisp.c) if res and res == 0 then - st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.") + table.insert(st, attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.")) end if train.atc_command then - st[#st+1] = sformat("ATC: %s%s", train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "") + table.insert(st, ("ATC: %s%s"):format(train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "")) end - return table.concat(st,"\n"), table.concat(ht,":") + return table.concat(st,"\n"), tostring(hud) end local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud max_speed = 15, speed_restriction = 15, velocity = 15, tarvelocity = 12, active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true, - door_open = 1, lzb = {oncoming = {{spd=6, idx=125.7}}}, index = 0, + door_open = 1, lzb = {checkpoints = {{speed=6, index=125.7}}}, index = 100, } minetest.register_node("advtrains:hud_demo",{ diff --git a/mods/advtrains/advtrains/trainlogic.lua b/mods/advtrains/advtrains/trainlogic.lua index 35c37263..ed49a4c0 100644 --- a/mods/advtrains/advtrains/trainlogic.lua +++ b/mods/advtrains/advtrains/trainlogic.lua @@ -142,10 +142,8 @@ minetest.register_on_joinplayer(function(player) local pname = player:get_player_name() local id=advtrains.player_to_train_mapping[pname] if id then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.train_id==id then - wagon:reattach_all() - end + for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do + wagon:reattach_all() end end end) @@ -157,12 +155,10 @@ minetest.register_on_dieplayer(function(player) if id then local train=advtrains.trains[id] if not train then advtrains.player_to_train_mapping[pname]=nil return end - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.train_id==id then - --when player dies, detach him from the train - --call get_off_plr on every wagon since we don't know which one he's on. - wagon:get_off_plr(pname) - end + for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do + --when player dies, detach him from the train + --call get_off_plr on every wagon since we don't know which one he's on. + wagon:get_off_plr(pname) end -- just in case no wagon felt responsible for this player: clear train mapping advtrains.player_to_train_mapping[pname] = nil @@ -267,6 +263,10 @@ function advtrains.train_ensure_init(id, train) atwarn(debug.traceback()) return nil end + + if not train.staticdata then + train.staticdata = {} + end train.dirty = true if train.no_step then @@ -616,7 +616,7 @@ function advtrains.train_step_b(id, train, dtime) local base_cn = train.path_cn[base_idx] --atdebug(id,"Begin Checking for on-track collisions new_idx=",new_index_curr_tv,"base_idx=",base_idx,"base_pos=",base_pos,"base_cn=",base_cn) -- query occupation - local occ = advtrains.occ.get_trains_over(base_pos) + local occ = advtrains.occ.reverse_lookup_sel(base_pos, "close_proximity") -- iterate other trains for otid, ob_idx in pairs(occ) do if otid ~= id then @@ -646,7 +646,7 @@ function advtrains.train_step_b(id, train, dtime) -- Phase 2 - project ref_index back onto our path and check again (necessary because there might be a turnout on the way and we are driving into the flank if target_is_inside then - local our_index = advtrains.path_project(otrn, ref_index, id) + local our_index = advtrains.path_project(otrn, ref_index, id, "before_end") --atdebug("Backprojected our_index",our_index) if our_index and our_index <= new_index_curr_tv and our_index >= train.index then --FIX: If train was already past the collision point in the previous step, there is no collision! Fixes bug with split_at_index @@ -800,9 +800,12 @@ function advtrains.train_step_c(id, train, dtime) if is_loaded_area then local objs = minetest.get_objects_inside_radius(rcollpos, 2) for _,obj in ipairs(objs) do - if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0 - and obj:get_luaentity() and obj:get_luaentity().name~="signs_lib:text" then - obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil) + if not obj:is_player() then + local armor = obj:get_armor_groups() + local luaentity = obj:get_luaentity() + if armor.fleshy and armor.fleshy > 0 and luaentity and luaentity.name ~= "signs_lib:text" then + obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil) + end end end end @@ -1050,7 +1053,16 @@ function advtrains.update_trainpart_properties(train_id, invert_flipstate) if data then local wagon = advtrains.wagon_prototypes[data.type or data.entity_name] if not wagon then - atwarn("Wagon '",data.type,"' couldn't be found. Please check that all required modules are loaded!") + local ent = advtrains.wagon_objects[w_id] + local pdesc + if ent then + pdesc = "at " .. minetest.pos_to_string(ent:get_pos()) + elseif train.last_pos then + pdesc = "near " .. minetest.pos_to_string(train.last_pos) + else + pdesc = "at an unknown location" + end + atwarn(string.format("Wagon %q %s could not be found. Please check that all required modules are loaded!", data.type, pdesc)) wagon = advtrains.wagon_prototypes["advtrains:wagon_placeholder"] end @@ -1105,8 +1117,17 @@ function advtrains.spawn_wagons(train_id) if advtrains.position_in_range(pos, ablkrng) then --atdebug("wagon",w_id,"spawning") local wt = advtrains.get_wagon_prototype(data) - local wagon = minetest.add_entity(pos, wt):get_luaentity() - wagon:set_id(w_id) + local wobj = minetest.add_entity(pos, wt) + if not wobj then + atwarn("Failed to spawn wagon", w_id, "of type", wt) + else + local wagon = wobj:get_luaentity() + if not wagon then + atwarn("Wagon", w_id, "of type", wt, "spawned with nil luaentity") + else + wagon:set_id(w_id) + end + end end end else @@ -1173,6 +1194,8 @@ function advtrains.split_train_at_index(train, index) newtrain.points_split = advtrains.merge_tables(train.points_split) newtrain.autocouple = train.autocouple + advtrains.te_run_callbacks_on_decouple(train, newtrain, index) + return newtrain_id -- return new train ID, so new train can be manipulated end @@ -1206,7 +1229,6 @@ function advtrains.invert_train(train_id) advtrains.update_trainpart_properties(train_id, true) -- recalculate path - advtrains.train_ensure_init(train_id, train) -- If interlocking present, check whether this train is in a section and then set as shunt move after reversion if advtrains.interlocking and train.il_sections and #train.il_sections > 0 then @@ -1232,7 +1254,7 @@ function advtrains.invalidate_all_paths(pos) local tab if pos then -- if position given, check occupation system - tab = advtrains.occ.get_trains_over(pos) + tab = advtrains.occ.reverse_lookup_quick(pos) else tab = advtrains.trains end @@ -1245,7 +1267,7 @@ end -- Calls invalidate_path_ahead on all trains occupying (having paths over) this node -- Can be called during train step. function advtrains.invalidate_all_paths_ahead(pos) - local tab = advtrains.occ.get_trains_over(pos) + local tab = advtrains.occ.reverse_lookup_sel(pos, "first_ahead") for id,index in pairs(tab) do local train = advtrains.trains[id] diff --git a/mods/advtrains/advtrains/wagonprop_tool.lua b/mods/advtrains/advtrains/wagonprop_tool.lua new file mode 100644 index 00000000..2a4a9e21 --- /dev/null +++ b/mods/advtrains/advtrains/wagonprop_tool.lua @@ -0,0 +1,43 @@ +minetest.register_craftitem("advtrains:wagon_prop_tool",{ --craftitem because it does nothing on its own + description = attrans("Wagon Properties Tool\nPunch a wagon to view and edit the Wagon Properties"), + short_description = attrans("Wagon Properties Tool"), + groups = {}, + inventory_image = "advtrains_wagon_prop_tool.png", + wield_image = "advtrains_wagon_prop_tool.png", + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + local pname = user:get_player_name() + if not pname or pname == "" then + return + end + + --sanity checks in case of clicking the wrong entity/node/nothing + if pointed_thing.type ~= "object" then return end --not an entity + local object = pointed_thing.ref:get_luaentity() + if not object.id then return end --entity doesn't have an id field + + local wagon = advtrains.wagons[object.id] --check if wagon exists in advtrains + if not wagon then --not a wagon + return + end --end sanity checks + + --whitelist protection check + if not advtrains.check_driving_couple_protection(pname,wagon.owner,wagon.whitelist) then + minetest.chat_send_player(pname, attrans("Insufficient privileges to use this!")) + return + end + object:show_wagon_properties(pname) + return itemstack + end, +}) + +if minetest.get_modpath("default") then --register recipe + minetest.register_craft({ + output = "advtrains:wagon_prop_tool", + recipe = { + {"advtrains:dtrack_placer","dye:black","default:paper"}, + {"screwdriver:screwdriver","default:paper","default:paper"}, + {"","","group:wood"}, + } + }) +end \ No newline at end of file diff --git a/mods/advtrains/advtrains/wagons.lua b/mods/advtrains/advtrains/wagons.lua index 94eda30e..cf158712 100644 --- a/mods/advtrains/advtrains/wagons.lua +++ b/mods/advtrains/advtrains/wagons.lua @@ -13,7 +13,13 @@ local GETOFF_TP_DELAY = 0.5 local IGNORE_WORLD = advtrains.IGNORE_WORLD advtrains.wagons = {} -advtrains.wagon_prototypes = {} +advtrains.wagon_alias = {} +advtrains.wagon_prototypes = setmetatable({}, { + __index = function(t, k) + local _, proto = advtrains.resolve_wagon_alias(k) + return proto + end +}) advtrains.wagon_objects = {} local unload_wgn_range = advtrains.wagon_load_range + 32 @@ -200,7 +206,7 @@ function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direct end for listname, _ in pairs(inv:get_lists()) do if not inv:is_empty(listname) then - minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty!")); + minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty.")); return end end @@ -280,7 +286,7 @@ function wagon:on_step(dtime) local data = advtrains.wagons[self.id] if not pos then - --atdebug("["..self.id.."][fatal] missing position (object:getpos() returned nil)") + --atdebug("["..self.id.."][fatal] missing position (object:get_pos() returned nil)") return end @@ -364,6 +370,15 @@ function wagon:on_step(dtime) outside = outside .."\n!!! Train off track !!!" end + -- liquid container: display liquid contents in infotext + if self.techage_liquid_capacity then + if data.techage_liquid and data.techage_liquid.name then + outside = outside .."\nLiquid: "..data.techage_liquid.name..", "..data.techage_liquid.amount.." units" + else + outside = outside .."\nLiquid: empty" + end + end + if self.infotext_cache~=outside then self.object:set_properties({infotext=outside}) self.infotext_cache=outside @@ -413,13 +428,38 @@ function wagon:on_step(dtime) end -- Calculate new position, yaw and direction vector + -- note: "index" is needed to be the center index, required by door code local index = advtrains.path_get_index_by_offset(train, train.index, -data.pos_in_train) - local pos, yaw, npos, npos2 = advtrains.path_get_interpolated(train, index) - local vdir = vector.normalize(vector.subtract(npos2, npos)) + local pos, yaw, npos, npos2, vdir + + -- use new position logic? + if self.wheel_positions then + -- request two positions, calculate difference and yaw from this + -- depending on flipstate, need to invert wheel pos indices -> wheelpos * fct + local index1 = advtrains.path_get_index_by_offset(train, index, self.wheel_positions[1] * fct) + local index2 = advtrains.path_get_index_by_offset(train, index, self.wheel_positions[2] * fct) + local pos1 = advtrains.path_get_interpolated(train, index1) + local pos2 = advtrains.path_get_interpolated(train, index2) + npos = advtrains.path_get(train, atfloor(index)) -- need npos just for node loaded check + -- calculate center of 2 positions and vdir vector + -- if wheel positions are asymmetric, needs to weight by the difference! + local fact = self.wheel_positions[1] / (self.wheel_positions[1]-self.wheel_positions[2]) + pos = {x=pos1.x-(pos1.x-pos2.x)*fact, y=pos1.y-(pos1.y-pos2.y)*fact, z=pos1.z-(pos1.z-pos2.z)*fact} + if data.wagon_flipped then + vdir = vector.normalize(vector.subtract(pos2, pos1)) + else + vdir = vector.normalize(vector.subtract(pos1, pos2)) + end + yaw = math.atan2(-vdir.x, vdir.z) + else + --old position logic (for small wagons): use center index and just get position + pos, yaw, npos, npos2 = advtrains.path_get_interpolated(train, index) + vdir = vector.normalize(vector.subtract(npos2, npos)) + end --automatic get_on --needs to know index and path - if self.door_entry and train.door_open and train.door_open~=0 and train.velocity==0 then + if train.velocity==0 and self.door_entry and train.door_open and train.door_open~=0 then --using the mapping created by the trainlogic globalstep for i, ino in ipairs(self.door_entry) do --fct is the flipstate flag from door animation above @@ -470,28 +510,32 @@ function wagon:on_step(dtime) end end - --DisCouple + -- Spawn discouple object when train stands, in all other cases remove it. -- FIX: Need to do this after the yaw calculation - if is_in_loaded_area and data.pos_in_trainparts and data.pos_in_trainparts>1 then - if train.velocity==0 then - if not self.discouple or not self.discouple.object:get_yaw() then - atprint(self.id,"trying to spawn discouple") - local dcpl_pos = vector.add(pos, {y=0, x=-math.sin(yaw)*self.wagon_span, z=math.cos(yaw)*self.wagon_span}) - local object=minetest.add_entity(dcpl_pos, "advtrains:discouple") - if object then - local le=object:get_luaentity() - le.wagon=self - --box is hidden when attached, so unuseful. - --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) - self.discouple=le - end - end - else - if self.discouple and self.discouple.object:get_yaw() then - self.discouple.object:remove() - atprint(self.id," removing discouple") + if train.velocity==0 and is_in_loaded_area and data.pos_in_trainparts and data.pos_in_trainparts>1 then + if not self.discouple or not self.discouple.object:get_yaw() then + atprint(self.id,"trying to spawn discouple") + local dcpl_pos = vector.add(pos, {y=0, x=-math.sin(yaw)*self.wagon_span, z=math.cos(yaw)*self.wagon_span}) + local object=minetest.add_entity(dcpl_pos, "advtrains:discouple") + if object then + local le=object:get_luaentity() + le.wagon=self + --box is hidden when attached, so unuseful. + --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) + self.discouple=le end end + else + if self.discouple and self.discouple.object:get_yaw() then + self.discouple.object:remove() + atprint(self.id," removing discouple") + end + end + + -- object yaw (corrected by flipstate) + local oyaw = yaw + if data.wagon_flipped then + oyaw = yaw + math.pi end --FIX: use index of the wagon, not of the train. @@ -500,10 +544,6 @@ function wagon:on_step(dtime) local velocityvec = vector.multiply(vdir, velocity) local accelerationvec = vector.multiply(vdir, acceleration) - if data.wagon_flipped then - yaw=yaw+math.pi - end - -- this timer runs off every 2 seconds. self.updatepct_timer=(self.updatepct_timer or 0)-dtime local updatepct_timer_elapsed = self.updatepct_timer<=0 @@ -540,19 +580,19 @@ function wagon:on_step(dtime) or not vector.equals(velocityvec, self.old_velocity_vector) or not self.old_acceleration_vector or not vector.equals(accelerationvec, self.old_acceleration_vector) - or self.old_yaw~=yaw + or self.old_yaw~=oyaw or updatepct_timer_elapsed then--only send update packet if something changed self.object:set_pos(pos) self.object:set_velocity(velocityvec) self.object:set_acceleration(accelerationvec) - if #self.seats > 0 and self.old_yaw ~= yaw then + if #self.seats > 0 and self.old_yaw ~= oyaw then if not self.player_yaw then self.player_yaw = {} end if not self.old_yaw then - self.old_yaw=yaw + self.old_yaw=oyaw end for _,name in pairs(data.seatp) do local p = minetest.get_player_by_name(name) @@ -562,11 +602,11 @@ function wagon:on_step(dtime) self.player_yaw[name] = p:get_look_horizontal()-self.old_yaw end -- set player looking direction using calculated offset - p:set_look_horizontal((self.player_yaw[name] or 0)+yaw) + p:set_look_horizontal((self.player_yaw[name] or 0)+oyaw) end end self.turning = true - elseif self.old_yaw == yaw then + elseif self.old_yaw == oyaw then -- train is no longer turning self.turning = false end @@ -576,9 +616,9 @@ function wagon:on_step(dtime) if data.wagon_flipped then pitch = -pitch end - self.object:set_rotation({x=pitch, y=yaw, z=0}) + self.object:set_rotation({x=pitch, y=oyaw, z=0}) else - self.object:set_yaw(yaw) + self.object:set_yaw(oyaw) end if self.update_animation then @@ -597,7 +637,7 @@ function wagon:on_step(dtime) self.old_velocity_vector=velocityvec self.old_velocity = train.velocity self.old_acceleration_vector=accelerationvec - self.old_yaw=yaw + self.old_yaw=oyaw atprintbm("wagon step", t) end @@ -664,7 +704,7 @@ function wagon:on_rightclick(clicker) end local doors_open = self:train().door_open~=0 or clicker:get_player_control().sneak - local allow, rsn=false, "Wagon has no seats!" + local allow, rsn=false, attrans("This wagon has no seats.") for _,sgr in ipairs(self.assign_to_seat_group) do allow, rsn = self:check_seat_group_access(pname, sgr) if allow then @@ -675,16 +715,16 @@ function wagon:on_rightclick(clicker) self:get_on(clicker, seatid) return else - rsn="Wagon is full." + rsn=attrans("This wagon is full.") end else - rsn="Doors are closed! (try holding sneak key!)" + rsn=attrans("Doors are closed! (Try holding sneak key!)") end end end end end - minetest.chat_send_player(pname, attrans("Can't get on: "..rsn)) + minetest.chat_send_player(pname, rsn or attrans("You can't get on this wagon.")) else self:show_get_on_form(pname) end @@ -780,8 +820,8 @@ function wagon:get_off(seatno) end --if not door_entry, or paths missing, fall back to old method --atdebug("using fallback") - local objpos=advtrains.round_vector_floor_y(self.object:getpos()) - local yaw=self.object:getyaw() + local objpos=advtrains.round_vector_floor_y(self.object:get_pos()) + local yaw=self.object:get_yaw() local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4) local offp --abuse helper function @@ -834,6 +874,7 @@ function wagon:show_wagon_properties(pname) ]] local data = advtrains.wagons[self.id] local form="size[5,5]" + form=form.."label[0.2,0;"..attrans("This Wagon ID")..": "..self.id.."]" form = form .. "field[0.5,1;4.5,1;whitelist;Allow these players to access your wagon:;"..minetest.formspec_escape(data.whitelist or "").."]" form = form .. "field[0.5,2;4.5,1;roadnumber;Wagon road number:;"..minetest.formspec_escape(data.roadnumber or "").."]" local fc = "" @@ -858,7 +899,7 @@ end --BordCom local function checkcouple(ent) - if not ent or not ent:getyaw() then + if not ent or not ent:get_yaw() then return nil end local le = ent:get_luaentity() @@ -937,6 +978,7 @@ function wagon:show_bordcom(pname) local linhei local form = "size[11,9]label[0.5,0;AdvTrains Boardcom v0.1]" + form=form.."textarea[7.5,0.05;10,1;;"..attrans("Train ID")..": "..(minetest.formspec_escape(train.id or ""))..";]" form=form.."textarea[0.5,1.5;7,1;text_outside;"..attrans("Text displayed outside on train")..";"..(minetest.formspec_escape(train.text_outside or "")).."]" form=form.."textarea[0.5,3;7,1;text_inside;"..attrans("Text displayed inside train")..";"..(minetest.formspec_escape(train.text_inside or "")).."]" form=form.."field[7.5,1.75;3,1;line;"..attrans("Line")..";"..(minetest.formspec_escape(train.line or "")).."]" @@ -1054,12 +1096,11 @@ function wagon:handle_bordcom_fields(pname, formname, fields) for i, tpid in ipairs(train.trainparts) do if fields["dcpl_"..i] then advtrains.safe_decouple_wagon(tpid, pname) - elseif fields["wgprp"..i] then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==tpid and data.owner==pname then - wagon:show_wagon_properties(pname) - return - end + elseif fields["wgprp"..i] and data.owner==pname then + local wagon = advtrains.get_wagon_entity(tpid) + if wagon then + wagon:show_wagon_properties(pname) + return end end end @@ -1105,44 +1146,48 @@ end minetest.register_on_player_receive_fields(function(player, formname, fields) local uid=string.match(formname, "^advtrains_geton_(.+)$") if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid then - local data = advtrains.wagons[wagon.id] - if fields.inv then - if wagon.has_inventory and wagon.get_inventory_formspec then - minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid))) - end - elseif fields.seat then - local val=minetest.explode_textlist_event(fields.seat) - if val and val.type~="INV" and not data.seatp[player:get_player_name()] then - --get on - wagon:get_on(player, val.index) - --will work with the new close_formspec functionality. close exactly this formspec. - minetest.show_formspec(player:get_player_name(), formname, "") - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + local data = advtrains.wagons[wagon.id] + if fields.inv then + if wagon.has_inventory and wagon.get_inventory_formspec then + minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid))) + end + elseif fields.seat then + local val=minetest.explode_textlist_event(fields.seat) + if val and val.type~="INV" and not data.seatp[player:get_player_name()] then + --get on + wagon:get_on(player, val.index) + --will work with the new close_formspec functionality. close exactly this formspec. + minetest.show_formspec(player:get_player_name(), formname, "") end end end + return true end + uid=string.match(formname, "^advtrains_seating_(.+)$") if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid then - local pname=player:get_player_name() - local no=wagon:get_seatno(pname) - if no then - if wagon.seat_groups then - wagon:seating_from_key_helper(pname, fields, no) - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + local pname=player:get_player_name() + local no=wagon:get_seatno(pname) + if no then + if wagon.seat_groups then + wagon:seating_from_key_helper(pname, fields, no) end end end + return true end + uid=string.match(formname, "^advtrains_prop_(.+)$") if uid then local pname=player:get_player_name() local data = advtrains.wagons[uid] - if pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then + if not data then + return true + elseif pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then return true end if fields.save or not fields.quit then @@ -1164,29 +1209,32 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) wagon.show_wagon_properties({id=uid}, pname) end end + return true end uid=string.match(formname, "^advtrains_bordcom_(.+)$") if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid then - wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) end + return true end + uid=string.match(formname, "^advtrains_inv_(.+)$") if uid then local pname=player:get_player_name() local data = advtrains.wagons[uid] if fields.prop and data.owner==pname then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.id==uid and data.owner==pname then - wagon:show_wagon_properties(pname) - --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) - end + local wagon = advtrains.get_wagon_entity(uid) + if wagon then + wagon:show_wagon_properties(pname) + --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) end end + return true end end) + function wagon:seating_from_key_helper(pname, fields, no) local data = advtrains.wagons[self.id] local sgr=self.seats[no].group @@ -1213,7 +1261,7 @@ function wagon:seating_from_key_helper(pname, fields, no) self:show_bordcom(pname) end if fields.dcwarn then - minetest.chat_send_player(pname, attrans("Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!")) + minetest.chat_send_player(pname, attrans("Doors are closed. Use Sneak+rightclick to ignore the closed doors and get off.")) end if fields.off then self:get_off(no) @@ -1222,10 +1270,10 @@ end function wagon:check_seat_group_access(pname, sgr) local data = advtrains.wagons[self.id] if self.seat_groups[sgr].driving_ctrl_access and not (advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)) then - return false, "Not allowed to access a driver stand!" + return false, attrans("You are not allowed to access the driver stand.") end if self.seat_groups[sgr].driving_ctrl_access then - advtrains.log("Drive", pname, self.object:getpos(), self:train().text_outside) + advtrains.log("Drive", pname, self.object:get_pos(), self:train().text_outside) end return true end @@ -1283,11 +1331,33 @@ function advtrains.get_wagon_prototype(data) data.type = data.entity_name data.entity_name = nil end - if not wt or not advtrains.wagon_prototypes[wt] then + local rt, proto = advtrains.resolve_wagon_alias(wt) + if not rt then atwarn("Unable to load wagon type",wt,", using placeholder") - wt="advtrains:wagon_placeholder" + rt = "advtrains:wagon_placeholder" + proto = advtrains.wagon_prototypes[rt] end - return wt, advtrains.wagon_prototypes[wt] + return rt, proto +end + +function advtrains.register_wagon_alias(src, dst) + advtrains.wagon_alias[src] = dst +end + +local function recursive_resolve_alias(name, seen) + local prototype = rawget(advtrains.wagon_prototypes, name) + if prototype then + return name, prototype + end + local resolved = advtrains.wagon_alias[name] + if resolved and not seen[resolved] then + seen[name] = true + return recursive_resolve_alias(resolved, seen) + end +end + +function advtrains.resolve_wagon_alias(name) + return recursive_resolve_alias(name, {}) end function advtrains.standard_inventory_formspec(self, pname, invname) @@ -1334,13 +1404,23 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati groups = wagon_groups, on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then + if pointed_thing.type ~= "node" then return end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local pointed_def = minetest.registered_nodes[node.name] + if pointed_def and pointed_def.on_rightclick then + local controls = placer:get_player_control() + if not controls.sneak then + return pointed_def.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + end + local pname = placer:get_player_name() - local node=minetest.get_node_or_nil(pointed_thing.under) - if not node then atprint("[advtrains]Ignore at placer position") return itemstack end + if node.name == "ignore" then atprint("[advtrains]Ignore at placer position") return itemstack end local nodename=node.name if(not advtrains.is_track_and_drives_on(nodename, prototype.drives_on)) then atprint("no track here, not placing.") @@ -1350,14 +1430,14 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati minetest.chat_send_player(pname, "You don't have the train_operator privilege.") return itemstack end - if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pos, placer:get_player_name()) then return itemstack end local tconns=advtrains.get_track_connections(node.name, node.param2) local yaw = placer:get_look_horizontal() local plconnid = advtrains.yawToClosestConn(yaw, tconns) - local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, prototype.drives_on) + local prevpos = advtrains.get_adjacent_rail(pos, tconns, plconnid, prototype.drives_on) if not prevpos then minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!") return @@ -1365,7 +1445,7 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati local wid = advtrains.create_wagon(sysname, pname) - local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, {wid}) + local id=advtrains.create_new_train_at(pos, plconnid, 0, {wid}) if not advtrains.is_creative(pname) then itemstack:take_item() @@ -1393,3 +1473,88 @@ advtrains.register_wagon("advtrains:wagon_placeholder", { drops={}, }, "Wagon placeholder", "advtrains_wagon_placeholder.png", true) + + +-- Helper function to retrieve the wagon at a certain position in a train, given its train ID and the desired index within that train's path +-- +-- Returns: wagon_num, wagon_id, wagon_data, offset_from_center +-- wagon_num: The n'th wagon in the train (index into "trainparts" table) +-- wagon_id: The wagon ID. Obtain wagon data from advtrains.wagons[wagon_id], and subsequently the wagon prototype via advtrains.get_wagon_prototype(data) +-- offset_from_center: The offset (an absolute distance value) from the center point of the wagon. Positive is towards the end of the train, negative towards the start. (note that this is inverse to the counting direction of the index!) +-- +--[[ To get the wagon standing at a certain world position, you first need to retrieve the index via the occupation table, as follows: + local trains = advtrains.occ.get_trains_at(pos) + for train_id, index in pairs(trains) do + local wagon_num, wagon_id, wagon_data, offset_from_center = advtrains.get_wagon_at_index(train_id, index) + if wagon_num then + ... + end + end +]]-- +function advtrains.get_wagon_at_index(train_id, w_index) + local train = advtrains.trains[train_id] + if not train then error("Passed train id "..train_id.." doesnt exist") end + -- ensure init - always required + advtrains.train_ensure_init(train_id, train) + -- Use path dist to determine the offset from the start of the train + local dstart = advtrains.path_get_path_dist_fractional(train, train.index) + local dtarget = advtrains.path_get_path_dist_fractional(train, w_index) + local dist_from_start = dstart - dtarget -- NOTE: dist_from_start is supposed to be positive, but dtarget will be smaller than dstart + -- if dist_from_start is <0, we are outside of train + if dist_from_start < 0 then + return nil + end + -- scan over wagons to see if dist_from_start falls into its window + local start_pos = 0 + local center_pos + local end_pos + local i = 1 + while train.trainparts[i] do + local w_id = train.trainparts[i] + -- get wagon prototype to retrieve wagon span + local wdata = advtrains.wagons[w_id] + if wdata then + local wtype, wproto = advtrains.get_wagon_prototype(wdata) + local wagon_span = wproto.wagon_span + -- determine center and end pos + center_pos = start_pos + wagon_span + end_pos = center_pos + wagon_span + if start_pos <= dist_from_start and dist_from_start < end_pos then + -- Found the correct wagon in the train! + local offset_from_center = dist_from_start - center_pos + return i, w_id, wdata, offset_from_center + end + -- go on + start_pos = end_pos + else + error("Wagon "..w_id.." from train "..train_id.." doesnt exist!") + end + i = i + 1 + end + -- nothing found, dist must be further back + return nil +end + +function advtrains.get_wagon_entity(wagon_id) + if not advtrains.wagons[wagon_id] then return end + local object = advtrains.wagon_objects[wagon_id] + if object then + return object:get_luaentity() + end +end + +function advtrains.next_wagon_entity_in_train(train, i) + local wagon_id = train.trainparts[i + 1] + if wagon_id then + local wagon = advtrains.get_wagon_entity(wagon_id) + if wagon then + return i + 1, wagon + end + end +end + +function advtrains.wagon_entity_pairs_in_train(train_id) + local train = advtrains.trains[train_id] + if not train then return function() end end + return advtrains.next_wagon_entity_in_train, train, 0 +end diff --git a/mods/advtrains/advtrains_interlocking/database.lua b/mods/advtrains/advtrains_interlocking/database.lua index 6787c504..5096d489 100644 --- a/mods/advtrains/advtrains_interlocking/database.lua +++ b/mods/advtrains/advtrains_interlocking/database.lua @@ -425,7 +425,7 @@ function ildb.link_track_sections(merge_id, root_id) merge_ts(root_id, merge_id) end -function ildb.remove_from_interlocking(sigd) +function ildb.remove_from_interlocking(sigd, no_tcb_marker) local tcbs = ildb.get_tcbs(sigd) if not ildb.may_modify_tcbs(tcbs) then return false end @@ -455,7 +455,9 @@ function ildb.remove_from_interlocking(sigd) track_sections[tsid] = nil end end - advtrains.interlocking.show_tcb_marker(sigd.p) + if not no_tcb_marker then + advtrains.interlocking.show_tcb_marker(sigd.p) + end if tcbs.signal then return false end @@ -468,10 +470,11 @@ function ildb.remove_tcb(pos) return true --FIX: not an error, because tcb is already removed end for connid=1,2 do - if not ildb.remove_from_interlocking({p=pos, s=connid}) then + if not ildb.remove_from_interlocking({p=pos, s=connid}, true) then return false end end + advtrains.interlocking.remove_tcb_marker_pts(pts) track_circuit_breaks[pts] = nil return true end diff --git a/mods/advtrains/advtrains_interlocking/route_prog.lua b/mods/advtrains/advtrains_interlocking/route_prog.lua index 6abe431b..e8f5e8e1 100644 --- a/mods/advtrains/advtrains_interlocking/route_prog.lua +++ b/mods/advtrains/advtrains_interlocking/route_prog.lua @@ -214,19 +214,32 @@ end local player_rte_prog = {} -function advtrains.interlocking.init_route_prog(pname, sigd) +function advtrains.interlocking.init_route_prog(pname, sigd, default_route) if not minetest.check_player_privs(pname, "interlocking") then minetest.chat_send_player(pname, "Insufficient privileges to use this!") return end - player_rte_prog[pname] = { + local rp = { origin = sigd, - route = { - name = "PROG["..pname.."]", - }, - tmp_lcks = {}, } - advtrains.interlocking.visualize_route(sigd, player_rte_prog[pname].route, "prog_"..pname, player_rte_prog[pname].tmp_lcks, pname) + if default_route then + rp.route = table.copy(default_route) + + -- "Step back one section", but keeping turnouts + local last_route = rp.route[#rp.route] + if last_route then + rp.tmp_lcks = last_route.locks + rp.route[#rp.route] = nil + end + rp.route.name = "PROG["..pname.."]" + else + rp.route = { + name = "PROG["..pname.."]" + } + rp.tmp_lcks = {} + end + player_rte_prog[pname] = rp + advtrains.interlocking.visualize_route(sigd, rp.route, "prog_"..pname, rp.tmp_lcks, pname) minetest.chat_send_player(pname, "Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.") end diff --git a/mods/advtrains/advtrains_interlocking/route_ui.lua b/mods/advtrains/advtrains_interlocking/route_ui.lua index 1999941a..a8fee834 100644 --- a/mods/advtrains/advtrains_interlocking/route_ui.lua +++ b/mods/advtrains/advtrains_interlocking/route_ui.lua @@ -24,7 +24,7 @@ function atil.show_route_edit_form(pname, sigd, routeid) local route = tcbs.routes[routeid] if not route then return end - local form = "size[9,10]label[0.5,0.2;Route overview]" + local form = "size[9,11]label[0.5,0.2;Route overview]" form = form.."field[0.8,1.2;6.5,1;name;Route name;"..minetest.formspec_escape(route.name).."]" form = form.."button[7.0,0.9;1.5,1;setname;Set]" @@ -85,11 +85,13 @@ function atil.show_route_edit_form(pname, sigd, routeid) form = form.."button[0.5,6;3,1;back;<<< Back to signal]" form = form.."button[4.5,6;2,1;aspect;Signal Aspect]" form = form.."button[6.5,6;2,1;delete;Delete Route]" + + form = form.."button[5.5,7;3,1;newfrom;New From Route]" --atdebug(route.ars) form = form.."style[ars;font=mono]" - form = form.."textarea[0.8,7.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]" - form = form.."button[5.5,7.23;3,1;savears;Save ARS List]" + form = form.."textarea[0.8,8.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]" + form = form.."button[5.5,8.23;3,1;savears;Save ARS List]" minetest.show_formspec(pname, "at_il_routeedit_"..minetest.pos_to_string(sigd.p).."_"..sigd.s.."_"..routeid, form) @@ -139,6 +141,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) table.remove(tcbs.routes, routeid) advtrains.interlocking.show_signalling_form(sigd, pname) end + + if fields.newfrom then + advtrains.interlocking.init_route_prog(pname, sigd, route) + minetest.close_formspec(pname, formname) + tcbs.ars_ignore_next = nil + return + end if fields.ars and fields.savears then route.ars = atil.text_to_ars(fields.ars) diff --git a/mods/advtrains/advtrains_interlocking/routesetting.lua b/mods/advtrains/advtrains_interlocking/routesetting.lua index 67efaea8..fd6d595f 100644 --- a/mods/advtrains/advtrains_interlocking/routesetting.lua +++ b/mods/advtrains/advtrains_interlocking/routesetting.lua @@ -113,6 +113,7 @@ function ilrs.set_route(signal, route, try) if c_tcbs.signal then c_tcbs.route_committed = true c_tcbs.aspect = route.aspect or advtrains.interlocking.GENERIC_FREE + c_tcbs.route_rsn = nil c_tcbs.route_origin = signal advtrains.interlocking.update_signal_aspect(c_tcbs) end @@ -291,7 +292,13 @@ function ilrs.update_route(sigd, tcbs, newrte, cancel) end if newrte then tcbs.routeset = newrte end --atdebug("Setting:",tcbs.routeset) - local succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset]) + local succ, rsn, cbts, cblk + if tcbs.routes[tcbs.routeset] then + succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset]) + else + succ = false + rsn = attrans("Route state changed.") + end if not succ then tcbs.route_rsn = rsn --atdebug("Routesetting failed:",rsn) diff --git a/mods/advtrains/advtrains_interlocking/signal_api.lua b/mods/advtrains/advtrains_interlocking/signal_api.lua index 83fae4aa..c70366be 100644 --- a/mods/advtrains/advtrains_interlocking/signal_api.lua +++ b/mods/advtrains/advtrains_interlocking/signal_api.lua @@ -165,6 +165,55 @@ This function will query get_aspect to retrieve the new aspect. ]]-- +minetest.register_entity("advtrains_interlocking:ipmarker", { + visual = "mesh", + mesh = "trackplane.b3d", + textures = {"at_il_signal_ip.png"}, + collisionbox = {-1,-0.5,-1, 1,-0.4,1}, + visual_size = {x=10, y=10}, + on_punch = function(self) + self.object:remove() + end, + on_rightclick = function(self, player) + if self.signalpos and player and player:is_player() then + local node = minetest.get_node(self.signalpos) + if minetest.get_item_group(node.name, "advtrains_signal") ~= 0 then + advtrains.interlocking.show_ip_form(self.signalpos, player:get_player_name()) + end + end + end, + get_staticdata = function() return "STATIC" end, + on_activate = function(self, sdata) if sdata=="STATIC" then self.object:remove() end end, + static_save = false, +}) + +local function clean_ipmarker(spos) + for _, luaentity in pairs(minetest.luaentities) do + if luaentity.name == "advtrains_interlocking:ipmarker" + and luaentity.signalpos + and vector.equals(luaentity.signalpos, spos) then + luaentity.object:remove() + end + end +end + +local function ipmarker(ipos, connid, spos) + if spos then + clean_ipmarker(spos) + end + + local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes) + if not node_ok then return end + + local obj = minetest.add_entity(vector.offset(ipos, 0, 0.2, 0), "advtrains_interlocking:ipmarker") + if not obj then return end + obj:set_yaw(advtrains.dir_to_angle(conns[connid].c)) + local luaentity = obj:get_luaentity() + if luaentity then + luaentity.signalpos = spos + end +end + local DANGER = { main = 0, dst = false, @@ -213,6 +262,7 @@ end function advtrains.interlocking.signal_after_dig(pos) -- clear influence point advtrains.interlocking.db.clear_ip_by_signalpos(pos) + clean_ipmarker(pos) end function advtrains.interlocking.signal_set_aspect(pos, asp) @@ -305,20 +355,6 @@ end local players_assign_ip = {} -local function ipmarker(ipos, connid) - local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes) - if not node_ok then return end - local yaw = advtrains.dir_to_angle(conns[connid].c) - - -- using tcbmarker here - local obj = minetest.add_entity(vector.add(ipos, {x=0, y=0.2, z=0}), "advtrains_interlocking:tcbmarker") - if not obj then return end - obj:set_yaw(yaw) - obj:set_properties({ - textures = { "at_il_signal_ip.png" }, - }) -end - -- shows small info form for signal IP state/assignment -- only_notset: show only if it is not set yet (used by signal tcb assignment) function advtrains.interlocking.show_ip_form(pos, pname, only_notset) @@ -333,7 +369,7 @@ function advtrains.interlocking.show_ip_form(pos, pname, only_notset) form = form.."button_exit[0.5,2.5; 5,1;set;Move]" form = form.."button_exit[0.5,3.5; 5,1;clear;Clear]" local ipos = minetest.string_to_pos(pts) - ipmarker(ipos, connid) + ipmarker(ipos, connid, pos) else form = form.."label[0.5,1.5;Influence point is not set.]" form = form.."label[0.5,2.0;It is recommended to set an influence point.]" @@ -361,6 +397,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) advtrains.interlocking.signal_init_ip_assign(pos, pname) elseif fields.clear then advtrains.interlocking.db.clear_ip_by_signalpos(pos) + clean_ipmarker(pos) end end end) @@ -397,7 +434,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) local pts = advtrains.roundfloorpts(pos) if not advtrains.interlocking.db.get_ip_signal_asp(pts, plconnid) then advtrains.interlocking.db.set_ip_signal(pts, plconnid, signalpos) - ipmarker(pos, plconnid) + ipmarker(pos, plconnid, signalpos) minetest.chat_send_player(pname, "Configuring Signal: Successfully set influence point") else minetest.chat_send_player(pname, "Configuring Signal: Influence point of another signal is already present!") diff --git a/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua b/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua index 0cc10da1..264834cc 100755 --- a/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua +++ b/mods/advtrains/advtrains_interlocking/tcb_ts_ui.lua @@ -550,6 +550,13 @@ minetest.register_entity("advtrains_interlocking:tcbmarker", { static_save = false, }) +function advtrains.interlocking.remove_tcb_marker_pts(pts) + if markerent[pts] then + markerent[pts]:remove() + markerent[pts] = nil + end +end + function advtrains.interlocking.show_tcb_marker(pos) --atdebug("showing tcb marker",pos) local tcb = ildb.get_tcb(pos) @@ -573,9 +580,7 @@ function advtrains.interlocking.show_tcb_marker(pos) end local pts = advtrains.roundfloorpts(pos) - if markerent[pts] then - markerent[pts]:remove() - end + advtrains.interlocking.remove_tcb_marker_pts(pts) local obj = minetest.add_entity(pos, "advtrains_interlocking:tcbmarker") if not obj then return end @@ -652,14 +657,22 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle strtab[#strtab+1] = clr .. minetest.formspec_escape(route.name) end form = form.."label[0.5,2.5;Routes:]" - form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",").."]" + form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",") if sel_rte then + form = form .. ";" .. sel_rte .."]" form = form.."button[0.5,6; 5,1;setroute;Set Route]" form = form.."button[0.5,7;2,1;dsproute;Show]" if hasprivs then form = form.."button[3.5,7;2,1;editroute;Edit]" + if sel_rte > 1 then + form = form .. "button[5.5,4;0.5,0.3;moveup;↑]" + end + if sel_rte < #strtab then + form = form .. "button[5.5,4.7;0.5,0.3;movedown;↓]" + end end else + form = form .. "]" if tcbs.ars_disabled then form = form.."label[0.5,6 ;NOTE: ARS is disabled.]" form = form.."label[0.5,6.5;Routes are not automatically set.]" @@ -810,6 +823,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.noauto then tcbs.route_auto = false end + + if sel_rte and tcbs.routes[sel_rte]and not tcbs.routeset then + if fields.moveup then + if tcbs.routes[sel_rte - 1] then + tcbs.routes[sel_rte - 1], tcbs.routes[sel_rte] = tcbs.routes[sel_rte], tcbs.routes[sel_rte - 1] + sel_rte = sel_rte - 1 + end + elseif fields.movedown then + if tcbs.routes[sel_rte + 1] then + tcbs.routes[sel_rte + 1], tcbs.routes[sel_rte] = tcbs.routes[sel_rte], tcbs.routes[sel_rte + 1] + sel_rte = sel_rte + 1 + end + end + end advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, true) return diff --git a/mods/advtrains/advtrains_interlocking/tsr_rail.lua b/mods/advtrains/advtrains_interlocking/tsr_rail.lua index f3025406..c1e3c1c7 100644 --- a/mods/advtrains/advtrains_interlocking/tsr_rail.lua +++ b/mods/advtrains/advtrains_interlocking/tsr_rail.lua @@ -3,13 +3,15 @@ -- Simple rail whose only purpose is to place a TSR on the position, as a temporary solution until the timetable system covers everything. -- This code resembles the code in lines/stoprail.lua +local S = attrans + local function updateform(pos) local meta = minetest.get_meta(pos) local pe = advtrains.encode_pos(pos) local npr = advtrains.interlocking.npr_rails[pe] or 2 - meta:set_string("infotext", "Point speed restriction: "..npr) - meta:set_string("formspec", "field[npr;Set point speed restriction:;"..npr.."]") + meta:set_string("infotext", S("Point speed restriction: @1",npr)) + meta:set_string("formspec", "field[npr;"..S("Set point speed restriction:")..";"..npr.."]") end @@ -25,11 +27,11 @@ local adefunc = function(def, preset, suffix, rotation) on_receive_fields = function(pos, formname, fields, player) local pname = player:get_player_name() if not minetest.check_player_privs(pname, {interlocking=true}) then - minetest.chat_send_player(pname, "Interlocking privilege required!") + minetest.chat_send_player(pname, S("You are not allowed to configure this track without the @1 privilege.", "interlocking")) return end if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "This rail is protected!") + minetest.chat_send_player(pname, S("You are not allowed to configure this track.")) minetest.record_protection_violation(pos, pname) return end @@ -59,7 +61,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_npr.png", - description="Point Speed Restriction Rail", + description=S("Point Speed Restriction Track"), formats={}, get_additional_definiton = adefunc, }, advtrains.trackpresets.t_30deg_straightonly) diff --git a/mods/advtrains/advtrains_line_automation/stoprail.lua b/mods/advtrains/advtrains_line_automation/stoprail.lua index 55a4785a..6c74a3de 100644 --- a/mods/advtrains/advtrains_line_automation/stoprail.lua +++ b/mods/advtrains/advtrains_line_automation/stoprail.lua @@ -28,7 +28,7 @@ local function show_stoprailform(pos, player) local pe = advtrains.encode_pos(pos) local pname = player:get_player_name() if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "Position is protected!") + minetest.chat_send_player(pname, attrans("You are not allowed to configure this track.")) return end @@ -73,7 +73,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local pos = advtrains.decode_pos(pe) if pos then if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "Position is protected!") + minetest.chat_send_player(pname, attrans("You are not allowed to configure this track.")) return end @@ -94,7 +94,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then stdata.stn = fields.stn else - minetest.chat_send_player(pname, "Station code '"..fields.stn.."' does already exist and is owned by "..stn.owner) + minetest.chat_send_player(pname, attrans("Station code \"@1\" already exists and is owned by @2.", fields.stn, stn.owner)) show_stoprailform(pos,player) return end @@ -108,7 +108,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then stn.name = fields.stnname else - minetest.chat_send_player(pname, "Not allowed to edit station name, owned by "..stn.owner) + minetest.chat_send_player(pname, attrans("This station is owned by @1. You are not allowed to edit its name.", stn.owner)) end end @@ -218,7 +218,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_stop.png", - description="Station/Stop Rail", + description=attrans("Station/Stop Track"), formats={}, get_additional_definiton = adefunc, }, advtrains.trackpresets.t_30deg_straightonly) diff --git a/mods/advtrains/advtrains_luaautomation/README.md b/mods/advtrains/advtrains_luaautomation/README.md old mode 100755 new mode 100644 index 67a4b803..275653c0 --- a/mods/advtrains/advtrains_luaautomation/README.md +++ b/mods/advtrains/advtrains_luaautomation/README.md @@ -93,6 +93,9 @@ Removes any pending interrupts of this node. Make this active component send a digiline message on the specified channel. Not available in init code. + - `trainparts(train_id)` + returns a table with the ids of the cars the train is composed of, or false if `train_id` is invalid. `train_id` can be replaced with `atc_id` when used in LuaATC Rails. + - `atc_send_to_train(, )` Sends the specified ATC command to the train specified by its train id. This happens regardless of where the train is in the world, and can be used to remote-control trains. Returns true on success. If the train ID does not exist, returns false and does nothing. See [atc_command.txt](../atc_command.txt) for the ATC command syntax. @@ -142,22 +145,16 @@ asp = { -- the character of call_on and dead_end is purely informative call_on = , -- Call-on route, expect train in track ahead (not implemented yet) dead_end = , -- Route ends on a dead end (e.g. bumper) (not implemented yet) - - w_speed = , - -- "Warning speed restriction". Supposed for short-term speed - -- restrictions which always override any other restrictions - -- imposed by "speed" fields, until lifted by a value of -1 - -- (Example: german Langsamfahrstellen-Signale) } ``` -As of January 2020, the 'dst', 'call_on' and 'dead_end' fields are not used. +As of September 2024, the 'dst', 'call_on' and 'dead_end' fields are not used. #### Lines The advtrains_line_automation component adds a few contraptions that should make creating timeable systems easier. Part of its functionality is also available in LuaATC: -- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:lines:rwt) +- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:api:railway_time_api) - `schedule(rw_time, msg)`, `schedule_in(rw_dtime, msg)` Schedules an event of type {type="schedule", schedule=true, msg=msg} at (resp. after) the specified railway time (which can be in any format). You can only schedule one event this way. (uses the new lines-internal scheduler) @@ -255,7 +252,10 @@ In addition to the above environment functions, the following functions are avai The interlocking system uses this property for Automatic Routesetting. #### Shunting Functions and Variables -There are several functions available especially for shunting operations. Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive: +There are several functions available especially for shunting operations. +Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive. +FCs are composed of codes separated by exclamation marks (`!`), for instance `"foo!bar!baz"`. +Each wagon has a current FC, indicating its next destination. - `split_at_index(index, atc_command)` Splits the train at the specified index, into a train with index-1 wagons and a second train starting with the index-th wagon. The `atc_command` specified is sent to the second train after decoupling. `"S0"` or `"B0"` is common to ensure any locomotives in the remaining train don't continue to move. @@ -266,6 +266,25 @@ There are several functions available especially for shunting operations. Some o Command: `split_at_index(4,"S0")` Result: first train (continues at previous speed): `"foo","foo","foo"`, second train (slows at S0): `"bar","bar","bar"` + - `get_fc()` + Returns a table with the entire FC list for each wagon in the train. + Command: `get_fc()` + Result: `{"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"}` + + - `get_fc_index()` + Returns a table with the current FC index for each wagon in the train. Use in conjunction with the result from `get_fc()` to find a the current FC for a wagon. + Command: `get_fc_index()` + Result: `{1, 1, 1, 2, 1}` + + - `set_fc(fc_list, reset_index)` + Overwrites the FC list according to a table `fc_list`. A false or nil entry will leave the wagon unaffected, however all others will be overwritten. + Useful for mass-programming freight trains that use FC-shunting instead of walking to each wagon individually. If the new FC entry for a wagon is shorter than the old entry, the index will clip to the last FC in the new entry. + If `reset_index` is true, all Current FC values will reset to the first entry in the list, instead of remaining at the current index. + + Example: train has FC lists: `"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"` + Command: `set_fc({"", "foo!turtle", nil, "4tehlulz", false})` + Result: `""` `"foo!turtle"` `"testing"` `"4tehlulz"` `"hello_world"` + - `split_at_fc(atc_command, len)` Splits the train in such a way that all cars with non-empty current FC of the first part of the train have the same FC. The `atc_command` specified is sent to the rear part, as with split_at_index. It returns the fc of the cars of the first part. @@ -289,15 +308,11 @@ There are several functions available especially for shunting operations. Some o first part of the train as above. - `step_fc()` - Steps the FCs of all train cars forward. FCs are composed of codes - separated by exclamation marks (`!`), for instance - `"foo!bar!baz"`. Each wagon has a current FC, indicating its next - destination. Stepping the freight code forward, selects the next - code after the !. If the end of the string is reached, then the + Steps the FCs of all train cars forward, selecting the next + code after the `!`. If the end of the string is reached, then the first code is selected, except if the string ends with a question mark (`?`), then the order is reversed. - - `train_length()` returns the number of cars the train is composed of. diff --git a/mods/advtrains/advtrains_luaautomation/active_common.lua b/mods/advtrains/advtrains_luaautomation/active_common.lua index 50fb2bc0..074d3b34 100644 --- a/mods/advtrains/advtrains_luaautomation/active_common.lua +++ b/mods/advtrains/advtrains_luaautomation/active_common.lua @@ -1,4 +1,4 @@ - +local S = atltrans local ac = {nodes={}} @@ -14,7 +14,7 @@ end function ac.after_place_node(pos, player) local meta=minetest.get_meta(pos) meta:set_string("formspec", ac.getform(pos, meta)) - meta:set_string("infotext", "LuaATC component, unconfigured.") + meta:set_string("infotext", S("Unconfigured LuaATC component")) local ph=minetest.pos_to_string(pos) --just get first available key! for en,_ in pairs(atlatc.envs) do @@ -43,11 +43,11 @@ function ac.getform(pos, meta_p) end local form = "size["..atlatc.CODE_FORM_SIZE.."]" .."style[code;font=mono]" - .."label[0,-0.1;Environment]" + .."label[0,-0.1;"..S("LuaATC Environment").."]" .."dropdown[0,0.3;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]" - .."button[5,0.2;2,1;save;Save]" - .."button[7,0.2;3,1;cle;Clear Local Env.]" - .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;Code;"..minetest.formspec_escape(code).."]" + .."button[5,0.2;2,1;save;"..S("Save").."]" + .."button[7,0.2;3,1;cle;"..S("Clear Local Environment").."]" + .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;"..S("Code")..";"..minetest.formspec_escape(code).."]" .."label["..atlatc.CODE_FORM_ERRLABELPOS..";"..err.."]" return form end @@ -55,13 +55,17 @@ end function ac.after_dig_node(pos, node, player) advtrains.invalidate_all_paths(pos) advtrains.ndb.clear(pos) + atlatc.interrupt.clear_ints_at_pos(pos) + if advtrains.lines and advtrains.lines.sched then + advtrains.lines.sched.discard_all(advtrains.encode_pos(pos)) + end local ph=minetest.pos_to_string(pos) ac.nodes[ph]=nil end function ac.on_receive_fields(pos, formname, fields, player) if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then - minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!") + minetest.chat_send_player(player:get_player_name(), S("You are not allowed to configure this LuaATC component without the @1 privilege.", "atlatc")) return end @@ -91,9 +95,9 @@ function ac.on_receive_fields(pos, formname, fields, player) meta:set_string("formspec", ac.getform(pos, meta)) if nodetbl.env then - meta:set_string("infotext", "LuaATC component, assigned to environment '"..nodetbl.env.."'") + meta:set_string("infotext", S("LuaATC component assigned to environment '@1'", nodetbl.env)) else - meta:set_string("infotext", "LuaATC component, invalid enviroment set!") + meta:set_string("infotext", S("LuaATC component assigned to an invalid environment")) end end @@ -168,7 +172,7 @@ function ac.run_in_env(pos, evtdata, customfct_p, ignore_no_code) atlatc.active.nodes[ph].err=dataout env:log("error", "LuaATC component at",ph,": LUA Error:",dataout) if meta then - meta:set_string("infotext", "LuaATC component, ERROR:"..dataout) + meta:set_string("infotext", S("LuaATC component with error: @1", dataout)) end --TODO temporary --if customfct.atc_id then diff --git a/mods/advtrains/advtrains_luaautomation/atc_rail.lua b/mods/advtrains/advtrains_luaautomation/atc_rail.lua index 5dde99c8..dd26f51f 100644 --- a/mods/advtrains/advtrains_luaautomation/atc_rail.lua +++ b/mods/advtrains/advtrains_luaautomation/atc_rail.lua @@ -91,6 +91,47 @@ function r.fire_event(pos, evtdata, appr_internal) if not train_id then return false end advtrains.train_step_fc(train) end, + get_fc = function() + if not train_id then return end + local fc_list = {} + for index,wagon_id in ipairs(train.trainparts) do + fc_list[index] = table.concat(advtrains.wagons[wagon_id].fc or {},"!") + end + return fc_list + end, + get_fc_index = function() + if not train_id then return end + local fc_index_list = {} + for widx, wagon_id in ipars(train.trainparts) do + fc_index_list[widx] = advtrains.wagons[wagon_id].fcind or 1 + end + return fc_index_list + end, + set_fc = function(fc_list,reset_index) + assertt(fc_list, "table") + if not train_id then return false end + -- safety type-check for entered values + for _,v in ipairs(fc_list) do + if v and type(v) ~= "string" then + error("FC entries must be a string") + return + end + end + for index,wagon_id in ipairs(train.trainparts) do + if fc_list[index] then -- has FC to enter to this wagon + local data = advtrains.wagons[wagon_id] + if data then -- wagon actually exists + --effectively copyied from wagons.lua, allowing for the :split function and reset_index + data.fc = fc_list[index]:split("!") + if reset_index or not data.fcind then + data.fcind = 1 + elseif data.fcind > #data.fc then + data.fcind = #data.fc + end + end + end + end + end, set_shunt = function() -- enable shunting mode if not train_id then return false end @@ -187,7 +228,7 @@ advtrains.register_tracks("default", { models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_atc.png", - description=atltrans("LuaATC Rail"), + description=atltrans("LuaATC Track"), formats={}, get_additional_definiton = function(def, preset, suffix, rotation) return { diff --git a/mods/advtrains/advtrains_luaautomation/environment.lua b/mods/advtrains/advtrains_luaautomation/environment.lua old mode 100755 new mode 100644 index 6b1a2837..b54d45c2 --- a/mods/advtrains/advtrains_luaautomation/environment.lua +++ b/mods/advtrains/advtrains_luaautomation/environment.lua @@ -153,6 +153,12 @@ local static_env = { local pos=atlatc.pcnaming.resolve_pos(parpos, "interrupt_pos") atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg}) end, + train_parts = function(train_id) + if not train_id then return false end + local train = advtrains.trains[train_id] + if not train then return false end + return table.copy(train.trainparts or {}) + end, -- sends an atc command to train regardless of where it is in the world atc_send_to_train = function(train_id, command) assertt(command, "string") @@ -164,6 +170,9 @@ local static_env = { return false end end, + get_slowdown = function() + return advtrains.global_slowdown + end } -- If interlocking is present, enable route setting functions @@ -221,7 +230,7 @@ if advtrains.interlocking then end static_env.set_aspect = function(signal, asp) local pos = atlatc.pcnaming.resolve_pos(signal) - return advtrains.interlocking.signal_set_aspect(pos) + return advtrains.interlocking.signal_set_aspect(pos,asp) end --section_occupancy() @@ -229,11 +238,8 @@ if advtrains.interlocking then if not ts_id then return nil end ts_id = tostring(ts_id) local response = advtrains.interlocking.db.get_ts(ts_id) - if response == nil then - return false - else - return response.trains - end + if not response then return false end + return (response.trains and table.copy(response.trains)) or {} end end @@ -262,6 +268,11 @@ if advtrains.lines then } end + +atlatc.register_function = function (name, f) + static_env[name] = f +end + for _, name in pairs(safe_globals) do static_env[name] = _G[name] end diff --git a/mods/advtrains/advtrains_luaautomation/init.lua b/mods/advtrains/advtrains_luaautomation/init.lua index c51aa71e..b359142d 100644 --- a/mods/advtrains/advtrains_luaautomation/init.lua +++ b/mods/advtrains/advtrains_luaautomation/init.lua @@ -2,15 +2,15 @@ -- Lua automation features for advtrains -- Uses global table 'atlatc' (AdvTrains_LuaATC) ---TODO: re-add localization (if merging localization, discard this hunk please) -atltrans = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end +atltrans = attrans +local S = atltrans --Privilege --Only trusted players should be enabled to build stuff which can break the server. atlatc = { envs = {}} -minetest.register_privilege("atlatc", { description = "Player can place and modify LUA ATC components. Grant with care! Allows to execute bad LUA code.", give_to_singleplayer = false, default= false }) +minetest.register_privilege("atlatc", { description = S("Can place and configure LuaATC components, including execute potentially harmful Lua code"), give_to_singleplayer = false, default= false }) --Size of code input forms in X,Y notation. Must be at least 10x10 atlatc.CODE_FORM_SIZE = "15,12" diff --git a/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua b/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua index bffff84e..69818399 100644 --- a/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua +++ b/mods/advtrains/advtrains_luaautomation/mesecon_controller.lua @@ -6,6 +6,7 @@ -- From Mesecons mod https://mesecons.net/ -- (c) Jeija and Contributors +local S = atltrans local BASENAME = "advtrains_luaautomation:mesecon_controller" local rules = { @@ -207,7 +208,7 @@ for d = 0, 1 do } minetest.register_node(node_name, { - description = "LuaATC Mesecon Controller", + description = S("LuaATC Mesecon Controller"), drawtype = "nodebox", tiles = { top, diff --git a/mods/advtrains/advtrains_luaautomation/operation_panel.lua b/mods/advtrains/advtrains_luaautomation/operation_panel.lua index bfbbda41..8e12651f 100644 --- a/mods/advtrains/advtrains_luaautomation/operation_panel.lua +++ b/mods/advtrains/advtrains_luaautomation/operation_panel.lua @@ -1,13 +1,14 @@ +local S = atltrans -local function on_punch(pos, player) - atlatc.interrupt.add(0, pos, {type="punch", punch=true}) +local function on_punch(pos,node,player) + atlatc.interrupt.add(0, pos, {type="punch", punch=true, name=player:get_player_name()}) end minetest.register_node("advtrains_luaautomation:oppanel", { drawtype = "normal", tiles={"atlatc_oppanel.png"}, - description = "LuaATC operation panel", + description = S("LuaATC Operation Panel"), groups = { cracky = 1, save_in_at_nodedb=1, diff --git a/mods/advtrains/advtrains_luaautomation/pcnaming.lua b/mods/advtrains/advtrains_luaautomation/pcnaming.lua index 71f4d9a4..0089ae71 100644 --- a/mods/advtrains/advtrains_luaautomation/pcnaming.lua +++ b/mods/advtrains/advtrains_luaautomation/pcnaming.lua @@ -2,6 +2,8 @@ --a.k.a Passive component naming --Allows to assign names to passive components, so they can be called like: --setstate("iamasignal", "green") +local S = atltrans + atlatc.pcnaming={name_map={}} function atlatc.pcnaming.load(stuff) if type(stuff)=="table" then @@ -22,8 +24,11 @@ function atlatc.pcnaming.resolve_pos(pos, func_name) error("Invalid position supplied to " .. (func_name or "???")..": " .. dump(pos)) end + +local pcrename = {} + minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ - description = attrans("Passive Component Naming Tool\n\nRight-click to name a passive component."), + description = S("Passive Component Naming Tool\n\nRight-click to name a passive component."), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "atlatc_pcnaming.png", wield_image = "atlatc_pcnaming.png", @@ -34,7 +39,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ return end if not minetest.check_player_privs(pname, {atlatc=true}) then - minetest.chat_send_player(pname, "Missing privilege: atlatc") + minetest.chat_send_player(pname, S("You are not allowed to name LuaATC passive components without the @1 privilege.", "atlatc")) return end if pointed_thing.type=="node" then @@ -43,6 +48,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ minetest.record_protection_violation(pos, pname) return end + local node = advtrains.ndb.get_node(pos) local ndef = minetest.registered_nodes[node.name] if node.name and ( @@ -57,16 +63,17 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ pn=name end end - minetest.show_formspec(pname, "atlatc_naming_"..minetest.pos_to_string(pos), "field[pn;Set name of component (empty to clear);"..minetest.formspec_escape(pn).."]") + pcrename[pname] = pos + minetest.show_formspec(pname, "atlatc_naming", "field[pn;"..S("Set name of component (empty to clear)")..";"..minetest.formspec_escape(pn).."]") end end end, }) minetest.register_on_player_receive_fields(function(player, formname, fields) - local pts=string.match(formname, "^atlatc_naming_(.+)") - if pts then - local pos=minetest.string_to_pos(pts) - if fields.pn then + if formname == "atlatc_naming" then + local pname = player:get_player_name() + local pos=pcrename[pname] + if fields.pn and pos then --first remove all occurences for name, npos in pairs(atlatc.pcnaming.name_map) do if vector.equals(npos, pos) then diff --git a/mods/advtrains/advtrains_signals_ks/init.lua b/mods/advtrains/advtrains_signals_ks/init.lua index e97eb77e..258b8683 100755 --- a/mods/advtrains/advtrains_signals_ks/init.lua +++ b/mods/advtrains/advtrains_signals_ks/init.lua @@ -210,6 +210,8 @@ for _, rtab in ipairs({ danger = {asp = { main = false, shunt = false }, n = "shuntd", ici=true}, shuntd = {asp = { main = false, shunt = true } , n = "danger"}, }) do + local sbox = table.copy(rtab.sbox) + sbox[5] = 0 minetest.register_node("advtrains_signals_ks:ra_"..typ.."_"..rot, { description = "Ks Shunting Signal", drawtype = "mesh", @@ -223,7 +225,11 @@ for _, rtab in ipairs({ paramtype2 = "facedir", selection_box = { type = "fixed", - fixed = {-1/4, -1/2, -1/4, 1/4, 0, 1/4} + fixed = {sbox, rotation_sbox} + }, + collision_box = { + type = "fixed", + fixed = sbox, }, groups = { cracky = 2, @@ -444,6 +450,23 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "advtrains_signals_ks:zs3_off_0 2", + recipe = { + {"","default:steel_ingot",""}, + {"default:steel_ingot","dye:white","default:steel_ingot"}, + {"","advtrains_signals_ks:mast_mast_0",""} + }, +}) +minetest.register_craft({ + output = "advtrains_signals_ks:zs3v_off_0 2", + recipe = { + {"","default:steel_ingot",""}, + {"default:steel_ingot","dye:yellow","default:steel_ingot"}, + {"","advtrains_signals_ks:mast_mast_0",""} + }, +}) + local sign_material = "default:sign_wall_steel" --fallback if minetest.get_modpath("basic_materials") then sign_material = "basic_materials:plastic_sheet" diff --git a/mods/advtrains/advtrains_train_track/init.lua b/mods/advtrains/advtrains_train_track/init.lua old mode 100755 new mode 100644 index 87720e23..32e12356 --- a/mods/advtrains/advtrains_train_track/init.lua +++ b/mods/advtrains/advtrains_train_track/init.lua @@ -1,6 +1,182 @@ -- Default tracks for advtrains -- (c) orwell96 and contributors +local default_boxen = { + ["st"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2}, + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + }, + + ["cr"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.6875, -0.3750, 0.5000}, + {-0.3750, -0.5000, -1.000, 1.000, -0.3750, 0.000} + } + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.7500, -0.3750, 0.8750}, + {-0.3750, -0.5000, 0.8750, 0.2500, -0.3750, 1.188}, + {0.7500, -0.5000, 0.2500, 1.063, -0.3750, 0.8750} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.125, 0.5000, -0.3750, 0.6875}, + {-0.8750, -0.5000, -0.9375, -0.5000, -0.3750, 0.06250}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.8125, -0.5000, -0.5000, 1.188, -0.3750, 0.5000}, + {-0.1875, -0.5000, 0.5000, 0.8750, -0.3125, 0.8750}, + {-0.2500, -0.5000, -0.9375, 0.3125, -0.3125, -0.5000} + } + } + }, + }, + + ["swlst"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000}, + {-0.3125, -0.5000, -1.000, 0.9375, -0.3125, -0.06250} + } + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.1875, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.8125, -0.5000, -0.3750, 0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + }, + + ["swrst"] = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000}, + {-0.8125, -0.5000, -1.000, 0.4375, -0.3125, -0.06250} + } + } + }, + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.1875, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.5000, -0.5000, 0.5000, 0.5000, -0.3750, 0.8750}, + {-0.8125, -0.5000, -0.8750, 0.5000, -0.3750, -0.5000} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + }, +} + +default_boxen["swlcr"] = default_boxen["swlst"] +default_boxen["swrcr"] = default_boxen["swrst"] + --flat advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack", @@ -10,6 +186,14 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("Track"), formats={}, + + get_additional_definiton = function(def, preset, suffix, rotation) + if default_boxen[suffix] ~= nil and default_boxen[suffix][rotation] ~= nil then + return default_boxen[suffix][rotation] + else + return {} + end + end, }, advtrains.ap.t_30deg_flat) minetest.register_craft({ @@ -21,6 +205,59 @@ minetest.register_craft({ }, }) +local y3_boxen = { + [""] = { + selection_box = { + type = "fixed", + fixed = { + {-0.8750, -0.5000, -1.125, 0.8750, -0.3750, 0.4375} + } + } + }, + + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625}, + {0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000}, + } + } + }, + + --UX FIXME: - 3way - have to place straight route before l and r or the + --nodebox overlaps too much and can't place the straight track node. + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.1250, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-1.1250, -0.5000, -0.9375, -0.5000, -0.3750, 0.5000} + } + } + }, + + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + --{-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000}, + {-0.875, -0.5000, -0.5, 1.0, -0.3750, 0.5}, + --{-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625}, + {-0.4375, -0.5000, -0.8750, 0.5625, -0.3750, -0.5000}, + --{0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000}, + {-0.2500, -0.5000, -0.2500, 1.0000, -0.3750, 0.8125}, + } + } + }, +} + + +local function y3_turnouts_addef(def, preset, suffix, rotation) + return y3_boxen[rotation] or {} +end -- y-turnout advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack_sy", @@ -30,6 +267,7 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("Y-turnout"), formats = {}, + get_additional_definiton = y3_turnouts_addef, }, advtrains.ap.t_yturnout) minetest.register_craft({ output = 'advtrains:dtrack_sy_placer 2', @@ -48,6 +286,7 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("3-way turnout"), formats = {}, + get_additional_definiton = y3_turnouts_addef, }, advtrains.ap.t_s3way) minetest.register_craft({ output = 'advtrains:dtrack_s3_placer 1', @@ -59,6 +298,35 @@ minetest.register_craft({ }) -- Diamond Crossings + +local perp_boxen = { + [""] = {}, --default size + ["_30"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000} + } + } + }, + ["_45"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.8125, -0.5000, -0.8125, 0.8125, -0.3750, 0.8125} + } + } + }, + ["_60"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000} + } + } + }, +} + -- perpendicular advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack_xing", @@ -67,7 +335,10 @@ advtrains.register_tracks("default", { models_suffix=".obj", shared_texture="advtrains_dtrack_shared.png", description=attrans("Perpendicular Diamond Crossing Track"), - formats = {} + formats = {}, + get_additional_definiton = function(def, preset, suffix, rotation) + return perp_boxen[rotation] or {} + end }, advtrains.ap.t_perpcrossing) minetest.register_craft({ @@ -79,6 +350,73 @@ minetest.register_craft({ } }) +local ninety_plus_boxen = { + ["30l"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["30r"] = { + selection_box = { + type = "fixed", + fixed = { + {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000}, + {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500}, + {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000}, + {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000} + } + } + }, + ["45l"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000} + } + } + }, + ["45r"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750}, + {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}, + {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000} + } + } + }, + ["60l"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + ["60r"] = { + selection_box = { + type = "fixed", + fixed = { + {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000}, + {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000}, + {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750}, + {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875} + } + } + }, +} + -- 90plusx -- When you face east and param2=0, then this set of rails has a rail at 90 -- degrees to the viewer, plus another rail crossing at 30, 45 or 60 degrees. @@ -89,7 +427,10 @@ advtrains.register_tracks("default", { models_suffix=".obj", shared_texture="advtrains_dtrack_shared.png", description=attrans("90+Angle Diamond Crossing Track"), - formats = {} + formats = {}, + get_additional_definiton = function(def, preset, suffix, rotation) + return ninety_plus_boxen[suffix] or {} + end, }, advtrains.ap.t_90plusx_crossing) minetest.register_craft({ output = 'advtrains:dtrack_xing90plusx_placer 2', @@ -99,6 +440,7 @@ minetest.register_craft({ {'', '', 'advtrains:dtrack_placer'} } }) + -- Deprecate any rails using the old name scheme minetest.register_lbm({ label = "Upgrade legacy 4590 rails", @@ -119,6 +461,83 @@ minetest.register_lbm({ -- This will replace any items left in the inventory minetest.register_alias("advtrains:dtrack_xing4590_placer", "advtrains:dtrack_xing90plusx_placer") +local diagonal_boxen = { + ["30r45l"] = { + selection_box = { + type = "fixed", + fixed = { + {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000}, + {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500}, + {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000}, + {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000} + } + } + }, + ["60l30l"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + ["60l60r"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000} + } + } + }, + ["60r30r"] = { + selection_box = { + type = "fixed", + fixed = { + {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000}, + {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000}, + {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750}, + {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875} + } + } + }, + ["30l45r"] = { + selection_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000}, + {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500}, + {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000}, + {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000} + } + } + }, + ["60l45r"] = { + selection_box = { + type = "fixed", + fixed = { + {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000}, + {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000}, + {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750}, + {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875} + } + } + }, + ["60r45l"] = { + selection_box = { + type = "fixed", + fixed = { + {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000}, + {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000}, + {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750}, + {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875} + } + } + }, +} + -- Diagonal -- This set of rail crossings is named based on the angle of each intersecting -- direction when facing east and param2=0. Rails with l/r swapped are mirror @@ -131,6 +550,9 @@ advtrains.register_tracks("default", { shared_texture="advtrains_dtrack_shared.png", description=attrans("Diagonal Diamond Crossing Track"), formats = {}, + get_additional_definiton = function(def, preset, suffix, rotation) + return diagonal_boxen[suffix] or {} + end, }, advtrains.ap.t_diagonalcrossing) minetest.register_craft({ output = 'advtrains:dtrack_xingdiag_placer 2', @@ -256,8 +678,45 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +local function load_wagon(wagon_id, node_inv, node_fc, unload) + local inv_modified = false + local w_inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..wagon_id}) + if w_inv and w_inv:get_list("box") then + + local wagon_data = advtrains.wagons[wagon_id] + local wagon_fc + if wagon_data.fc then + if not wagon_data.fcind then wagon_data.fcind = 1 end + wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or "" + end + + if node_fc == "" or wagon_fc == node_fc then + if not unload then + for _, item in ipairs(node_inv:get_list("main")) do + if w_inv:get_list("box") and w_inv:room_for_item("box", item) then + w_inv:add_item("box", item) + node_inv:remove_item("main", item) + if item.name ~= "" then inv_modified = true end + end + end + else + for _, item in ipairs(w_inv:get_list("box")) do + if node_inv:get_list("main") and node_inv:room_for_item("main", item) then + w_inv:remove_item("box", item) + node_inv:add_item("main", item) + if item.name ~= "" then inv_modified = true end + end + end + end + end + end + return inv_modified +end -local function train_load(pos, train_id, unload) +local function load_entire_train(pos, train_id, unload) -- flood load when not in an active area + if advtrains.is_node_loaded(pos) then -- leave the loading to the nodetimer if area is loaded + return + end local train=advtrains.trains[train_id] local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z}) if not string.match(below.name, "chest") then @@ -270,43 +729,60 @@ local function train_load(pos, train_id, unload) --track section is disabled return end - - local inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}}) - if inv and train.velocity < 2 then - for k, v in ipairs(train.trainparts) do - local i=minetest.get_inventory({type="detached", name="advtrains_wgn_"..v}) - if i and i:get_list("box") then - - local wagon_data = advtrains.wagons[v] - local wagon_fc - if wagon_data.fc then - if not wagon_data.fcind then wagon_data.fcind = 1 end - wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or "" - end - - if node_fc == "" or wagon_fc == node_fc then - if not unload then - for _, item in ipairs(inv:get_list("main")) do - if i:get_list("box") and i:room_for_item("box", item) then - i:add_item("box", item) - inv:remove_item("main", item) - end - end - else - for _, item in ipairs(i:get_list("box")) do - if inv:get_list("main") and inv:room_for_item("main", item) then - i:remove_item("box", item) - inv:add_item("main", item) - end + local node_inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}}) + if node_inv and train.velocity <= 2 then + for _, wagon_id in ipairs(train.trainparts) do + load_wagon(wagon_id, node_inv, node_fc, unload) + end + end +end + +local function load_wagon_on_timer(pos, unload) -- loading ramp when in an active area + if not advtrains.is_node_loaded(pos) then -- leave the loading for the flood load function. we're out of area + return true -- reset the nodetimer until the node is loaded again + end + local tid, tidx = advtrains.get_train_at_pos(pos) + if not tid or tid == "" then + return true + end -- no train to load. + + local train = advtrains.trains[tid] + local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z}) + if not string.match(below.name, "chest") then + atprint("this is not a chest! at "..minetest.pos_to_string(pos)) + return true + end + local node_fc = minetest.get_meta(pos):get_string("fc") or "" + if node_fc == "#" then + --track section is disabled + return true + end + local node_inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}}) + if node_inv and train.velocity <= 2 then + local _, wagon_id, wagon_data = advtrains.get_wagon_at_index(tid, tidx) + if wagon_id then + local inv_modified = load_wagon(wagon_id, node_inv, node_fc, unload) + if inv_modified then + if advtrains.wagon_prototypes[advtrains.get_wagon_prototype(wagon_data)].set_textures then + local wagon_object = advtrains.wagon_objects[wagon_id] + if wagon_object and wagon_data then + local ent = wagon_object:get_luaentity() + if ent and ent.set_textures then + ent:set_textures(wagon_data) end end end end end end + return true end - +local nodetimer_interval = minetest.settings:get("advtrains_loading_track_timer") or 1 +local function start_nodetimer(pos) + local timer = minetest.get_node_timer(pos) + timer:start(nodetimer_interval) +end advtrains.register_tracks("default", { nodename_prefix="advtrains:dtrack_unload", @@ -325,9 +801,16 @@ advtrains.register_tracks("default", { on_rightclick = function(pos, node, player) show_fc_formspec(pos, player) end, + after_place_node = function(pos) + advtrains.ndb.update(pos) + start_nodetimer(pos) + end, + on_timer = function(pos) + return load_wagon_on_timer(pos, true) + end, advtrains = { on_train_enter = function(pos, train_id) - train_load(pos, train_id, true) + load_entire_train(pos, train_id, true) end, }, } @@ -350,9 +833,16 @@ advtrains.register_tracks("default", { on_rightclick = function(pos, node, player) show_fc_formspec(pos, player) end, + after_place_node = function(pos) + advtrains.ndb.update(pos) + start_nodetimer(pos) + end, + on_timer = function(pos) + return load_wagon_on_timer(pos, false) + end, advtrains = { on_train_enter = function(pos, train_id) - train_load(pos, train_id, false) + load_entire_train(pos, train_id, false) end, }, } @@ -366,7 +856,6 @@ if minetest.get_modpath("basic_materials") then elseif minetest.get_modpath("technic") then loader_core = "technic:control_logic_unit" end ---print("Loader Core: "..loader_core) minetest.register_craft({ type="shapeless", diff --git a/mods/advtrains/advtrains_train_track/settingtypes.txt b/mods/advtrains/advtrains_train_track/settingtypes.txt new file mode 100644 index 00000000..0af0081c --- /dev/null +++ b/mods/advtrains/advtrains_train_track/settingtypes.txt @@ -0,0 +1,4 @@ +# Set the nodetimer delay for the loading tracks. +# A longer delay may cause wagons to be missed if the pass over too fast. +# A shorter delay may cause lag as wagons are checked multiple times as they pass over. +advtrains_loading_track_timer (Loading Track Timer) int 1 \ No newline at end of file diff --git a/mods/ambience/README.md b/mods/ambience/README.md index 689ca017..8eee2fd8 100644 --- a/mods/ambience/README.md +++ b/mods/ambience/README.md @@ -20,5 +20,9 @@ Based on Immersive Sounds .36 mod by Neuromancer and optimized to run on servers - 1.5 - Added 'flame_sound' and fire redo check, code tidy and tweak, added ephemeral flag for background sounds. - 1.6 - Finding env_sounds disables water and lava sets, added 'ambience_water_move' flag to override water walking sounds, use eye level for head node. - 1.7 - Music will play every 20-30 minutes if found, use '/mvol 0' to stop playing music or disable in-game. +- 1.8 - Players can set induvidual volume for sound and music which is saved. +- 1.9 - Tidy code, refactor music playing, add biome name to sound_check. +- 2.0 - Add Mineclone support, add ethereal leaf check, remove minetest.after for custom timer, add Polish translation, tweak & tidy code. +- 2.1 - Add ambience.group_total() function for easy counting of group: nodes inside a set. Code license: MIT diff --git a/mods/ambience/api.txt b/mods/ambience/api.txt index fb97081d..d682f475 100644 --- a/mods/ambience/api.txt +++ b/mods/ambience/api.txt @@ -27,6 +27,7 @@ ambience.add_set(set_name, def) 'positions' position data for every node found 'head_node' name of node at player head level 'feet_node' nameof node at player foot level + 'biome' name of biome at current position This will let you add a set or sounds with the frequency it's used and check function for it to play. If ephemeral is true then no handler will be used and sound will be played in background alongside other sounds. @@ -42,14 +43,22 @@ ambience.add_set("windy", { {name = "crow", length = 3, ephemeral = true}, }, sound_check = function(def) - local number = totals["default:sand"] or 0 -- yep, can also be nil + local number = def.totals["default:sand"] or 0 -- yep, can also be nil if number > 20 then return "windy", 0.2 -- return set to play and optional gain volume end - end, + end }) +Counting group: nodes +--------------------- + +Instead of counting each node total for things like leaves within the sound_check function, you could use the following helper function to return their total instead e.g. + +local number = ambience.group_totals(def.totals, "leaves") -- count all group:leaves + + Getting Sound Set ----------------- @@ -80,7 +89,7 @@ Additional Commands Two volume commands have been added to set sound and music volume: /svol (0.1 to 1.0) -/mvol (0.1 to 1.0) -- 0 can be used to stop music from playing when it begins +/mvol (0.1 to 1.0) -- 0 can be used to stop music curently playing Music @@ -88,4 +97,5 @@ Music Music can be stored in the sounds folder either on server or locally and so long as it is named 'ambience_music.1', 'ambience_music.2' etc. then it will select -a song randomly at midnight and play player. +a song randomly to play every 20 minutes. + diff --git a/mods/ambience/depends.txt b/mods/ambience/depends.txt deleted file mode 100644 index 9d316eb0..00000000 --- a/mods/ambience/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -default -fire? -playerplus? diff --git a/mods/ambience/description.txt b/mods/ambience/description.txt deleted file mode 100644 index fd0b66e3..00000000 --- a/mods/ambience/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds realistic sound effects into your world. diff --git a/mods/ambience/init.lua b/mods/ambience/init.lua index 6044ea07..059d0bb6 100644 --- a/mods/ambience/init.lua +++ b/mods/ambience/init.lua @@ -1,24 +1,29 @@ +-- global + ambience = {} -- settings + local SOUNDVOLUME = 1.0 local MUSICVOLUME = 0.6 +local MUSICINTERVAL = 60 * 20 local play_music = minetest.settings:get_bool("ambience_music") ~= false -local pplus = minetest.get_modpath("playerplus") local radius = 6 -local playing = {} +local playing = {} -- user settings, timers and current set playing local sound_sets = {} -- all the sounds and their settings local sound_set_order = {} -- needed because pairs loops randomly through tables local set_nodes = {} -- all the nodes needed for sets +-- translation + +local S = minetest.get_translator("ambience") -- add set to list -ambience.add_set = function(set_name, def) - if not set_name or not def then - return - end +function ambience.add_set(set_name, def) + + if not set_name or not def then return end sound_sets[set_name] = { frequency = def.frequency or 50, @@ -32,14 +37,10 @@ ambience.add_set = function(set_name, def) for i = 1, #sound_set_order do - if sound_set_order[i] == set_name then - can_add = false - end + if sound_set_order[i] == set_name then can_add = false end end - if can_add then - table.insert(sound_set_order, set_name) - end + if can_add then table.insert(sound_set_order, set_name) end -- add any missing nodes to the set_nodes table if def.nodes then @@ -50,27 +51,23 @@ ambience.add_set = function(set_name, def) for j = 1, #set_nodes do - if def.nodes[i] == set_nodes[j] then - can_add = false - end + if def.nodes[i] == set_nodes[j] then can_add = false end end - if can_add then - table.insert(set_nodes, can_add) - end + if can_add then table.insert(set_nodes, can_add) end end end end - -- return set from list using name -ambience.get_set = function(set_name) + +function ambience.get_set(set_name) return sound_sets[set_name] end - -- remove set from list -ambience.del_set = function(set_name) + +function ambience.del_set(set_name) sound_sets[set_name] = nil @@ -78,61 +75,79 @@ ambience.del_set = function(set_name) for i = 1, #sound_set_order do - if sound_set_order[i] == set_name then - can_del = i + if sound_set_order[i] == set_name then can_del = i end + end + + if can_del then table.remove(sound_set_order, can_del) end +end + +-- return node total belonging to a specific group: + +function ambience.group_total(ntab, ngrp) + + local tot = 0 + local def, grp + + for _,n in pairs(ntab) do + + def = minetest.registered_nodes[_] + grp = def and def.groups and def.groups[ngrp] + + if grp and grp > 0 then + tot = tot + n end end - if can_del then - table.remove(sound_set_order, can_del) - end + return tot end - -- setup table when player joins + minetest.register_on_joinplayer(function(player) + if player then - playing[player:get_player_name()] = {music = -1} + + local name = player:get_player_name() + local meta = player:get_meta() + + playing[name] = { + mvol = tonumber(meta:get_string("ambience.mvol")) or MUSICVOLUME, + svol = tonumber(meta:get_string("ambience.svol")) or SOUNDVOLUME, + timer = 0, + music = 0, + music_handler = nil + } end end) -- remove table when player leaves + minetest.register_on_leaveplayer(function(player) - if player then - playing[player:get_player_name()] = nil - end + + if player then playing[player:get_player_name()] = nil end end) - -- plays music and selects sound set -local get_ambience = function(player, tod, name) - -- play server or local music if music enabled and music not already playing - if play_music and MUSICVOLUME > 0 - and playing[name] and playing[name].music < 0 then +local function get_ambience(player, tod, name) - -- count backwards - playing[name].music = playing[name].music -1 + -- if enabled and not already playing, play local/server music on interval check + if play_music and playing[name] and playing[name].mvol > 0 then - -- play music every 20 minutes - if playing[name].music < -(60 * 20) then + -- increase music time interval + playing[name].music = playing[name].music + 1 - playing[name].music = minetest.sound_play("ambience_music", { + -- play music on interval check + if playing[name].music > MUSICINTERVAL and playing[name].music_handler == nil then + + playing[name].music_handler = minetest.sound_play("ambience_music", { to_player = name, - gain = MUSICVOLUME + gain = playing[name].mvol }) - -- reset music timer after 10 minutes - minetest.after(60 * 10, function(name) - - if playing[name] then - playing[name].music = -1 - end - end, name) + playing[name].music = 0 -- reset interval end - ---print("-- music count", playing[name].music) - +--print("-- music timer", playing[name].music .. "/" .. MUSICINTERVAL) end -- get foot and head level nodes at player position @@ -140,31 +155,33 @@ local get_ambience = function(player, tod, name) local prop = player:get_properties() local eyeh = prop.eye_height or 1.47 -- eye level with fallback - pos.y = pos.y + eyeh + pos.y = pos.y + eyeh -- head level - local nod_head = pplus and name and playerplus[name] - and playerplus[name].nod_head or minetest.get_node(pos).name + local nod_head = minetest.get_node(pos).name pos.y = (pos.y - eyeh) + 0.2 -- foot level - local nod_feet = pplus and name and playerplus[name] - and playerplus[name].nod_feet or minetest.get_node(pos).name + local nod_feet = minetest.get_node(pos).name pos.y = pos.y - 0.2 -- reset pos -- get all set nodes around player local ps, cn = minetest.find_nodes_in_area( - {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, - {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) - -- loop through sets in order and choose first that meets it's conditions + -- loop through sets in order and choose first that meets conditions set for n = 1, #sound_set_order do local set = sound_sets[ sound_set_order[n] ] if set and set.sound_check then - -- pass settings to function for condition check + -- get biome data + local bdata = minetest.get_biome_data(pos) + local biome = bdata and minetest.get_biome_name(bdata.biome) or "" + + -- pass settings to set function for condition check local set_name, gain = set.sound_check({ player = player, pos = pos, @@ -172,167 +189,178 @@ local get_ambience = function(player, tod, name) totals = cn, positions = ps, head_node = nod_head, - feet_node = nod_feet + feet_node = nod_feet, + biome = biome }) -- if conditions met return set name and gain value - if set_name then - return set_name, gain - end + if set_name then return set_name, gain end end end - return nil, nil -- ADDED + return nil, nil end +-- players routine local timer = 0 local random = math.random --- players routine minetest.register_globalstep(function(dtime) - -- one second timer - timer = timer + dtime - if timer < 1 then return end - timer = 0 + local players = minetest.get_connected_players() + local pname - local player_name, number, chance, ambience, handler, ok + -- reduce sound timer for each player and stop/reset when needed + for _, player in pairs(players) do + + pname = player:get_player_name() + + if playing[pname] and playing[pname].timer > 0 then + + playing[pname].timer = playing[pname].timer - dtime + + if playing[pname].timer <= 0 then + + if playing[pname].handler then + minetest.sound_stop(playing[pname].handler) + end + + playing[pname].set = nil + playing[pname].gain = nil + playing[pname].handler = nil + end + end + end + + -- one second timer + timer = timer + dtime ; if timer < 1 then return end ; timer = 0 + + local number, chance, ambience, handler, ok local tod = minetest.get_timeofday() -- loop through players - for _, player in pairs(minetest.get_connected_players()) do + for _, player in pairs(players) do - player_name = player:get_player_name() + pname = player:get_player_name() ---local t1 = os.clock() + local set_name, MORE_GAIN = get_ambience(player, tod, pname) - local set_name, MORE_GAIN = get_ambience(player, tod, player_name) - ---print(string.format("elapsed time: %.4f\n", os.clock() - t1)) - - ok = playing[player_name] -- everything starts off ok if player found + ok = playing[pname] -- everything starts off ok if player found -- are we playing something already? - if ok and playing[player_name].handler then + if ok and playing[pname].handler then -- stop current sound if another set active or gain changed - if playing[player_name].set ~= set_name - or playing[player_name].gain ~= MORE_GAIN then + if playing[pname].set ~= set_name + or playing[pname].gain ~= MORE_GAIN then ---print ("-- change stop", set_name, playing[player_name].handler) +--print ("-- change stop", set_name, playing[pname].handler) - minetest.sound_stop(playing[player_name].handler) + minetest.sound_stop(playing[pname].handler) - playing[player_name].set = nil - playing[player_name].gain = nil - playing[player_name].handler = nil + playing[pname].set = nil + playing[pname].gain = nil + playing[pname].handler = nil + playing[pname].timer = 0 else ok = false -- sound set still playing, skip new sound end end -- set random chance - chance = random(1, 1000) + chance = random(1000) -- if chance is lower than set frequency then select set if ok and set_name and chance < sound_sets[set_name].frequency then - -- choose random sound from set - number = random(#sound_sets[set_name].sounds) - ambience = sound_sets[set_name].sounds[number] + number = random(#sound_sets[set_name].sounds) -- choose random sound from set + ambience = sound_sets[set_name].sounds[number] -- grab sound information -- play sound handler = minetest.sound_play(ambience.name, { - to_player = player_name, - gain = ((ambience.gain or 0.3) + (MORE_GAIN or 0)) * SOUNDVOLUME, + to_player = pname, + gain = ((ambience.gain or 0.3) + (MORE_GAIN or 0)) * playing[pname].svol, pitch = ambience.pitch or 1.0 }, ambience.ephemeral) --print ("playing... " .. ambience.name .. " (" .. chance .. " < " -- .. sound_sets[set_name].frequency .. ") @ ", MORE_GAIN, handler) - -- only continue if sound playing returns handler if handler then ---print("-- current handler", handler) - - -- set what player is currently listening to - playing[player_name].set = set_name - playing[player_name].gain = MORE_GAIN - playing[player_name].handler = handler - - -- set timer to stop sound - minetest.after(ambience.length, function(handler, player_name) - ---print("-- timed stop", set_name, handler) - if handler then - minetest.sound_stop(handler) - end - - -- reset variables if handlers match - if playing[player_name] - and playing[player_name].handler == handler then - ---print("-- timed reset", handler, player_name) - - playing[player_name].set = nil - playing[player_name].gain = nil - playing[player_name].handler = nil - end - end, handler, player_name) + -- set what player is currently listening to if handler found + playing[pname].set = set_name + playing[pname].gain = MORE_GAIN + playing[pname].handler = handler + playing[pname].timer = ambience.length end end end end) - -- sound volume command + minetest.register_chatcommand("svol", { - params = "", - description = "set sound volume (0.1 to 1.0)", - privs = {server = true}, + params = S(""), + description = S("set sound volume (0.1 to 1.0)"), + privs = {}, func = function(name, param) - SOUNDVOLUME = tonumber(param) or SOUNDVOLUME + local svol = tonumber(param) or playing[name].svol - if SOUNDVOLUME < 0.1 then SOUNDVOLUME = 0.1 end - if SOUNDVOLUME > 1.0 then SOUNDVOLUME = 1.0 end + if svol < 0.1 then svol = 0.1 end + if svol > 1.0 then svol = 1.0 end - return true, "Sound volume set to " .. SOUNDVOLUME + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + + meta:set_string("ambience.svol", svol) + + playing[name].svol = svol + + return true, S("Sound volume set to @1", svol) end }) - -- music volume command (0 stops music) + minetest.register_chatcommand("mvol", { - params = "", - description = "set music volume (0.1 to 1.0, 0 to stop music)", - privs = {server = true}, + params = S(""), + description = S("set music volume (0.1 to 1.0, 0 to stop music)"), + privs = {}, func = function(name, param) - MUSICVOLUME = tonumber(param) or MUSICVOLUME + local mvol = tonumber(param) or playing[name].mvol - -- ability to stop music by setting volume to 0 - if MUSICVOLUME == 0 and playing[name].music - and playing[name].music >= 0 then + -- stop music currently playing by setting volume to 0 + if mvol == 0 and playing[name].music_handler then - minetest.sound_stop(playing[name].music) + minetest.sound_stop(playing[name].music_handler) - playing[name].music = -1 + playing[name].music_handler = nil + + minetest.chat_send_player(name, S("Music stopped!")) end - if MUSICVOLUME < 0 then MUSICVOLUME = 0 end - if MUSICVOLUME > 1.0 then MUSICVOLUME = 1.0 end + if mvol < 0 then mvol = 0 end + if mvol > 1.0 then mvol = 1.0 end - return true, "Music volume set to " .. MUSICVOLUME + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + + meta:set_string("ambience.mvol", mvol) + + playing[name].mvol = mvol + + return true, S("Music volume set to @1", mvol) end }) - -- load default sound sets + dofile(minetest.get_modpath("ambience") .. "/soundsets.lua") diff --git a/mods/ambience/sounds/SoundLicenses.txt b/mods/ambience/license.txt similarity index 57% rename from mods/ambience/sounds/SoundLicenses.txt rename to mods/ambience/license.txt index d1da1eab..9bab5bc5 100644 --- a/mods/ambience/sounds/SoundLicenses.txt +++ b/mods/ambience/license.txt @@ -1,105 +1,88 @@ - ------------Sound Lic: ---Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html ---Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html - ---Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html - ---Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html ---Bats In Cave Sound, License: Attr-Noncommercial 3.0 | Recorded by Mike Koenig , http://soundbible.com/1939-Bats-In-Cave.html - ---Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html - - --- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html - ---HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ - ---drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 - ---best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird, http://soundbible.com/1515-Best-Cardinal-Bird.html - ---birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/ (end) - ---robin2: Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/ (end) - ---Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ - ---bluejay.wav, Creative Commons 0 License, UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ - ---scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ - ---Underwater Pool - Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/1660-Underwater-Pool.html - ---dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ - ---dolphins - Attribution Noncommercial License, acclivity, http://www.freesound.org/people/acclivity/sounds/13691/ - -ComboWind uses: ---wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ ---drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ - ---Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html - ---small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ - ---Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ - ---water_swimming_splashing*, Attribution Noncommercial License, Robinhood76, http://www.freesound.org/people/Robinhood76/sounds/79657/ - ---earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 - ---fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ - ---seagull, Attribution Noncommercial License., hazure, http://www.freesound.org/people/hazure/sounds/23707/, - -desert: -coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ -http://www.freesound.org/people/Proxima4/sounds/104319/ -Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ -Rattlesnake Rattle, Public Domain, fws.gov, http://soundbible.com/237-Rattlesnake-Rattle.html - -flying: -crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ - -----------------Not used yet: -desert: -Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ - - 313hummer (Jordan Craige) ---echos http://soundcloud.com/jordan-craige/echos-1 -Creative Commons Attribution license (reuse allowed) Attribution 3.0 Unported (CC BY 3.0) -Not Used:--FoamOfTheSea http://soundcloud.com/jordan-craige/foam-of-the-sea - -xi-intersection: -http://soundcloud.com/xi-intersection/mass-effect-uncharted-worlds Creative Commons License ---not used: -http://soundcloud.com/xi-intersection/donkey-kong-country-2-flight -http://soundcloud.com/kogyo/kogyo-skalar-m1 - -lava: -http://www.freesound.org/people/Halion/sounds/17785/ (almost as good cc) (combine with rocks falling?) -http://www.freesound.org/people/pushtobreak/sounds/17823/ (attrib non cc really good) -http://www.freesound.org/people/klankbeeld/sounds/123970/ (horror rhythm) -Rockfall in mine.wav http://www.freesound.org/people/Benboncan/sounds/60085/ - - -http://www.freesound.org/people/snotch/sounds/96175/ (mud volcano) - ---natural night sounds in Boquete.wav, Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/15851/ -http://www.freesound.org/people/Dynamicell/sounds/17553/ -http://www.freesound.org/people/juskiddink/sounds/78955/ aspen tree in wind -http://www.freesound.org/people/Benboncan/sounds/69761/ wind in hedge birds animals - - -ButterflyTea: -Creative Commons : Attribution-Noncommercial-Share Alike 3.0 -http://www.jamendo.com/en/track/904012/dance-of-magical-flowers -http://www.jamendo.com/en/track/904013/magic-of-the-seventh-world -http://www.jamendo.com/en/track/904016/in-search-of-the-soul - -http://www.freesfx.co.uk/soundeffects/forests-jungles/ - -zero-project +The MIT License (MIT) -icecrack.ogg by figowitz (http://freesound.org/people/Figowitz/sounds/67881/) +Copyright (c) 2022 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Sound licenses: + +--Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html + +--Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html + +--Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html + +--Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html + +--Bats In Cave Sound, License: CC0 | Recorded by SaloSensei , https://freesound.org/people/SaloSensei/sounds/616219/ + +--Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html + +-- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html + +--HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ + +--drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 + +--best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird, http://soundbible.com/1515-Best-Cardinal-Bird.html + +--birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/ (end) + +--robin2: Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/ (end) + +--Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ + +--bluejay.wav, Creative Commons 0 License, UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ + +--scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ + +--dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ + +ComboWind uses: +--wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ +--drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ + +--Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html + +--small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ + +--Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ + +--earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 + +--fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ + +--seagull, Attribution 3.0 License., hazure, http://www.freesound.org/people/hazure/sounds/23707/, + +desert: +coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ +http://www.freesound.org/people/Proxima4/sounds/104319/ +Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ +Rattlesnake Rattle, Public Domain, fws.gov, http://soundbible.com/237-Rattlesnake-Rattle.html + +flying: +crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ + +desert wind: +Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ + +http://www.freesfx.co.uk/soundeffects/forests-jungles/ + +icecrack.ogg by ecfike, Creative Commons 0 license (https://freesound.org/people/ecfike/sounds/177212/) diff --git a/mods/ambience/locale/ambience.eo.tr b/mods/ambience/locale/ambience.eo.tr new file mode 100644 index 00000000..7bf35f45 --- /dev/null +++ b/mods/ambience/locale/ambience.eo.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=agordi sonlaÅ­tecon (0.1 Äis 1.0) +Sound volume set to @1=SonlaÅ­teco agordita al @1 += +set music volume (0.1 to 1.0, 0 to stop music)=agordi muziklaÅ­tecon (0.1 Äis 1.0; malÅalti muzikon per 0) +Music volume set to @1=MuziklaÅ­teco agordita al @1 diff --git a/mods/ambience/locale/ambience.es.tr b/mods/ambience/locale/ambience.es.tr new file mode 100644 index 00000000..d31fc473 --- /dev/null +++ b/mods/ambience/locale/ambience.es.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=establecer volumen de sonido (0.1 a 1.0) +Sound volume set to @1=Volumen de sonido establecido a @1 += +set music volume (0.1 to 1.0, 0 to stop music)=establecer volumen de música (0.1 a 1.0, 0 para detener la música) +Music volume set to @1=Volumen de música establecido a @1 diff --git a/mods/ambience/locale/ambience.pl.tr b/mods/ambience/locale/ambience.pl.tr new file mode 100644 index 00000000..28674e0d --- /dev/null +++ b/mods/ambience/locale/ambience.pl.tr @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)=ustaw gÅ‚oÅ›ność dźwiÄ™ku (0.1 do 1.0) +Sound volume set to @1=GÅ‚oÅ›ność dźwiÄ™ku ustawiona na @1 += +set music volume (0.1 to 1.0, 0 to stop music)=ustaw gÅ‚oÅ›ność muzyki (0.1 do 1.0, 0 aby zatrzymać muzykÄ™) +Music volume set to @1=GÅ‚oÅ›ność muzyki ustawiona na @1 diff --git a/mods/ambience/locale/template.txt b/mods/ambience/locale/template.txt new file mode 100644 index 00000000..5016ce50 --- /dev/null +++ b/mods/ambience/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: ambience += +set sound volume (0.1 to 1.0)= +Sound volume set to @1= += +set music volume (0.1 to 1.0, 0 to stop music)= +Music volume set to @1= diff --git a/mods/ambience/mod.conf b/mods/ambience/mod.conf index de39c528..43c57ea1 100644 --- a/mods/ambience/mod.conf +++ b/mods/ambience/mod.conf @@ -1,4 +1,4 @@ name = ambience -depends = default -optional_depends = fire, playerplus description = Adds realistic sound effects into your world. +optional_depends = default, mcl_core, mclx_core +min_minetest_version = 5.0 diff --git a/mods/ambience/screenshot.jpg b/mods/ambience/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..574e2994f7e0639ba2616f9539bef8ee9074e392 GIT binary patch literal 98108 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�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°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 Y(wC?;aklqAz{2J=N?=1_@Bh~S59~vof&c&j literal 0 HcmV?d00001 diff --git a/mods/ambience/screenshot.png b/mods/ambience/screenshot.png deleted file mode 100644 index f1df0c9ef0e7ce9d8f6dc690944412e35a3b0b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51812 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

) 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 diff --git a/mods/ambience/sounds/bats.ogg b/mods/ambience/sounds/bats.ogg new file mode 100644 index 0000000000000000000000000000000000000000..27780b27cc63719cbe669ec5fcccafa9141ad071 GIT binary patch literal 37896 zcmd43XH-;8uqe7`$Qj9*AxM@WIZ2e9B(U zf&vnJo9{d4-SgHv_uh5a`}6kd>D}E`UAw!wx^{Kf?$LhwR1bgx|8Wi0S@qu~sW%~u z5C(|9r?;)M&s_mT5qWn50Qkp$?=2ARyPE&^bypJt<}S=%QxK*6{jb+Uw14RkfM5+9 ze@9_)UO@p~0e=3w$1;LH2M;?>dk1f65NHPig#_<_FgIu0f9vUhD2k8u6m(T}^i{RB zq;(zaJiYB5>|vfBu!sB)1s?DVg8}C30efuk?BnUdOMv^|qKNz#6bQz@v>D|U48dkY z04h6uPNfXpDYaMBJ}Cl98MaAkuZp86++&4*Wm(^ZFUWM~zk{VXAo|e3daN3+MC%uoZu8Z6^@R9OO zuqc9v$pnMDc6P}U)70YvAWw*27f`*1Mnxl`z(W8)&*zBW;D~1tPqI^`_y+|XRbl|> z@*-1BBpa$@RiENfpH_Tg5IQSjVDQ_|V*W0`gzU-hsLHC8W)#!FdhqS3un9~s02s(} zC5|3qwEtueV9OyM%ZAzs@rjRg6nEn4+wt{cp50OP;M&>A_8Avv&+_RP+s*cQ?d>Sw z1mb1;kVHCi{+r7Ev?J$QaaYzaUK;sKi3-HaMD57Ah|Gay6sQt$7v4TF#k{?v>dre0 zrpCoVlz*ZM%2FRMtvkwvzjsVM$#w}MaDoWJdgQe*At8(W2+jDFHV2UEsRbhJhA5kn*G?ncjXK8i> zE>}6C@b$xCo`%tfBX`k$ZNs?40skjr1^g-$iMnRvtg&6yhuv&f!YNbds>V4r&SG$s zIsf4w92_2OYWoB^r8~;8OeNXg!<=RL(0|wo0`DYWYRE@X+4p~h0Us&l6h&1qpfpBi zG_=VLW>YQ9<{XxPyW3FuFQ5CZp8IXizqBz)bNGLRf4dI$1WqiE{clH#sq97tcJq^U zmsrE zO_d~8)ii`^?zTyxqf5!t;EFQnKPa+yD0de}<_2fU24~@hcp-~gp@V5*iAyy{R{ef! z_5UvL{v+TC05F+IHA#i2LJ&0 zS$lPPlzoI$Q}opv^)(yy)yWOC4gPnRu;#RoCdkY~OZo!h-(Df^Ax_Q} zU}I{uWI|6&S`ok`kIa2oi0{23zeya)05a_!pa}N7A2vYjGbpZHo=hUXTjrZWvrAVT zultm(|0y+lrlDsb{aN2Y&%k|A-@qhIYC=eQTHjzo z$Y2)Cg1RH^vB9kSw4dLSufcMf`_j3E8HN871NUWpizQKm`QH|cze7#t{Oo>88T`_i z_LH9Wb(r;YH}kWwIM>ii)0|IrnD%pDN_DUZa9BJSp7ynvHgH(b9@NvXO(4s38b7n}4}J=Vy~4rELIGwwMsIF!HmoGP0PT z6P`}Fqr9kZVd4)`wlJFWn-IFAyd+{_ly*niD9vx#7esb2xiB#L?PoHdx<2Q=E^0A< zZea5JB?!Hv{K3zH>XE^(P(A;b>%I=F^DkFTJS@c0KKq5*q`I#gJD7-vtsAE;pQk#2 zq>SAcsSHghqOC4+wtt6i2Krf0do1scwjSXR93ifTr)S;mGD4S49IXQ4*Qq2rk2lLJ zYO<=i@k@E|IuG~z8?HL)0$)2kcsjl4 zMqKxY1@=3hH2H;C1>*Le`ubS}Ia&<-_Ve9T77H5&hZb@-w4}qb1x(yfxEKU@$NH+! z-lUMjB#q;B$+y-*r`BqOb4j^#uCr<8)65d*ih9n>Y98lIXVYBA%*@h^5~s{+*US>+ z>k`h95|`n6=gj(p)_V7k)ox3L&i`cHGD~kf7AMCXvOiIdwa-CgrK~n!9S62q* zx&-GsRpfG1RJc@BR8>^)n1RsDZ{;QIufdX%s>}+mk&=op_0APdZWR^oA1e<2)VuGu zf-P~cD0z@o;c`d0o@c3*4{X&P<;>lT60jL=nHAh-xuuzRly_d0fW&#SN-Boab~7qK z%6qSJUH_r%@}Xi8(t>Rj$e{j_bw(4lO+Ox6(xqp}a@u%8rzm>nO z-tDRa`KOh8snv7;;nMF=MNkCwgx#0Gc>;>yZwIjGvyi))fq|Kb=4_J#D1x9$wGq-> z1ZUBl<}AwHB+cEX$zdHtZgw#H?Khw5XEh(XIq$H%(^`KxQeSmdQTeCo$5oHle)Taf z08n`W05*RCJ{e6t2@nfvg*cly0qnQBs@F;H(UtJ0@&3Of zmH!#wzpYXJzasVD*7!dn|NjHz)c-lF{=f7O7f5*R1tbLjr(~*tLKgQ#jk7;Hl2~Ae z%5GAXgVT0Yyq^vf#cjGMVqND4&BLIKB4%{mGkkPS-+)Mhy9flC*_e2YuI`(XyU7WfAaJ_0eBJRV zxp=vE1aiYq1PSCd#6M@)YPkrK>m`U2=lGIPyT~nCKEwmHHw=Jvp%YWVI4h>5L7v#%US z(ProC>F>erEGqyXSOce3KETYJSy|iCH8{Dj_U#xn5y6WBxBvjLNATF#9WEYT{)a*$ zViHn!_UJzs91j2IE(^wR_`gd$c-22ez}*t>4)I=vx^+4WvnLfTJvA*gJwqTF1tk?d zv%k9sB^4zlJp&^>!!r+m4_8VGatc}|W?w%i3Tg@pDoP4^1}Z9QY8ECYT1HxW7y~sO zv!|6A1vwQ3B_j;R=;uaBLqSPR1`=TLprfayqNAo_fYCEE`_R+T($Ub+F~DG~tbu+M z%uGx#ykX2RrkB28Ap;!^HH?uZgp!huj?Rx9p??HFfM#EbQ#MhD`Tffkz^&gYN&#Gu8j(5A_@a5?B4NJ=+&l)k3U zc1&sYx6acl`wF)62_u>SkL7mf-FM$Fq#u;ZEOw)r?UlNF0%G6lTt|sY;_3*W{~13R z+#g95tRaHeNa`!}hmyaL$vh#IeuQ_rEG{8StEk2Vp3{-0dkQ$8iMs5i>=#Z38tM&!s(wl#@Y1kXk z0fcdnx{D?MFpZAa6DBqvCf+Ac9;W@`_6u+PaAJ~eib>=hiT4v7-s~RbsWH)*#j-g` z(0Roc%8=RzO=_9t8@l=v|Dwb740VXR8ks&Dlt4`ldEYuVrn!pBd1~7~50ocINuR{c zgwg?SEBQs$2gv0j>OYN+F&s4xYL}Sfkb(`bJe;f0Cx5PgM*Z#s^qSlmQ6Y3Q@p}%n zqxP!XeW96lIWfUb^I9JWqVa6#+wx@yP-dixT&SIGWdO&qIfUwmm93H_r2&wcuBn}S9{-Z@@1q7ZvxyHCWTTu?FXj53oVg6J?rY)% zRh{7vFx9DE5RA54wh^y|D7W$SpBDG_iF+_(CDM=J+HpKML|=G%9n27Y+8-;7(M<3TlMmvxOOTtM%J(;P`9y}RA@3(!EpNCg zau8~|BV=p(vG^yT$dq~B3G@}^G%+0!tQD*dP4kurt=Mn3Ie<(u#$Rb}>3A8Y_D&-9i>R|M*#(+7qX zD9jQICftJnlp2M@@>(edF~sZT`QhX4#TUh2MpGe(!6pQq*S!eHj}vFlf`ps+i6PlR z--p~<8RWZY$bNqf>3m~V;DK8U>2~=lUl!H}q3ETh(=SKd7NGoKQf)_uza;Yk1hVrd z&`PvhS3i%eW+z_;I-eK=$U(Ury5mYf2!1UiX*F=b;DK2Zc~x%UDlS3dbIYv!(w)`6DUB3$z`RQ{OK#IlLArA%LEH`OLx8vArJOm>60 z{M;=3*&~eA{3gesndPo$^19*6VSjEVY@~D&Do;>jE`GkXl3plNmKsczIYF|BQwt(& zYM52EMIUyyp8>pv4zS)m*u0Rq)ep-0#fB6A97+V_#tQR|U0r;#nrV?TA^9+g>+%Hl z5Wjx1vkrCj+QOBeC|2C+haetDHkON%-)|C(@v*cl?T`MV%A&|~!e;tn^1YU-;V)aA zFaB2ky}h{#h=Bski?o+-`#=0KS-lVVNVds{qYYFs8bQ`XDSV?>8pnLz$8vns z0@n2Dtgmpbi(FWP@82_ItDv)9`LafI7BzTXsiAXQ^VQ=S%P!(OOIXhPci~Q6(~!ae zV-^!kse63iOkGvGB*n{=_lNK0Oaw-jT7|e@wSMD%lS}rVQhI&xKBAOe!8s#Z>DLp5 z-;mt0R8UXNMgC3v7(7k_d96s)4_}WIeCmi8UVS$}9#{v-w2J-`mpO)0?i63!XHn$h zw5*Z>tsLBWcA|&8!j$!p#t*0*zn#r=o}|r(z++It=RQU9h7T|(KtUgyYj9&PsO~m^ z-Aia0y1+>*6RzpMiY0pSS^YR8kz)X&3+)}O!Y+!bIHVu)>w@`+o1!C6dLoMzGW^~~ zXBKn>LL!{6IEhb{{4r3|gx;ivEL80TY$soyFsy5xJ_!AJZ9F@Yk&l8ZqSRSrz8OP^ z;dOBi7H_OD0F;I(9fJ-QsqC@lOlX31xvbi`y2^I|p+!k8LIqI-_611xx1-2s+tE?4 zaF7~$_Gr|s@GP6la`LF$Hrfnj8gOp(2Z|pv;zKeUX-Ybo6w>EzXIik38uf#;A!)V1 zb-+qBd7qRX)jR4jjzcn@19YVRCmk9o!XP;)hb%rt{<{UI?^Cc1WzKIS+b@O${-7X8 z^Kv?@nU~kOa<&xK@M9rMtOdzmgw3y~13!Gs;d0Wa;m_pI)XqAuj?6pmuV5y&OBiB~ zzNa#J*t<15#V&IahwIgNE$Ml-;kkBfBwLyjCse%)mBO^l6njQ=;4rB`LaGD*GM{Uf zo6>0Ozlc0=;ld&`JMTkH>Wv(M`-JK*hac^vahY9xXqnZYOAS43CJz`HF437 zcf#jr+sV3t=Ypfrhkj3P|I?7|ubi^bve~!^ACjEJ5L(Kee@9wrXcy+2Td17+nns zv$Y{7!odG^?@~gbU;zbzq5xKXHq+8Pt-#;q-j_JLPQkauMS~+B<{TC0t~H4#*W4l# z@8w{T>X5+Eks4E51ccE*7ImDFKc)?l!;$-v90aLBx^cP21nY)Q21Hcq&BV?P`45!8 z)d#JF!(4)}Zgg0YSewESdafD+Us(+$kUFZL&?E_pBRUaV@xavQ-y!+D55ARPptLlyv980YATwVQd*!J1OWw;bY{UeD52`^Q#hT}5R{@Bi zVSM?z?d8~jCAL`@`kbAbW}6(Ed)72c)G?!b(yNrEjEJBwPq8mzSgp#Oy`u&F7r=L zRw0*OKz2E?tnvx}i*87SBaq^yPd*PI4CkD1OP+=HqQ!_P5G1gQ*|q9m_U&FjD76h-!=sYpOWS`0Xmm7YhCd` z7sZZvS5PE2J5q-+W)~vG=OHVbhu(W6TXr;}zSmCfMgrya&Nbcsal|!m@if@QB98@B6VI1W5 zMY0*Xn?;%QFX}Nxx4AMOWfh(j;39R8dSA6^SVps~r@H-QC+J+~YVll~GO$Rq0z z?t2Pka^(Ez4V>8S)@#3X(cj>SlxxVh*?#nsxaP@@bA*h-G495J@UPE8n_QeJcshek zn#xDPpT%VZTkB&5EBmfSQhfX|ymZ};3Y0kWi`LOS`0_-LG{0ExYPK?j8W;5|3)q+S z8#;$K#VE`X+dh)WZ8;?Rvs|@SN#3#Sw&0<|t+7_I@uTFTTv423w^+URiKpg^?D@x& z{>AnKn+y>6tmzU<|5PP0_t}cH7am*sGTk?gFRljpgx5`GJjE>p*)j0Hm|e-l>eat1S;b{m;gRx-{kMz@i z@%SuZKQ7I3(rLa08cJj07xGgyzprX1(H{Tywt=xA1Bj|kvJ;6lh^_$VMhmeBuipDj zQ|>m5fl_nyHhmb;V*l`M_ILYHYDXcmU#dWxhPKj+E@gbkHKoKmrKMQQ$w}z{IhJ5+POia|p>Duec&k+786t!^kuySUt)i#OX zTm9#rvkvt6J!^Jh{k*@=Z`R|MGR3OiK~`?yj2|mI4jq#mV@==ikjy>Z#-qAey(u}C zB1ThUjQQ&L(Hlm->iumXFcTB6U+>0mJMe8zXfB^(!$I0KRasn$({fT-D8aNe3 zD@8`1zZ$7?=*-cxAI>vWogaYa%yI71hJ|6TK(y(GknbDpBjS>OHlcv4OvxXl3$f&9 zS4z0gWPya*^YH{eAn8v|jJR%nNlWsQ3ViUSjY#Q|pY_8u8~B#>JX9RQu6|cYKTHe# zILvxdmg%VmzP=|Mm>Jvh!!f$*iS>`yHdfAWi&@P|7oMYrL9?X``sz}n`yr2xO!V#Z~Q$S*R$Sq^RL!BGQ`(e zV{OZO3C0hdE8=X_j+RhMf!R=xmW#?%*CQOn%G>fH{fA<@_FF9V>;i9c_Khq*@P}@W z>z@m=uwkM4tr~|RnvZtg1iN9vfO8(5&AG~JCZ$!=7v^7vEY169F_J)@(;ip<2;`Dk zG&(=L$3iU3&l^{UZrGQ!xuf5i4p)iYc|^RQE}CLnUvjK2H^g3wr1#~+mFDn+zmxkL z9a|l}7&U`dKexXV=wQ7VWN-^)hf~xb7$A>j*Hm*oJjh>A{GcfEviZg+rbU1pMGNwh z)xn0L-@ny!ixSpf{wV(O9nbqela&zU=#AJGyhIj$kX8SlZxQnO^xM8v2k-4;)RQn! z`^_7SV4;1?hXXX|2cNqnB@Lb)(x;4$D<*& zY8?4%FbH9Z0cf%uC%AdNyM_)1+CLu0{2)c?^F2&(m3?Ji;LEty`S=&LaldAH1wAW( zGUfBHwU!l|z0d9g$k^@t+9@ZLoOOpH?e|$ZglqMAs}SNBhTR>1d=<03)I@6*PR3PdFng&VHF9Itut<&+o9(Q_o@LFZ%^+06AJ^Nw&6$A%@+ae`+Ks!9f(UlY{Oa$t-pA?2>CC zwT<7yU1Px^uA#i4#c_v#Ak$*~5?l}j{3Li)2XC~PbiMG;+>OK}LXH-3m~xFky`~ye zCL^lTZ4YYY^2$1;Td|Q^NBC)_Zg^dC65*Z|t&!{zP+yFz7l*P~NK;WdDQlhIVgMF3 zkl%@kP{jN8A|>Jh9hnLT(w3z2XE!sc2Gl%%@7|1)TwA$(v;+M-DhjA_GRg-Q**CeJ;cm)td|oloy9TD z0+*)|eCK2Cvd8AwtM!4z2Ae_7C3Je`Cz)b7KWLA02Tp{HI#vXOvlE{1Yb?}u{Y;u7 z3c9Ac%KbW5w8ti$%~SlCD0|5NdB@T{yV|duSip_d8R6RCO>@VRpHh3XiL-pldnroq z`Jl9%*x)tl;jJb|eU6^Py*~7hCJi4>ouXt~gNkQEvT0k*T-e5?-$K*GmOVv|e7#aS zE`w>>wP0N2j}rQh6}QR6Z>~Ot?0M;VjMP9KpVmmr%$f>aB5@m1<#d2TOB2L*M_d$& zl2ldPO|++RH(5+9lG5Xu@}Bxh>imd6+BGe^vwHL5 zsVxM#CN0I4Y~5CF(VGZM+gO=RTs?EA|IHTjs9;GL5A@XphIs#isZ=S_PA0jdbwlP1ezk@>jI~C>&N~ zXImh!2M?Dg$h$u2MT-=U=f-o+tz}WD)@i{dC z%t!$e@eTehqi08CvJLyLDt&}Hqb`sXp1l;7FKyu#l+y4|5d5)BVb|EdosSwe#ybg- z6IiIVoCm2y6w)NPkU@is6*Q-Ly`a7BgU_ii-cFqFF#)IrdY*>C%KbxvAEHq&u4u~` znyMOL0W`r9?PYOYFL+$APzyl^I;d(p+LLc#kA9=^4M=gLSWhc zXNO)N8kg^HP6dvKVo8l%i1OUqItt{bv>AHFiiZhXMfoAM83e1ga3D+>tJHit$*AKiRAPlYatO% z0?s6&t119nijygSygMHYZIT;lnzf}S(8Vy?v}YdZ$@4{(KhZ}_)RXrqHfl{8DxTks z+12yN9baIKuk{NeYw-yipL1LuCThXt`6j&BW?Ti5zjn5&qV?RYea_?dJC0p#)+`Nj z#^l3r@P;$@(0( zelTB`5tnCmWWOr4SO`h6?LX3ql=><6PIGcZ7h6+=NPhJ%zYNj6=Fj)n8xse5#&MFI za*h<*M(~=6Gt3!B>yy0rd5)to>usmTJ}BROxw2>Zvp{$7j(!XA&_E#g0kw#Brbkrm zS#ZG9pL2Bwo_Mt-#SQAYX3nG@7zMAsbYnQVe2;JQ(4&j|_3PUy=F?D*d>r%l$}Oxo zfy&=D3>n_(o*0La2^W73o%pl`K^mu>%i{ASG>b8M1ipC`;(Y(2ZT_19((>Rt2Q)Um z*S6CQMn@kn_oySD4*3jetgMh`8+BcxJJ9EtSrRr_XehZL@8@sVM*|=&cTJKMYLBL- zmJ)jj;SGO1vK^;V-_|iCbOMO4WfFtx%nxx=3&-M|Ul_7Q;7us^*+UG)lrWRT+Ra6C zn?=LTp7Xy?34#o*7lG1tL5w>d@pq`M5lkvW#>Be{&*ZL{C*!mS!WTv z8LhQa56hSsd|MqmHr^99`oSo6`!s+CH6x7=NM-)j%005-X`LFtI(*sM^LO?8TO%Um z%BvD6-5XBQlHn=0^f%m*N1azPd7-S&-)&MNXLP^naZzu0xR;Gg;pzUEFM2Q4Ce=5- zzDo7Q8_2|Nw*LNw4Bb7UK%)|N?``^R&9C-7Oe!CV7B#ZTFQT~I-)F)< zhw4rF+PjyDil~uRwPmen7E5SHv)2og-|LMNh6euB3=3EgPonKybkxE2T~gLr+>weE@8CgOL; zm9dC~`O6mrYo0UB*=Ymk_t+B>o=e{TL|x4U-zqrQ?mdhVS52mWFZQ6RuI4c2PtVRX z1VZIOnT-H19Dl0rK7FN;$bNazmrM5j)t``DY=UG$0BOr-&Uc?UIu!qNU%39A@Ko4?@VIZ2O<0m&3oEmw-9m&dL{io!EIHX!ZXfH(8*~SK^ME6f`^{&pIk5gP>NVnMwH-+r{KzZFdTu*o0@m2mBsS?g)qaQ0BC9hZ**|nAJI7;3{ zR$436^Vzey$6J55<)_bk4i4EBm3EHy<&EF0nRQdm9?ud!&S*Llq{DF;hM?)6d_$#Y zDOjEHQ#^vin^GD8uK{fXKJ_8p%#bE9zCI+sUyWG13^T z8<+O0q-B5;()lnb>4Atew?_z%3b;NL@C34%#zh<|juEAD8wW!xA4J<)$}`nsxNwl8 zCJ!BUrP+b2>K7{Lu369GZ~8n;Ev|P?OST05%E9oAbx7paG9-NvDnKRF(^w zaR0D_t7A+w^M?kue-fW?q}`0%=Pte65ib67P4jxljiUyovF8IEAHe%YwP_oD<`Pq_ zG>MA^Vysx2^O2O9EjOWrCv!WHYL&xRp=@Z|P#b=pH^MF5w_ObLk`2q`uM2+vu$DAT zS*KoGO3!;ILfU_fr7VDZ=HLA}I{EL-2TC?zM~=WN{<%iI<>ZZUv%0&(6T|tM`r0WP zuP@V2040M7cqcd;k#$%=kxw9!1auaJT6(Y6M?Cn&*yML@Y>Yn>?xm59Bks0!rg+;h zG|OHheyL3xd>dqgVqZo(_tJKdgoMmh1Rwn3OSYkspmidBYb@aE7-4nO{7ATRgLIp2 zy1p;wTv~BJIceQWPAh?^ znborFsj*g!nXdP#%*P_gY58s*NBHe>t1xx`{dc!`ukmr~zC{W?Q%f%&Dz+4m?6hy&pE&>hw2JtRxVx|QSw?fxi+NxD zo%)DM`!z;rKcvBNY{Rn{jx+d&G-;hwhFLNlzy?smH#BJ0SY@x~6gTzo7o8C<3pum? z9XF1@hZ<5qjTrHRa~n-b2`Wl_P4+iNtSa0yHmi(q+Ps6iC>S#{{bt1@uDO^9Rm}o5 zCw|?>^JWxS58_soD6`fefxBLQ9N#Y?9WQ%n6vT5yniHo)TlCpUD3d*SK43U+`zm|8 zRXEj$jrB17th&mK09=#xuV#5V@C31)GtAEQ7N*rxjIBJbjBcbK%~Y5u?xnb4%hV{s zQ({m69mr|lZu~rko9|-}U$S@>(^8SKjeo)(7R9$TE!McQDsqCfuK5y5s9!J%redsC=S&+%~EzOAK)d9j{l%6!JEe2Eu@od?+zwARs+#43Q z05EURx=gES|nJ_HoOrQAKqhZ{1HqjB2jRcMrlyc)teCSYThP2A6URe`>Iv|;sx8>m%Vop zAH;}s47@EWk)j;E4?(H9(DQnm^QTmqcO*Q2R!xFwKsmY^l1!?Jg;LpT2_KOr@JevD zt^qh6J%sYp5!^7q%vHfX)xFcY5#js;nn6{_@hS&U^k#h?=f)BZ1YE-gx(VSvP}%T_ z!V6+F;5(r^p0_Av>O5YQc)@Vsw)-4t(o4xp6$ZZTV2;Pv;qmU9j^nTU*y|K^1* zb3;M&l`RY@jFyUa4hHMLxra>XlkZ>X@$`Wmweta=EY|EIjUE7j>Ki;g zkCf0*<{H}d@_;Ar!pF^1pW9&LNI-O*;+yRi2B^gvmhCO088z~$Q}kvY$KkVjc%8p~ z(wgvmr&L31A;7&Mo3h$V%BZ@g#?z|XEx2{wM4EhF?JMdRQ|t3*f3tG6&5EpY$D)J# zmy@U_C@|(4O$FySR%&aP_*N{Ka?FveSH7r)rI9yIkW%NLtzQHC?~@ z3Y;N+-&PckfzQ`d8{QIM7nb~9WkkThL_F`kqgbYON_}Jg)MnSB!_P}!7WamC>0G=j zt@5tH7-{96e_IcoALLoDyXx1?WN?<0*K(IFW4zG1wL7Jpt&GF5COb}FQ=1dsPqpd! z07dCz;CT%NqSarDcxP2(O!N}+aqYJzGzu$>PCBDz5|`2I(v31(uU5weTh0Q}@?Ml8 z<<}HwDncbREDn2TK%XuV&K3WeHF7DC2AQ$JW!#IyhjeNb2T@YAQN#)wrg>4 zA2Sgx%`T*UuGO8VvU@Vc%hPXpu+jLdFCL*j7LMONVOc^}>NqH@2g^=r#{MOYtyQWj z(-6<#kyU`{ha0V&9^{30(#-Jo%}+6X(6|Dhh0V8#CuBcGu?Bw?SD$YlxI=7#yK7_x zPxY7|9$5V7F$SFTqm_~C8D?&oDzr6b)jTEF;}54HX!-7{uBH}>#R`yq4<>;K<)dlH z-@r`kQMNBwgx|}TuJWNY@YTg}+I&tQJdZKTQ|rYy-$n=hr|~@9>YEd_3*9!2vnmE| zSg1j2bpX9qc1Ej%hVRe)#-*CSlK6n$8?1KfDlJCv+o))#fDzAbn@4}mzVvBi5d(F!|vjylI`-biyGQgTD^T? zu&`(GIpx_1=(YOwp&RmzyGvGf)$8JjVs8Ab2v>v;tr&#tN)JNLpp>u>sVaB?GVapy zmzHaaZz{!mOr!>XpO0)f1RY!NvyAd8zLzG>Ax`q~XH10JC!ZlK91>*1wc~h-?kdTSbD~v3wrfUzqG1(jvJ7pjReAQ~DWX8igauY^yj`7KJ z!zw?8wZ9(?cr8sI(@OaJ#p666PODakY%8+DpbLLi#BB#MDT94M42OwjfjaQ!RTigN zDkPJG{&pJOYLQ*(YjM$35@fA*-Jf5MV$fBxiE-c=jd;$yZNQ}adrjlkXU}P9D;}T+ z0_f(Sk98(?J03k6-Yq$a&w)tPHm%e}zO5A}n57N~Zjb}M#u>;3R5|ut7_o)WNV=ON zZ7-L;6W|o_V01C%HO@CG;~$)_6B9rI@^c_9eJo78`+X2|oo?vvnCTEY(ufnrZZ-Yr)?io;qQYi_xR zUGay|x^BOcXU6E&40}Mi=UcsDIv-I_?hv@V+MWcVh8Y9PQ9M;v) z_Tfyly;#Clkts}~`uy&X@h~d?EPhaihwA^Ub0)wvmAG!}x80?5~ByhQQq(`*X zb5Az7Nk@Tz$w)5=YxS*24CFmwQrXL+;j0=VnP>0Ss7Aerh19`sTh88nv9`9p_)