Compare commits

...

21 commits

Author SHA1 Message Date
root
ca60e62d70 enable recurse-submodules 2022-02-05 12:30:37 +01:00
root
4f66b7fd4b update 2022-01-16 20:12:39 +01:00
root
b999fa4dc5 update 2022-01-04 16:19:55 +01:00
root
773dd3e119 update 2021-12-27 15:08:16 +01:00
root
f36ea18436 update 2021-12-13 15:04:24 +01:00
root
8069e4cffd update 2021-12-11 12:24:24 +01:00
root
8796c019db update 2021-12-06 17:47:50 +01:00
root
66aabf3909 update 2021-12-05 19:27:15 +01:00
root
d5a3b2480a big_update 2021-12-05 14:17:16 +01:00
root
c343dc620f update 2021-11-16 11:03:22 +01:00
root
d80674055b update 2021-11-06 16:01:45 +01:00
root
fca317a913 update 2021-10-31 12:33:35 +01:00
root
059389f036 update 2021-10-29 13:57:02 +02:00
root
c0ae3551fe update 2021-10-27 12:39:35 +02:00
root
a9bba98e20 update 2021-10-25 14:38:22 +02:00
root
7e3de5f6fc update 2021-10-07 10:05:26 +02:00
root
aee6b25cdd update 2021-10-03 14:58:25 +02:00
root
329d48d26d update 2021-10-02 11:55:17 +02:00
root
2ea8b0dd9f update 2021-09-27 16:46:26 +02:00
root
c62e0c5989 update 2021-09-22 11:53:40 +02:00
root
c5dcd77f43 update 2021-09-21 16:59:25 +02:00
5672 changed files with 34020 additions and 8852 deletions

View file

@ -3,136 +3,136 @@ rm -rf mods
mkdir mods mkdir mods
cd mods cd mods
git clone --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/3d_armor.git
git clone --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/unified_inventory.git
git clone --depth 1 --branch master https://github.com/minetest-mods/unifiedbricks.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/unifiedbricks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/moreblocks.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/moreblocks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/moreores.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/moreores.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mywalls.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mywalls.git
git clone --depth 1 --branch master https://github.com/minetest-mods/xdecor.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/xdecor.git
git clone --depth 1 --branch master https://github.com/minetest-mods/vehicle_mash.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/vehicle_mash.git
git clone --depth 1 --branch master https://github.com/minetest-mods/lib_mount git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/lib_mount
git clone --depth 1 --branch master https://github.com/minetest-mods/workbench.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/workbench.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_furniture.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/ts_furniture.git
git clone --depth 1 --branch master https://github.com/minetest-mods/playeranim.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/playeranim.git
git clone --depth 1 --branch master https://github.com/minetest-mods/skinsdb.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/skinsdb.git
git clone --depth 1 --branch master https://github.com/minetest-mods/letters.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/letters.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_doors.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/ts_doors.git
git clone --depth 1 --branch master https://github.com/minetest-mods/trash_can.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/trash_can.git
git clone --depth 1 --branch master https://github.com/minetest-mods/throwing_arrows.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/throwing_arrows.git
git clone --depth 1 --branch master https://github.com/minetest-mods/throwing.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/throwing.git
git clone --depth 1 --branch master https://github.com/minetest-mods/stained_glass.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/stained_glass.git
git clone --depth 1 --branch master https://github.com/minetest-mods/xban2.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/xban2.git
git clone --depth 1 --branch master https://github.com/minetest-mods/drinks.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/drinks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/jukebox.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/jukebox.git
git clone --depth 1 --branch master https://github.com/minetest-mods/carpets.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/carpets.git
git clone --depth 1 --branch master https://github.com/minetest-mods/chat2.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/chat2.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mymillwork.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mymillwork.git
git clone --depth 1 --branch master https://github.com/minetest-mods/signs_api.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/signs_api.git
git clone --depth 1 --branch master https://github.com/minetest-mods/crops.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/crops.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mtfoods.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mtfoods.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mysheetmetal.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mysheetmetal.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_workshop.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/ts_workshop.git
git clone --depth 1 --branch master https://github.com/minetest-mods/myroofs.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/myroofs.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_paper.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/ts_paper.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mydeck.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mydeck.git
git clone --depth 1 --branch master https://github.com/minetest-mods/enchanting.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/enchanting.git
git clone --depth 1 --branch master https://github.com/minetest-mods/interact.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/interact.git
git clone --depth 1 --branch master https://github.com/minetest-mods/stargate.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/stargate.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mypaths.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mypaths.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mycorners.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mycorners.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mymasonhammer.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mymasonhammer.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mywoodslopes.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mywoodslopes.git
git clone --depth 1 --branch master https://github.com/minetest-mods/display_api.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/display_api.git
git clone --depth 1 --branch master https://github.com/minetest-mods/font_api.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/font_api.git
git clone --depth 1 --branch master https://github.com/minetest-mods/trees_lib.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/trees_lib.git
git clone --depth 1 --branch master https://github.com/minetest-mods/intllib.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/intllib.git
git clone --depth 1 --branch master https://github.com/minetest-mods/more_chests.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/more_chests.git
git clone --depth 1 --branch master https://github.com/minetest-mods/flowerpot.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/flowerpot.git
git clone --depth 1 --branch master https://github.com/minetest-mods/cloud_items.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/cloud_items.git
git clone --depth 1 --branch master https://github.com/minetest-mods/compost.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/compost.git
git clone --depth 1 --branch master https://github.com/minetest-mods/death_compass.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/death_compass.git
git clone --depth 1 --branch master https://github.com/minetest-mods/smartfs.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/smartfs.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/unifieddyes.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/unifieddyes.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/basic_materials.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/basic_materials.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/biome_lib.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/biome_lib.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/moretrees.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/moretrees.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/homedecor_modpack.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/homedecor_modpack.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/signs_lib.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/signs_lib.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/currency.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/currency.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/plantlife_modpack.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/plantlife_modpack.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/new_campfire.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/new_campfire.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/coloredwood.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/coloredwood.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/basic_signs.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/basic_signs.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/roads.git git clone --recurse-submodules --depth 1 --branch master https://cheapiesystems.com/git/roads
git clone --depth 1 --branch master https://gitlab.com/VanessaE/blox.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/blox.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/plasticbox.git git clone --recurse-submodules --depth 1 --branch master https://github.com/cheapie/plasticbox.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/charcoal.git git clone --recurse-submodules --depth 1 --branch master https://github.com/torusJKL/charcoal.git
git clone --depth 1 --branch master https://github.com/Sokomine/windmill.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Sokomine/windmill.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/farming.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/farming.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/protector.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/protector.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/playerplus.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/playerplus.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_npc.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_npc.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_redo.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_redo.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_water.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_water.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_monster.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_monster.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_animal.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_animal.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mob_horse.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mob_horse.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bows.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bows.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/builtin_item.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/builtin_item.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bonemeal.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bonemeal.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/stamina.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/stamina.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/wine.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/wine.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bees.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bees.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/wool.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/wool.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/regrow.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/regrow.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/ambience.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/ambience.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bakedclay.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/bakedclay.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/stairs.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/stairs.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/anvils.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/anvils.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/carts.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/carts.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/doors.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/doors.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/pie.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/pie.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/castle.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/castle.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_sky.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/TenPlus1/mobs_sky.git
git clone --depth 1 --branch master https://github.com/Uberi/Minetest-WorldEdit.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Uberi/Minetest-WorldEdit.git
git clone --depth 1 --branch master https://github.com/minetest-mods/realchess.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/realchess.git
git clone --depth 1 --branch master https://github.com/Grizzly-Adam/BBQ.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Grizzly-Adam/BBQ.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mydoors.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mydoors.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/angledwalls.git git clone --recurse-submodules --depth 1 --branch master https://github.com/TumeniNodes/angledwalls.git
git clone --depth 1 --branch master https://github.com/pyrollo/display_modpack.git git clone --recurse-submodules --depth 1 --branch master https://github.com/pyrollo/display_modpack.git
git clone --depth 1 --branch master https://github.com/Sokomine/cottages.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Sokomine/cottages.git
git clone --depth 1 --branch master https://github.com/joe7575/techpack.git git clone --recurse-submodules --depth 1 --branch master https://github.com/joe7575/techpack.git
git clone --depth 1 --branch master https://github.com/random-geek/morelights.git git clone --recurse-submodules --depth 1 --branch master https://github.com/random-geek/morelights.git
git clone --depth 1 --branch master https://repo.or.cz/minetest_mtg_plus.git git clone --recurse-submodules --depth 1 --branch master https://repo.or.cz/minetest_mtg_plus.git
git clone --depth 1 --branch master https://github.com/minetest-mods/spectator_mode.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/spectator_mode.git
git clone --depth 1 --branch master https://github.com/Extex101/christmas.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Extex101/christmas.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/gloopblocks.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/gloopblocks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mylandscaping.git git clone --recurse-submodules --depth 1 --branch master https://github.com/minetest-mods/mylandscaping.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/minislots.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/minislots.git
git clone --depth 1 --branch master https://github.com/v-rob/bridger.git git clone --recurse-submodules --depth 1 --branch master https://github.com/v-rob/bridger.git
git clone --depth 1 --branch master https://github.com/AiTechEye/smartshop.git git clone --recurse-submodules --depth 1 --branch master https://github.com/AiTechEye/smartshop.git
git clone --depth 1 --branch master https://repo.or.cz/minetest_colorcubes.git git clone --recurse-submodules --depth 1 --branch master https://repo.or.cz/minetest_colorcubes.git
git clone --depth 1 --branch master https://github.com/DonBatman/myboardgames.git git clone --recurse-submodules --depth 1 --branch master https://github.com/DonBatman/myboardgames.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/ilights.git git clone --recurse-submodules --depth 1 --branch master https://github.com/mt-mods/ilights.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/angledstairs.git git clone --recurse-submodules --depth 1 --branch master https://github.com/TumeniNodes/angledstairs.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/artdeco.git git clone --recurse-submodules --depth 1 --branch master https://github.com/TumeniNodes/artdeco.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/facade.git git clone --recurse-submodules --depth 1 --branch master https://github.com/TumeniNodes/facade.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/stoneworks.git git clone --recurse-submodules --depth 1 --branch master https://github.com/TumeniNodes/stoneworks.git
git clone --depth 1 --branch master https://github.com/Delaroyas/simplyslopes.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Delaroyas/simplyslopes.git
git clone --depth 1 --branch master https://github.com/joe7575/tubelib2.git git clone --recurse-submodules --depth 1 --branch master https://github.com/joe7575/tubelib2.git
git clone --depth 1 --branch master https://github.com/Ezhh/abriflame.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Ezhh/abriflame.git
git clone --depth 1 --branch master https://github.com/Ezhh/abriglass.git git clone --recurse-submodules --depth 1 --branch master https://github.com/Ezhh/abriglass.git
git clone --depth 1 --branch master https://github.com/brittm3/Minetest-lpanes.git git clone --recurse-submodules --depth 1 --branch master https://github.com/brittm3/Minetest-lpanes.git
git clone --depth 1 --branch master https://github.com/qwrwed/lightsplus.git git clone --recurse-submodules --depth 1 --branch master https://github.com/qwrwed/lightsplus.git
git clone --depth 1 --branch master https://github.com/khonkhortisan/rubiks.git git clone --recurse-submodules --depth 1 --branch master https://github.com/khonkhortisan/rubiks.git
git clone --branch master https://git.bananach.space/advtrains.git git clone --recurse-submodules --branch master https://git.bananach.space/advtrains.git
git clone --depth 1 --branch master https://github.com/Dragonop/claycrafter git clone --recurse-submodules --depth 1 --branch master https://github.com/Dragonop/claycrafter
git clone --depth 1 --branch master https://notabug.org/NetherEran/hot_air_balloons.git git clone --recurse-submodules --depth 1 --branch master https://notabug.org/NetherEran/hot_air_balloons.git
git clone --branch master https://cheapiesystems.com/git/prefab_redo git clone --recurse-submodules --branch master https://cheapiesystems.com/git/prefab_redo
git clone --branch master https://cheapiesystems.com/git/mail git clone --recurse-submodules --branch master https://cheapiesystems.com/git/mail
git clone --branch master https://gitlab.com/VanessaE/home_workshop_modpack.git git clone --recurse-submodules --branch master https://github.com/mt-mods/home_workshop_modpack.git
git clone --branch master https://git.bananach.space/basic_trains.git git clone --recurse-submodules --branch master https://git.bananach.space/basic_trains.git
#Clean git stuff #Clean git stuff
rm -rf $(find . -name .git*) rm -rf $(find . -name .git*)

151
mods-download-old Executable file
View file

@ -0,0 +1,151 @@
#!/bin/bash
rm -rf mods
mkdir mods
cd mods
git clone --depth 1 --branch master https://github.com/minetest-mods/3d_armor.git
git clone --depth 1 --branch master https://github.com/minetest-mods/unified_inventory.git
git clone --depth 1 --branch master https://github.com/minetest-mods/unifiedbricks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/moreblocks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/moreores.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mywalls.git
git clone --depth 1 --branch master https://github.com/minetest-mods/xdecor.git
git clone --depth 1 --branch master https://github.com/minetest-mods/vehicle_mash.git
git clone --depth 1 --branch master https://github.com/minetest-mods/lib_mount
git clone --depth 1 --branch master https://github.com/minetest-mods/workbench.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_furniture.git
git clone --depth 1 --branch master https://github.com/minetest-mods/playeranim.git
git clone --depth 1 --branch master https://github.com/minetest-mods/skinsdb.git
git clone --depth 1 --branch master https://github.com/minetest-mods/letters.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_doors.git
git clone --depth 1 --branch master https://github.com/minetest-mods/trash_can.git
git clone --depth 1 --branch master https://github.com/minetest-mods/throwing_arrows.git
git clone --depth 1 --branch master https://github.com/minetest-mods/throwing.git
git clone --depth 1 --branch master https://github.com/minetest-mods/stained_glass.git
git clone --depth 1 --branch master https://github.com/minetest-mods/xban2.git
git clone --depth 1 --branch master https://github.com/minetest-mods/drinks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/jukebox.git
git clone --depth 1 --branch master https://github.com/minetest-mods/carpets.git
git clone --depth 1 --branch master https://github.com/minetest-mods/chat2.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mymillwork.git
git clone --depth 1 --branch master https://github.com/minetest-mods/signs_api.git
git clone --depth 1 --branch master https://github.com/minetest-mods/crops.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mtfoods.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mysheetmetal.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_workshop.git
git clone --depth 1 --branch master https://github.com/minetest-mods/myroofs.git
git clone --depth 1 --branch master https://github.com/minetest-mods/ts_paper.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mydeck.git
git clone --depth 1 --branch master https://github.com/minetest-mods/enchanting.git
git clone --depth 1 --branch master https://github.com/minetest-mods/interact.git
git clone --depth 1 --branch master https://github.com/minetest-mods/stargate.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mypaths.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mycorners.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mymasonhammer.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mywoodslopes.git
git clone --depth 1 --branch master https://github.com/minetest-mods/display_api.git
git clone --depth 1 --branch master https://github.com/minetest-mods/font_api.git
git clone --depth 1 --branch master https://github.com/minetest-mods/trees_lib.git
git clone --depth 1 --branch master https://github.com/minetest-mods/intllib.git
git clone --depth 1 --branch master https://github.com/minetest-mods/more_chests.git
git clone --depth 1 --branch master https://github.com/minetest-mods/flowerpot.git
git clone --depth 1 --branch master https://github.com/minetest-mods/cloud_items.git
git clone --depth 1 --branch master https://github.com/minetest-mods/compost.git
git clone --depth 1 --branch master https://github.com/minetest-mods/death_compass.git
git clone --depth 1 --branch master https://github.com/minetest-mods/smartfs.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/unifieddyes.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/basic_materials.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/biome_lib.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/moretrees.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/homedecor_modpack.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/signs_lib.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/currency.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/plantlife_modpack.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/new_campfire.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/coloredwood.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/basic_signs.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/roads.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/blox.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/plasticbox.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/charcoal.git
git clone --depth 1 --branch master https://github.com/Sokomine/windmill.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/farming.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/protector.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/playerplus.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_npc.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_redo.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_water.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_monster.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_animal.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mob_horse.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bows.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/builtin_item.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bonemeal.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/stamina.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/wine.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bees.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/wool.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/regrow.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/ambience.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/bakedclay.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/stairs.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/anvils.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/carts.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/doors.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/pie.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/castle.git
git clone --depth 1 --branch master https://notabug.org/TenPlus1/mobs_sky.git
git clone --depth 1 --branch master https://github.com/Uberi/Minetest-WorldEdit.git
git clone --depth 1 --branch master https://github.com/minetest-mods/realchess.git
git clone --depth 1 --branch master https://github.com/Grizzly-Adam/BBQ.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mydoors.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/angledwalls.git
git clone --depth 1 --branch master https://github.com/pyrollo/display_modpack.git
git clone --depth 1 --branch master https://github.com/Sokomine/cottages.git
git clone --depth 1 --branch master https://github.com/joe7575/techpack.git
git clone --depth 1 --branch master https://github.com/random-geek/morelights.git
git clone --depth 1 --branch master https://repo.or.cz/minetest_mtg_plus.git
git clone --depth 1 --branch master https://github.com/minetest-mods/spectator_mode.git
git clone --depth 1 --branch master https://github.com/Extex101/christmas.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/gloopblocks.git
git clone --depth 1 --branch master https://github.com/minetest-mods/mylandscaping.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/minislots.git
git clone --depth 1 --branch master https://github.com/v-rob/bridger.git
git clone --depth 1 --branch master https://github.com/AiTechEye/smartshop.git
git clone --depth 1 --branch master https://repo.or.cz/minetest_colorcubes.git
git clone --depth 1 --branch master https://github.com/DonBatman/myboardgames.git
git clone --depth 1 --branch master https://gitlab.com/VanessaE/ilights.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/angledstairs.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/artdeco.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/facade.git
git clone --depth 1 --branch master https://github.com/TumeniNodes/stoneworks.git
git clone --depth 1 --branch master https://github.com/Delaroyas/simplyslopes.git
git clone --depth 1 --branch master https://github.com/joe7575/tubelib2.git
git clone --depth 1 --branch master https://github.com/Ezhh/abriflame.git
git clone --depth 1 --branch master https://github.com/Ezhh/abriglass.git
git clone --depth 1 --branch master https://github.com/brittm3/Minetest-lpanes.git
git clone --depth 1 --branch master https://github.com/qwrwed/lightsplus.git
git clone --depth 1 --branch master https://github.com/khonkhortisan/rubiks.git
git clone --branch master https://git.bananach.space/advtrains.git
git clone --depth 1 --branch master https://github.com/Dragonop/claycrafter
git clone --depth 1 --branch master https://notabug.org/NetherEran/hot_air_balloons.git
git clone --branch master https://cheapiesystems.com/git/prefab_redo
git clone --branch master https://cheapiesystems.com/git/mail
git clone --branch master https://gitlab.com/VanessaE/home_workshop_modpack.git
git clone --branch master https://git.bananach.space/basic_trains.git
#Clean git stuff
rm -rf $(find . -name .git*)
#Make some fixes
#1
if [[ $(grep -R "run_at_every_load = false" homedecor_modpack/homedecor_kitchen/init.lua | wc -l) = 1 ]]
then
echo "Applying fix for unknown kitchen_cabinet blocks: https://git.my-web.xyz/milan/minetest-mm/issues/34"
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
#update skins-db
cd skinsdb/updater
python3 update_skins.py

View file

@ -1,5 +1,5 @@
load_mod_interact = false load_mod_interact = false
load_mod_christmas = false load_mod_christmas = true
load_mod_advtrains_luaautomation = false load_mod_advtrains_luaautomation = false
load_mod_advtrains_interlocking = false load_mod_advtrains_interlocking = false
load_mod_advtrains_line_automation = false load_mod_advtrains_line_automation = false
@ -47,7 +47,6 @@ load_mod_nature_classic = true
load_mod_homedecor_clocks = true load_mod_homedecor_clocks = true
load_mod_signs_road = true load_mod_signs_road = true
load_mod_homedecor_cobweb = true load_mod_homedecor_cobweb = true
load_mod_along_shore = true
load_mod_artdeco = true load_mod_artdeco = true
load_mod_carts = true load_mod_carts = true
load_mod_mobs_butterfly = true load_mod_mobs_butterfly = true
@ -78,7 +77,6 @@ load_mod_death_compass = true
load_mod_facade = true load_mod_facade = true
load_mod_inbox = true load_mod_inbox = true
load_mod_cloud_items = true load_mod_cloud_items = true
load_mod_flowers_plus = true
load_mod_bows = true load_mod_bows = true
load_mod_3dmushrooms = true load_mod_3dmushrooms = true
load_mod_minislots_engine = true load_mod_minislots_engine = true
@ -264,7 +262,6 @@ load_mod_serialize_lib = true
load_mod_hot_air_balloons = true load_mod_hot_air_balloons = true
load_mod_mobs_bat = true load_mod_mobs_bat = true
load_mod_home_workshop_machines = true load_mod_home_workshop_machines = true
load_mod_home_workshop_common = true
load_mod_home_workshop_misc = true load_mod_home_workshop_misc = true
load_mod_computers = true load_mod_computers = true
load_mod_advtrains_assets = true load_mod_advtrains_assets = true
@ -272,3 +269,7 @@ load_mod_advtrains_train_subway = true
load_mod_advtrains_train_japan = true load_mod_advtrains_train_japan = true
load_mod_advtrains_train_industrial = true load_mod_advtrains_train_industrial = true
load_mod_advtrains_train_steam = true load_mod_advtrains_train_steam = true
load_mod_home_vending_machines = true
load_mod_pl_sunflowers = true
load_mod_pl_seaweed = true
load_mod_pl_waterlilies = true

274
mods-list-old Normal file
View file

@ -0,0 +1,274 @@
load_mod_interact = false
load_mod_christmas = false
load_mod_advtrains_luaautomation = false
load_mod_advtrains_interlocking = false
load_mod_advtrains_line_automation = false
load_mod_advtrains_signals_ks = false
load_mod_workbench = true
load_mod_wool = true
load_mod_wine = true
load_mod_mobs_birds = true
load_mod_plasticbox = true
load_mod_minislots_golden7s_deluxe = true
load_mod_mail = true
load_mod_worldedit = true
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
load_mod_homedecor_office = true
load_mod_stargate = true
load_mod_charcoal = true
load_mod_homedecor_lighting = true
load_mod_angledwalls = true
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
load_mod_homedecor_common = true
load_mod_homedecor_furniture_medieval = true
load_mod_morelights = true
load_mod_homedecor_bedroom = true
load_mod_homedecor_laundry = true
load_mod_blox = true
load_mod_homedecor_3d_extras = true
load_mod_mymillwork = true
load_mod_drinks = true
load_mod_angledstairs = true
load_mod_nature_classic = true
load_mod_homedecor_clocks = true
load_mod_signs_road = true
load_mod_homedecor_cobweb = true
load_mod_along_shore = true
load_mod_artdeco = true
load_mod_carts = true
load_mod_mobs_butterfly = true
load_mod_mobs_animal = true
load_mod_mobs_monster = true
load_mod_lavalamp = true
load_mod_mtg_plus = true
load_mod_homedecor_gastronomy = true
load_mod_anvils = true
load_mod_moreblocks = true
load_mod_molehills = true
load_mod_ontime_clocks = true
load_mod_mtfoods = true
load_mod_sl_controller = true
load_mod_intllib = true
load_mod_display_api = true
load_mod_worldedit_gui = true
load_mod_bridger = true
load_mod_homedecor_trash_cans = true
load_mod_3d_armor_ui = true
load_mod_gloopblocks = true
load_mod_mobs = true
load_mod_worldedit_shortcommands = true
load_mod_worldedit_brush = true
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_flowers_plus = true
load_mod_bows = true
load_mod_3dmushrooms = true
load_mod_minislots_engine = true
load_mod_ambience = true
load_mod_lib_mount = true
load_mod_streetshotfix = true
load_mod_carpets = true
load_mod_windmill = true
load_mod_chat2 = true
load_mod_xban2 = true
load_mod_coloredwood = true
load_mod_homedecor_misc = true
load_mod_3d_armor_ip = true
load_mod_techpack_stairway = true
load_mod_shields = true
load_mod_morelights_extras = true
load_mod_homedecor_roofing = true
load_mod_mys_n_l = true
load_mod_smartfs = true
load_mod_steles = true
load_mod_homedecor_seating = true
load_mod_enchanting = true
load_mod_mycanadiancheckers = true
load_mod_mychess = true
load_mod_asphaltstairs = true
load_mod_manholes = true
load_mod_building_blocks = true
load_mod_3d_armor = true
load_mod_doors = true
load_mod_dryplants = true
load_mod_stoneworks = true
load_mod_bees = true
load_mod_mymasonhammer = true
load_mod_minislots_golden7s = true
load_mod_3d_armor_sfinv = true
load_mod_morelights_vintage = true
load_mod_infrastructure = true
load_mod_bakedclay = true
load_mod_ilights = true
load_mod_castle = true
load_mod_currency = true
load_mod_basic_signs = true
load_mod_youngtrees = true
load_mod_bonemeal = true
load_mod_minislots_work_files = true
load_mod_mylittle_bg = true
load_mod_vines = true
load_mod_ts_doors = true
load_mod_moretrees = true
load_mod_smartshop = true
load_mod_mobs_fish = true
load_mod_homedecor_foyer = true
load_mod_colorcubes = true
load_mod_fake_fire = true
load_mod_compost = true
load_mod_concretestairs = true
load_mod_signs_api = true
load_mod_mytrouble = true
load_mod_more_chests = true
load_mod_ts_paper = true
load_mod_crops = true
load_mod_boards = true
load_mod_trees_lib = true
load_mod_mydiamondblock = true
load_mod_signs_lib = true
load_mod_homedecor_climate_control = true
load_mod_protector = true
load_mod_font_metro = true
load_mod_homedecor_kitchen = true
load_mod_homedecor_electronics = true
load_mod_signs = true
load_mod_mobs_jellyfish = true
load_mod_mobs_sharks = true
load_mod_mobs_turtles = true
load_mod_safer_lua = true
load_mod_morelights_modern = true
load_mod_homedecor_pictures_and_paintings = true
load_mod_moreores = true
load_mod_my_game_pieces = true
load_mod_mydraughts = true
load_mod_my_saloon_doors = true
load_mod_throwing_arrows = true
load_mod_basic_materials = true
load_mod_mygomoku = true
load_mod_worldedit_commands = true
load_mod_regrow = true
load_mod_gravelsieve = true
load_mod_homedecor_tables = true
load_mod_mycorners = true
load_mod_homedecor_furniture = true
load_mod_homedecor_fences = true
load_mod_mypachisi = true
load_mod_homedecor_books = true
load_mod_mypirinola = true
load_mod_unified_inventory = true
load_mod_mypitfall = true
load_mod_mys_n_l_mini = true
load_mod_labels = true
load_mod_myuno = true
load_mod_mydeck = true
load_mod_my_castle_doors = true
load_mod_biome_lib = true
load_mod_my_misc_doors = true
load_mod_my_cottage_doors = true
load_mod_woodsoils = true
load_mod_lcdlib = true
load_mod_ts_workshop = true
load_mod_my_default_doors = true
load_mod_ferns = true
load_mod_my_door_wood = true
load_mod_my_fancy_doors = true
load_mod_my_garage_door = true
load_mod_emergencyphone = true
load_mod_my_hidden_doors = true
load_mod_homedecor_wardrobe = true
load_mod_my_old_doors = true
load_mod_homedecor_bathroom = true
load_mod_my_sliding_doors = true
load_mod_homedecor_windows_and_treatments = true
load_mod_bushes = true
load_mod_mylandscaping = true
load_mod_streetsmod = true
load_mod_mypaths = true
load_mod_mob_horse = true
load_mod_streetsawards = true
load_mod_myroofs = true
load_mod_pie = true
load_mod_mysheetmetal = true
load_mod_skinsdb = true
load_mod_mywalls = true
load_mod_mywoodslopes = true
load_mod_tubelib_addons3 = true
load_mod_new_campfire = true
load_mod_bushes_classic = true
load_mod_farming = true
load_mod_cavestuff = true
load_mod_font_api = true
load_mod_poisonivy = true
load_mod_xdecor = true
load_mod_trunks = true
load_mod_playeranim = true
load_mod_playerplus = true
load_mod_prefab_redo = true
load_mod_realchess = true
load_mod_asphalt = true
load_mod_constructionarea = true
load_mod_delineator = true
load_mod_roadsigns = true
load_mod_steelsupport = true
load_mod_streetlamps = true
load_mod_streetsconcrete = true
load_mod_mymazes = true
load_mod_streetspoles = true
load_mod_simplyslopes = true
load_mod_spectator_mode = true
load_mod_stained_glass = true
load_mod_stairs = true
load_mod_tubelib_addons2 = true
load_mod_stamina = true
load_mod_smartline = true
load_mod_techpack_warehouse = true
load_mod_tubelib = true
load_mod_throwing = true
load_mod_cottages = true
load_mod_trash_can = true
load_mod_myconnect4 = true
load_mod_ts_furniture = true
load_mod_tubelib2 = true
load_mod_mycheckers = true
load_mod_unifiedbricks = true
load_mod_unifieddyes = true
load_mod_vehicle_mash = true
load_mod_rubiks = true
load_mod_lightsplus = true
load_mod_abriflame = true
load_mod_lpanes = true
load_mod_abriglass = true
load_mod_advtrains_train_track = true
load_mod_advtrains = true
load_mod_advtrains_itrainmap = true
load_mod_claycrafter = true
load_mod_serialize_lib = true
load_mod_hot_air_balloons = true
load_mod_mobs_bat = true
load_mod_home_workshop_machines = true
load_mod_home_workshop_common = true
load_mod_home_workshop_misc = true
load_mod_computers = true
load_mod_advtrains_assets = true
load_mod_advtrains_train_subway = true
load_mod_advtrains_train_japan = true
load_mod_advtrains_train_industrial = true
load_mod_advtrains_train_steam = true

View file

@ -53,6 +53,7 @@ Change the following default settings by going to Main Menu>>Settings(Tab)>>All
armor_material_gold = true armor_material_gold = true
armor_material_mithril = true armor_material_mithril = true
armor_material_crystal = true armor_material_crystal = true
armor_material_nether = true
### Initialization glitches when a player first joins ### Initialization glitches when a player first joins
**Increase to prevent glitches** **Increase to prevent glitches**

View file

@ -132,6 +132,7 @@ armor = {
gold = "default:gold_ingot", gold = "default:gold_ingot",
mithril = "moreores:mithril_ingot", mithril = "moreores:mithril_ingot",
crystal = "ethereal:crystal_ingot", crystal = "ethereal:crystal_ingot",
nether = "nether:nether_ingot",
}, },
fire_nodes = { fire_nodes = {
{"nether:lava_source", 5, 8}, {"nether:lava_source", 5, 8},
@ -176,6 +177,7 @@ armor.config = {
material_gold = true, material_gold = true,
material_mithril = true, material_mithril = true,
material_crystal = true, material_crystal = true,
material_nether = true,
set_elements = "head torso legs feet shield", set_elements = "head torso legs feet shield",
set_multiplier = 1.1, set_multiplier = 1.1,
water_protect = true, water_protect = true,

View file

@ -15,6 +15,7 @@ ARMOR_MATERIALS = {
gold = "default:gold_ingot", gold = "default:gold_ingot",
mithril = "moreores:mithril_ingot", mithril = "moreores:mithril_ingot",
crystal = "ethereal:crystal_ingot", crystal = "ethereal:crystal_ingot",
nether = "nether:nether_ingot",
} }
-- Enable fire protection (defaults true if using ethereal mod) -- Enable fire protection (defaults true if using ethereal mod)

View file

@ -868,6 +868,92 @@ if armor.materials.crystal then
end 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 --- Crafting
-- --
-- @section craft -- @section craft
@ -886,6 +972,7 @@ end
-- - gold: default:gold_ingot -- - gold: default:gold_ingot
-- - mithril: moreores:mithril_ingot -- - mithril: moreores:mithril_ingot
-- - crystal: ethereal:crystal_ingot -- - crystal: ethereal:crystal_ingot
-- - nether: nether:nether_ingot
-- --
-- helmet: chestplate: leggings: -- helmet: chestplate: leggings:
-- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐ -- ┌───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┐

View file

@ -19,6 +19,7 @@ Helmets:
[3d_armor:helmet_gold] X = [default:gold_ingot] [3d_armor:helmet_gold] X = [default:gold_ingot]
[3d_armor:helmet_mithril] X = [moreores:mithril_ingot] * [3d_armor:helmet_mithril] X = [moreores:mithril_ingot] *
[3d_armor:helmet_crystal] X = [ethereal:crystal_ingot] ** [3d_armor:helmet_crystal] X = [ethereal:crystal_ingot] **
[3d_armor:helmet_nether] X = [ethereal:nether_ingot] **
Chestplates: Chestplates:
@ -38,6 +39,7 @@ Chestplates:
[3d_armor:chestplate_gold] X = [default:gold_ingot] [3d_armor:chestplate_gold] X = [default:gold_ingot]
[3d_armor:chestplate_mithril] X = [moreores:mithril_ingot] * [3d_armor:chestplate_mithril] X = [moreores:mithril_ingot] *
[3d_armor:chestplate_crystal] X = [ethereal:crystal_ingot] ** [3d_armor:chestplate_crystal] X = [ethereal:crystal_ingot] **
[3d_armor:chestplate_nether] X = [ethereal:nether_ingot] **
Leggings: Leggings:
@ -57,6 +59,7 @@ Leggings:
[3d_armor:leggings_gold] X = [default:gold_ingot] [3d_armor:leggings_gold] X = [default:gold_ingot]
[3d_armor:leggings_mithril] X = [moreores:mithril_ingot] * [3d_armor:leggings_mithril] X = [moreores:mithril_ingot] *
[3d_armor:leggings_crystal] X = [ethereal:crystal_ingot] ** [3d_armor:leggings_crystal] X = [ethereal:crystal_ingot] **
[3d_armor:leggings_nether] X = [ethereal:nether_ingot] **
Boots: Boots:
@ -74,6 +77,8 @@ Boots:
[3d_armor:boots_gold] X = [default:gold_ingot] [3d_armor:boots_gold] X = [default:gold_ingot]
[3d_armor:boots_mithril] X = [moreores:mithril_ingot] * [3d_armor:boots_mithril] X = [moreores:mithril_ingot] *
[3d_armor:boots_crystal] X = [ethereal:crystal_ingot] ** [3d_armor:boots_crystal] X = [ethereal:crystal_ingot] **
[3d_armor:boots_nether] X = [ethereal:nether_ingot] **
* Requires moreores mod by Calinou - https://forum.minetest.net/viewtopic.php?id=549 * Requires moreores mod by Calinou - https://forum.minetest.net/viewtopic.php?id=549
** Requires ethereal mod by Chinchow & TenPlus1 - https://github.com/tenplus1/ethereal ** Requires ethereal mod by Chinchow & TenPlus1 - https://github.com/tenplus1/ethereal
** Requires nether mod - https://github.com/minetest-mods/nether.git

View file

@ -6,3 +6,4 @@ fire?
ethereal? ethereal?
bakedclay? bakedclay?
moreores? moreores?
nether?

View file

@ -105,6 +105,9 @@ end
if not minetest.get_modpath("ethereal") then if not minetest.get_modpath("ethereal") then
armor.materials.crystal = nil armor.materials.crystal = nil
end end
if not minetest.get_modpath("nether") then
armor.materials.nether = nil
end
dofile(modpath.."/armor.lua") dofile(modpath.."/armor.lua")

View file

@ -0,0 +1,62 @@
# 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
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

View file

@ -25,6 +25,10 @@ Crystal Boots=Botas de cristal
Crystal Chestplate=Peto de cristal Crystal Chestplate=Peto de cristal
Crystal Helmet=Casco de cristal Crystal Helmet=Casco de cristal
Crystal Leggings=Grebas 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 Boots=Botas de diamante
Diamond Chestplate=Peto de diamante Diamond Chestplate=Peto de diamante
Diamond Helmet=Casco de diamante Diamond Helmet=Casco de diamante

View file

@ -25,6 +25,10 @@ Crystal Boots=Bottes en cristal
Crystal Chestplate=Cuirasse en cristal Crystal Chestplate=Cuirasse en cristal
Crystal Helmet=Casque en cristal Crystal Helmet=Casque en cristal
Crystal Leggings=Jambières 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 Boots=Bottes en diamant
Diamond Chestplate=Cuirasse en diamant Diamond Chestplate=Cuirasse en diamant
Diamond Helmet=Casque en diamant Diamond Helmet=Casque en diamant

View file

@ -25,6 +25,10 @@ Crystal Boots=Stivali di cristallo
Crystal Chestplate=Corazza di cristallo Crystal Chestplate=Corazza di cristallo
Crystal Helmet=Elmo di cristallo Crystal Helmet=Elmo di cristallo
Crystal Leggings=Gambali 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 Boots=Stivali di diamante
Diamond Chestplate=Corazza di diamante Diamond Chestplate=Corazza di diamante
Diamond Helmet=Elmo di diamante Diamond Helmet=Elmo di diamante
@ -83,3 +87,4 @@ Diamond Shield=Scudo di diamante
Gold Shield=Scudo d'oro Gold Shield=Scudo d'oro
Mithril Shield=Scudo di mithril Mithril Shield=Scudo di mithril
Crystal Shield=Scudo di cristallo Crystal Shield=Scudo di cristallo
Nether Shield=Scudo di nether

View file

@ -25,6 +25,10 @@ Crystal Boots=But Kristal
Crystal Chestplate=Perisai Dada Kristal Crystal Chestplate=Perisai Dada Kristal
Crystal Helmet=Helmet Kristal Crystal Helmet=Helmet Kristal
Crystal Leggings=Perisai Kaki 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 Boots=But Intan
Diamond Chestplate=Perisai Dada Intan Diamond Chestplate=Perisai Dada Intan
Diamond Helmet=Helmet Intan Diamond Helmet=Helmet Intan
@ -83,3 +87,4 @@ Diamond Shield=Perisai Pegang Intan
Gold Shield=Perisai Pegang Emas Gold Shield=Perisai Pegang Emas
Mithril Shield=Perisai Pegang Mithril Mithril Shield=Perisai Pegang Mithril
Crystal Shield=Perisai Pegang Kristal Crystal Shield=Perisai Pegang Kristal
Nether Shield=Perisai Pegang Nether

View file

@ -25,6 +25,10 @@ Crystal Boots=Botas de Cristal
Crystal Chestplate=Peitoral de Cristal Crystal Chestplate=Peitoral de Cristal
Crystal Helmet=Capacete de Cristal Crystal Helmet=Capacete de Cristal
Crystal Leggings=Calças 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 Boots=Botas de Diamante
Diamond Chestplate=Peitoral de Diamante Diamond Chestplate=Peitoral de Diamante
Diamond Helmet=Capacete de Diamante Diamond Helmet=Capacete de Diamante
@ -83,3 +87,4 @@ Diamond Shield=Escudo de Diamante
Gold Shield=Escudo de Ouro Gold Shield=Escudo de Ouro
Mithril Shield=Escudo de Mithril Mithril Shield=Escudo de Mithril
Crystal Shield=Escudo de Cristal Crystal Shield=Escudo de Cristal
Nether Shield=Escudo de Nether

View file

@ -25,6 +25,10 @@ Crystal Boots=Botas de Cristal
Crystal Chestplate=Peitoral de Cristal Crystal Chestplate=Peitoral de Cristal
Crystal Helmet=Capacete de Cristal Crystal Helmet=Capacete de Cristal
Crystal Leggings=Calças 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 Boots=Botas de Diamante
Diamond Chestplate=Peitoral de Diamante Diamond Chestplate=Peitoral de Diamante
Diamond Helmet=Capacete de Diamante Diamond Helmet=Capacete de Diamante
@ -83,3 +87,4 @@ Diamond Shield=Escudo de Diamante
Gold Shield=Escudo de Ouro Gold Shield=Escudo de Ouro
Mithril Shield=Escudo de Mithril Mithril Shield=Escudo de Mithril
Crystal Shield=Escudo de Cristal Crystal Shield=Escudo de Cristal
Nether Shield=Escudo de Nether

View file

@ -25,6 +25,10 @@ Crystal Boots=
Crystal Chestplate= Crystal Chestplate=
Crystal Helmet= Crystal Helmet=
Crystal Leggings= Crystal Leggings=
Nether Boots=
Nether Chestplate=
Nether Helmet=
Nether Leggings=
Diamond Boots= Diamond Boots=
Diamond Chestplate= Diamond Chestplate=
Diamond Helmet= Diamond Helmet=

View file

@ -1,4 +1,4 @@
name = 3d_armor name = 3d_armor
depends = default depends = default
optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores, nether
description = Adds craftable armor that is visible to other players. description = Adds craftable armor that is visible to other players.

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

View file

@ -38,6 +38,11 @@
3d_armor/textures/3d_armor_leggings_crystal.png:legs 3d_armor/textures/3d_armor_leggings_crystal.png:legs
3d_armor/textures/3d_armor_boots_crystal.png:feet 3d_armor/textures/3d_armor_boots_crystal.png:feet
3d_armor/textures/3d_armor_helmet_nether.png:head
3d_armor/textures/3d_armor_chestplate_nether.png:torso
3d_armor/textures/3d_armor_leggings_nether.png:legs
3d_armor/textures/3d_armor_boots_nether.png:feet
3d_armor/textures/3d_armor_helmet_admin.png:head 3d_armor/textures/3d_armor_helmet_admin.png:head
3d_armor/textures/3d_armor_chestplate_admin.png:torso 3d_armor/textures/3d_armor_chestplate_admin.png:torso
3d_armor/textures/3d_armor_leggings_admin.png:legs 3d_armor/textures/3d_armor_leggings_admin.png:legs

View file

@ -8,6 +8,7 @@ armor_material_diamond (Enable diamond armor) bool true
armor_material_gold (Enable gold armor) bool true armor_material_gold (Enable gold armor) bool true
armor_material_mithril (Enable mithril armor) bool true armor_material_mithril (Enable mithril armor) bool true
armor_material_crystal (Enable crystal armor) bool true armor_material_crystal (Enable crystal armor) bool true
armor_material_nether (Enable nether armor) bool true
# Increase this if you get initialization glitches when a player first joins. # Increase this if you get initialization glitches when a player first joins.
armor_init_delay (Initialization delay) int 2 armor_init_delay (Initialization delay) int 2

View file

@ -17,6 +17,7 @@ Shields -- Crafting Guide
[shields:shield_gold] X = [default:gold_ingot] [shields:shield_gold] X = [default:gold_ingot]
[shields:shield_mithril] X = [moreores:mithril_ingot] [shields:shield_mithril] X = [moreores:mithril_ingot]
[shields:shield_crystal] X = [ethereal:crystal_ingot] [shields:shield_crystal] X = [ethereal:crystal_ingot]
[shields:shield_nether] X = [ethereal:nether_ingot]
Enhanced Shields Enhanced Shields
---------------- ----------------

View file

@ -370,6 +370,35 @@ if armor.materials.crystal then
}) })
end end
if armor.materials.nether then
--- Nether Shield
--
-- @shield shields:shield_nether
-- @img shields_inv_shield_nether.png
-- @grp armor_shield 1
-- @grp armor_heal 17
-- @grp armor_use 200
-- @grp armor_fire 1
-- @armorgrp fleshy 20
-- @damagegrp cracky 3
-- @damagegrp snappy 2
-- @damagegrp level 3
armor:register_armor("shields:shield_nether", {
description = S("Nether Shield"),
inventory_image = "shields_inv_shield_nether.png",
groups = {armor_shield=1, armor_heal=17, armor_use=200, armor_fire=1},
armor_groups = {fleshy=20},
damage_groups = {cracky=3, snappy=2, level=3},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_glass_footstep")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_break_glass")
end,
})
end
for k, v in pairs(armor.materials) do for k, v in pairs(armor.materials) do
minetest.register_craft({ minetest.register_craft({
output = "shields:shield_"..k, output = "shields:shield_"..k,

View file

@ -0,0 +1,17 @@
# textdomain: shields
### init.lua ###
Admin Shield=Adminschild
Bronze Shield=Bronzeschild
Cactus Shield=Kaktusschild
Crystal Shield=Kristallschild
Nether Shield=Netherschild
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

View file

@ -7,6 +7,7 @@ Admin Shield=Bouclier d'admin
Bronze Shield=Bouclier en bronze Bronze Shield=Bouclier en bronze
Cactus Shield=Bouclier en cactus Cactus Shield=Bouclier en cactus
Crystal Shield=Bouclier en cristal Crystal Shield=Bouclier en cristal
Nether Shield=Bouclier en nether
Diamond Shield=Bouclier en diamant Diamond Shield=Bouclier en diamant
Enhanced Cactus Shield=Bouclier en cactus amélioré Enhanced Cactus Shield=Bouclier en cactus amélioré
Enhanced Wood Shield=Bouclier en bois amélioré Enhanced Wood Shield=Bouclier en bois amélioré

View file

@ -7,6 +7,7 @@ Admin Shield=
Bronze Shield= Bronze Shield=
Cactus Shield= Cactus Shield=
Crystal Shield= Crystal Shield=
Nether Shield=
Diamond Shield= Diamond Shield=
Enhanced Cactus Shield= Enhanced Cactus Shield=
Enhanced Wood Shield= Enhanced Wood Shield=

View file

@ -8,4 +8,5 @@ shields/textures/shields_shield_gold.png:shield
shields/textures/shields_shield_diamond.png:shield shields/textures/shields_shield_diamond.png:shield
shields/textures/shields_shield_mithril.png:shield shields/textures/shields_shield_mithril.png:shield
shields/textures/shields_shield_crystal.png:shield shields/textures/shields_shield_crystal.png:shield
shields/textures/shields_shield_nether.png:shield
shields/textures/shields_shield_admin.png:shield shields/textures/shields_shield_admin.png:shield

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 B

View file

@ -0,0 +1,30 @@
#!/bin/bash
tempdir=/tmp/mt
confpath=$tempdir/minetest.conf
worldpath=$tempdir/world
use_docker=y
[ -x ../../bin/minetestserver ] && use_docker=
rm -rf $tempdir
mkdir -p $worldpath
# the docker image doesn't have devtest
[ -n "$use_docker" ] || printf '%s\n' gameid=devtest >$worldpath/world.mt
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
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}
else
mkdir $worldpath/worldmods
ln -s "$PWD/worldedit" $worldpath/worldmods/worldedit
../../bin/minetestserver --config $confpath --world $worldpath --logfile /dev/null
fi
test -f $worldpath/tests_ok || exit 1
exit 0

View file

@ -23,7 +23,7 @@ There is a nice installation guide over at the [Minetest Wiki](http://wiki.minet
8. You should have a mod selection screen. Select the one named something like `Minetest-WorldEdit` by left clicking once and press the **Enable Modpack** button. 8. You should have a mod selection screen. Select the one named something like `Minetest-WorldEdit` by left clicking once and press the **Enable Modpack** button.
9. Press the **Save** button. You can now use WorldEdit in that world. Repeat steps 7 to 9 to enable WorldEdit for other worlds too. 9. Press the **Save** button. You can now use WorldEdit in that world. Repeat steps 7 to 9 to enable WorldEdit for other worlds too.
If you are having trouble, try asking for help in the [IRC channel](https://webchat.freenode.net/?channels=#minetest) (faster but may not always have helpers online) If you are having trouble, try asking for help in the [IRC channel](https://web.libera.chat/#minetest) (faster but may not always have helpers online)
or ask on the [forum topic](https://forum.minetest.net/viewtopic.php?id=572) (slower but more likely to get help). or ask on the [forum topic](https://forum.minetest.net/viewtopic.php?id=572) (slower but more likely to get help).
Usage Usage

View file

@ -38,3 +38,7 @@ if minetest.settings:get_bool("log_mods") then
print("[WorldEdit] Loaded!") print("[WorldEdit] Loaded!")
end end
if minetest.settings:get_bool("worldedit_run_tests") then
dofile(path .. "/test.lua")
minetest.after(0, worldedit.run_tests)
end

View file

@ -0,0 +1,448 @@
---------------------
-- Helpers
---------------------
local vec = vector.new
local vecw = function(axis, n, base)
local ret = vec(base)
ret[axis] = n
return ret
end
local pos2str = minetest.pos_to_string
local get_node = minetest.get_node
local set_node = minetest.set_node
---------------------
-- Nodes
---------------------
local air = "air"
local testnode1
local testnode2
local testnode3
-- Loads nodenames to use for tests
local function init_nodes()
testnode1 = minetest.registered_aliases["mapgen_stone"]
testnode2 = minetest.registered_aliases["mapgen_dirt"]
testnode3 = minetest.registered_aliases["mapgen_cobble"] or minetest.registered_aliases["mapgen_dirt_with_grass"]
assert(testnode1 and testnode2 and testnode3)
end
-- Writes repeating pattern into given area
local function place_pattern(pos1, pos2, pattern)
local pos = vec()
local node = {name=""}
local i = 1
for z = pos1.z, pos2.z do
pos.z = z
for y = pos1.y, pos2.y do
pos.y = y
for x = pos1.x, pos2.x do
pos.x = x
node.name = pattern[i]
set_node(pos, node)
i = i % #pattern + 1
end
end
end
end
---------------------
-- Area management
---------------------
assert(minetest.get_mapgen_setting("mg_name") == "singlenode")
local area = {}
do
local areamin, areamax
local off
local c_air = minetest.get_content_id(air)
local vbuffer = {}
-- Assign a new area for use, will emerge and then call ready()
area.assign = function(min, max, ready)
areamin = min
areamax = max
minetest.emerge_area(min, max, function(bpos, action, remaining)
assert(action ~= minetest.EMERGE_ERRORED)
if remaining > 0 then return end
minetest.after(0, function()
area.clear()
ready()
end)
end)
end
-- Reset area contents and state
area.clear = function()
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)
if #vbuffer ~= vcount then
vbuffer = {}
for i = 1, vcount do
vbuffer[i] = c_air
end
end
vmanip:set_data(vbuffer)
vmanip:write_to_map()
off = vec(0, 0, 0)
end
-- 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}
else
size = {x=sizex, y=sizey, z=sizez}
end
local pos1 = vector.add(areamin, off)
local pos2 = vector.subtract(vector.add(pos1, size), 1)
if pos2.x > areamax.x or pos2.y > areamax.y or pos2.z > areamax.z then
error("Internal failure: out of space")
end
off = vector.add(off, size)
return pos1, pos2
end
-- Returns an axis and count (= n) relative to the last-requested area that is unoccupied
area.dir = function(n)
local pos1 = vector.add(areamin, off)
if pos1.x + n <= areamax.x then
off.x = off.x + n
return "x", n
elseif pos1.x + n <= areamax.y then
off.y = off.y + n
return "y", n
elseif pos1.z + n <= areamax.z then
off.z = off.z + n
return "z", n
end
error("Internal failure: out of space")
end
-- Returns [XYZ] margin (list of pos pairs) of n around last-requested area
-- (may actually be larger but doesn't matter)
area.margin = function(n)
local pos1, pos2 = area.get(n)
return {
{ vec(areamin.x, areamin.y, pos1.z), pos2 }, -- X/Y
{ vec(areamin.x, pos1.y, areamin.z), pos2 }, -- X/Z
{ vec(pos1.x, areamin.y, areamin.z), pos2 }, -- Y/Z
}
end
end
-- Split an existing area into two non-overlapping [pos1, half1], [half2, pos2] parts; returns half1, half2
area.split = function(pos1, pos2)
local axis
if pos2.x - pos1.x >= 1 then
axis = "x"
elseif pos2.y - pos1.y >= 1 then
axis = "y"
elseif pos2.z - pos1.z >= 1 then
axis = "z"
else
error("Internal failure: area too small to split")
end
local hspan = math.floor((pos2[axis] - pos1[axis] + 1) / 2)
local half1 = vecw(axis, pos1[axis] + hspan - 1, pos2)
local half2 = vecw(axis, pos1[axis] + hspan, pos2)
return half1, half2
end
---------------------
-- Checks
---------------------
local check = {}
-- Check that all nodes in [pos1, pos2] are the node(s) specified
check.filled = function(pos1, pos2, nodes)
if type(nodes) == "string" then
nodes = { nodes }
end
local _, counts = minetest.find_nodes_in_area(pos1, pos2, nodes)
local total = worldedit.volume(pos1, pos2)
local sum = 0
for _, n in pairs(counts) do
sum = sum + n
end
if sum ~= total then
error((total - sum) .. " " .. table.concat(nodes, ",") .. " nodes missing in " ..
pos2str(pos1) .. " -> " .. pos2str(pos2))
end
end
-- Check that none of the nodes in [pos1, pos2] are the node(s) specified
check.not_filled = function(pos1, pos2, nodes)
if type(nodes) == "string" then
nodes = { nodes }
end
local _, counts = minetest.find_nodes_in_area(pos1, pos2, nodes)
for nodename, n in pairs(counts) do
if n ~= 0 then
error(counts[nodename] .. " " .. nodename .. " nodes found in " ..
pos2str(pos1) .. " -> " .. pos2str(pos2))
end
end
end
-- Check that all of the areas are only made of node(s) specified
check.filled2 = function(list, nodes)
for _, pos in ipairs(list) do
check.filled(pos[1], pos[2], nodes)
end
end
-- Check that none of the areas contain the node(s) specified
check.not_filled2 = function(list, nodes)
for _, pos in ipairs(list) do
check.not_filled(pos[1], pos[2], nodes)
end
end
-- Checks presence of a repeating pattern in [pos1, po2] (cf. place_pattern)
check.pattern = function(pos1, pos2, pattern)
local pos = vec()
local i = 1
for z = pos1.z, pos2.z do
pos.z = z
for y = pos1.y, pos2.y do
pos.y = y
for x = pos1.x, pos2.x do
pos.x = x
local node = get_node(pos)
if node.name ~= pattern[i] then
error(pattern[i] .. " not found at " .. pos2str(pos) .. " (i=" .. i .. ")")
end
i = i % #pattern + 1
end
end
end
end
---------------------
-- The actual tests
---------------------
local tests = {}
local function register_test(name, func, opts)
assert(type(name) == "string")
assert(func == nil or type(func) == "function")
if not opts then
opts = {}
else
opts = table.copy(opts)
end
opts.name = name
opts.func = func
table.insert(tests, opts)
end
-- 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
-- The basic structure is: get areas + do operations + check results
-- Helpers:
-- area.get must be used to retrieve areas that can be operated on (these will be cleared before each test)
-- check.filled / check.not_filled can be used to check the result
-- area.margin + check.filled2 is useful to make sure nodes weren't placed too far
-- place_pattern + check.pattern is useful to test ops that operate on existing data
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})
register_test("area.split", function()
for i = 2, 6 do
local pos1, pos2 = area.get(1, 1, i)
local half1, half2 = area.split(pos1, pos2)
assert(pos1.x == half1.x and pos1.y == half1.y)
assert(half1.x == half2.x and half1.y == half2.y)
assert(half1.z + 1 == half2.z)
if i % 2 == 0 then
assert((half1.z - pos1.z) == (pos2.z - half2.z)) -- divided equally
end
end
end, {dry=true})
register_test("check.filled", function()
local pos1, pos2 = area.get(1, 2, 1)
set_node(pos1, {name=testnode1})
set_node(pos2, {name=testnode2})
check.filled(pos1, pos1, testnode1)
check.filled(pos1, pos2, {testnode1, testnode2})
check.not_filled(pos1, pos1, air)
check.not_filled(pos1, pos2, {air, testnode3})
end)
register_test("pattern", function()
local pos1, pos2 = area.get(3, 2, 1)
local pattern = {testnode1, testnode3}
place_pattern(pos1, pos2, pattern)
assert(get_node(pos1).name == testnode1)
check.pattern(pos1, pos2, pattern)
end)
register_test("Generic node manipulations")
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)
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)
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
---------------------
worldedit.run_tests = function()
do
local v = minetest.get_version()
print("Running " .. #tests .. " tests for WorldEdit " ..
worldedit.version_string .. " on " .. v.project .. " " .. (v.hash or v.string))
end
init_nodes()
-- emerge area from (0,0,0) ~ (56,56,56) and keep it loaded
-- Note: making this area smaller speeds up tests
local wanted = vec(56, 56, 56)
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))
end
end
end
area.assign(vec(0, 0, 0), wanted, function()
local failed = 0
for _, test in ipairs(tests) do
if not test.func then
local s = "---- " .. test.name .. " "
print(s .. string.rep("-", 60 - #s))
else
if not test.dry then
area.clear()
end
local ok, err = pcall(test.func)
print(string.format("%-60s %s", test.name, ok and "pass" or "FAIL"))
if not ok then
print(" " .. err)
failed = failed + 1
end
end
end
print("Done, " .. failed .. " tests failed.")
if failed == 0 then
io.close(io.open(minetest.get_worldpath() .. "/tests_ok", "w"))
end
minetest.request_shutdown()
end)
end
-- for debug purposes
minetest.register_on_joinplayer(function(player)
minetest.set_player_privs(player:get_player_name(),
minetest.string_to_privs("fly,fast,noclip,basic_debug,debug,interact"))
end)
minetest.register_on_punchnode(function(pos, node, puncher)
minetest.chat_send_player(puncher:get_player_name(), pos2str(pos))
end)

View file

@ -216,7 +216,7 @@ elseif minetest.global_exists("sfinv") then -- sfinv installed
end end
end end
else else
error( return minetest.log("error",
"worldedit_gui requires a supported gui management mod to be installed.\n".. "worldedit_gui requires a supported gui management mod to be installed.\n"..
"To use the it you need to either:\n".. "To use the it you need to either:\n"..
"* use minetest_game or another sfinv-compatible subgame\n".. "* use minetest_game or another sfinv-compatible subgame\n"..

48
mods/advtrains/.build.yml Normal file
View file

@ -0,0 +1,48 @@
image: debian/stable
packages:
- git
- curl
- minetest-server
- unzip
- wget
- lua-busted
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/
cd .minetest/games
unzip ../../master.zip
mv minetest_game-master minetest_game
- install_test_world: |
mkdir -p .minetest/worlds/
curl https://lifomaps.de/advtrains-test/testworld.tar.gz -o ~/testworld.tar.gz
cd .minetest/worlds/
tar xf ../../testworld.tar.gz
- run_unit_tests : |
cd advtrains/advtrains
busted
cd ../advtrains_interlocking
busted
cd ../serialize_lib
busted
- activate_test_env: |
cd advtrains
git merge --no-commit origin/luaatcdebug
- install_advtrains : |
mkdir .minetest/mods
cp -r advtrains .minetest/mods
cd .minetest/mods
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

View file

@ -0,0 +1,5 @@
((nil (tab-width . 8))
(lua-mode (indent-tabs-mode . t)
(lua-indent-level . 8)
(lua-indent-close-paren-align . nil)
(lua-indent-nested-block-content-align . nil)))

107
mods/advtrains/README.md Normal file
View file

@ -0,0 +1,107 @@
# ADVTRAINS realistic trains in Minetest!
by orwell96 and contributors (see below)
[![builds.sr.ht status](https://builds.sr.ht/~gpcf/advtrains/commits/.build.yml.svg)](https://builds.sr.ht/~gpcf/advtrains/commits/.build.yml?)
For up-to-date information, visit <https://advtrains.de/>
License of code: GNU AGPL version 3
License of media: CC-BY-SA 3.0
(up to commit 1bb1d8 (2020-02-14), the license has been LGPL 2.1)
## Installation
To use advtrains, you need to install a mod providing trains. *Note
that advtrains no longer comes bundled with any trains out of the
box*. Some selected train mods by the authors of advtrains are:
* [Basic trains](https://git.bananach.space/basic_trains.git/) by
orwell96, mbblp et al. The classic selection of trains for
advtrains, formerly included in the mod.
* [Moretrains](https://git.bananach.space/moretrains.git) by rbduck,
with improvements by gpcf and Marnack.
* [dlxtrains](https://github.com/Marnack/dlxtrains_modpack) by Marnack
Further information is available on the [wiki](https://advtrains.de/wiki/).
## How to contribute
* [Bug tracker](https://bugs.linux-forks.de/advtrains)
* [Discussion and Support mailing list][srht-discuss]
* Send patches via [git-send-email][gsm] to the [dev mailing
list][srht-devel]
[srht-discuss]: https://lists.sr.ht/~gpcf/advtrains-discuss
[srht-devel]: https://lists.sr.ht/~gpcf/advtrains-devel
[gsm]: https://git-send-email.io/
## Credits
### Coding
Various features and bugfixes have been contributed by:
- gpcf
- Blockhead
- ywang
Small code contributions:
- hlqkj
- Maverick2797
- AntumDeluge
- lemon-melon
- mbblp
- Andrey K
- Hume2
- Linus Jahn
- Pedro Gimeno
- Relatio
- Thomas Rudin
- h-v-smacker
- imcasper
- rubenwardy
- techniX
### Assets:
* Gravel Texture : from Minetest Game
* Initial rail model/texture : DS-minetest
* Models for signals/bumpers : mbb
* Steam engine / wagon texture: mbb
* Detailed Steam engine : mbb / Krokoschlange(animation)
* Industrial engine/wagons : mbb
* Inventory images : mbb
* Node texture for LuaATC controller: Jeija (from Mesecons)
* Mod Description : hajo
#### Sounds:
* advtrains\_crossing\_bell : Codesound
* advtrains\_japan\_horn : Codesound
* 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:
* gpcf (Linuxforks server)
* imcasper (tss Branch)
* Cato (C&C Servers)
If I forgot someone please punish me for that. Also see the Git commit
log.
You can see this mod in action on various minetest servers, including
the Linuxforks minetest server.

View file

@ -75,6 +75,13 @@ advtrains.register_wagon(name, prototype, description, inventory_image)
^- Getting on by walking in then takes effect. ^- Getting on by walking in then takes effect.
^- Positive values mean front, negative ones back. Resulting position is automatically shifted to the right side. ^- Positive values mean front, negative ones back. Resulting position is automatically shifted to the right side.
coupler_types_front = {scharfenberg=true},
coupler_types_back = {chain=true},
^- Defines the available coupler types on this wagon on the front and back side. Wagon will only couple to wagons that have a matching coupler. (this property does not have any visual impact)
^- Default: not given (nil) - causes the wagon to couple to any other wagon regardless of coupler type.
^- Empty table ({}): This wagon does not couple to any other wagon (e.g. for Linetrack vehicles)
^- Register coupler types using ''advtrains.register_coupler_type(type, name)''. advtrains defines the default types "chain" (Buffer and Chain) and "scharfenberg" (Scharfenberg coupler).
wagon_span=2, wagon_span=2,
^- How far this wagon extends from its base position. Is the half of the wagon length. ^- 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. ^- Used to determine in which distance the other wagons have to be positioned. Will require tweaking.

View file

@ -93,6 +93,7 @@ function atc.train_reset_command(train, keep_tarvel)
train.atc_delay=nil train.atc_delay=nil
train.atc_brake_target=nil train.atc_brake_target=nil
train.atc_wait_finish=nil train.atc_wait_finish=nil
train.atc_wait_autocouple=nil
train.atc_arrow=nil train.atc_arrow=nil
if not keep_tarvel then if not keep_tarvel then
train.tarvelocity=nil train.tarvelocity=nil
@ -199,10 +200,16 @@ local matchptn={
return #match+1 return #match+1
end, end,
["B([0-9]+)"]=function(id, train, match) ["B([0-9]+)"]=function(id, train, match)
if train.velocity>tonumber(match) then local btar = tonumber(match)
train.atc_brake_target=tonumber(match) if train.velocity>btar then
if not train.tarvelocity or train.tarvelocity>train.atc_brake_target then train.atc_brake_target=btar
train.tarvelocity=train.atc_brake_target if not train.tarvelocity or train.tarvelocity>btar then
train.tarvelocity=btar
end
else
-- independent of brake target, must make sure that tarvelocity is not greater than it
if train.tarvelocity and train.tarvelocity>btar then
train.tarvelocity=btar
end end
end end
return #match+1 return #match+1
@ -267,6 +274,10 @@ local matchptn={
advtrains.interlocking.ars_set_disable(train, match=="0") advtrains.interlocking.ars_set_disable(train, match=="0")
return 2 return 2
end, end,
["Cpl"]=function(id, train)
train.atc_wait_autocouple=true
return 3
end,
} }
eval_conditional = function(command, arrow, speed) eval_conditional = function(command, arrow, speed)
@ -358,11 +369,13 @@ function atc.execute_atc_command(id, train)
local match=string.match(command, "^"..pattern) local match=string.match(command, "^"..pattern)
if match then if match then
local patlen=func(id, train, match) local patlen=func(id, train, match)
--atdebug("Executing: "..string.sub(command, 1, patlen))
atprint("Executing: "..string.sub(command, 1, patlen)) --atdebug("Train ATC State: tvel=",train.tarvelocity,"brktar=",train.atc_brake_target,"delay=",train.atc_delay,"wfinish=",train.atc_wait_finish,"wacpl=",train.atc_wait_autocouple)
train.atc_command=string.sub(command, patlen+1) train.atc_command=string.sub(command, patlen+1)
if train.atc_delay<=0 and not train.atc_wait_finish then if train.atc_delay<=0
and not train.atc_wait_finish
and not train.atc_wait_autocouple then
--continue (recursive, cmds shouldn't get too long, and it's a end-recursion.) --continue (recursive, cmds shouldn't get too long, and it's a end-recursion.)
atc.execute_atc_command(id, train) atc.execute_atc_command(id, train)
end end

View file

@ -11,17 +11,24 @@
-- When the initiating train has autocouple set, trains are immediately coupled -- When the initiating train has autocouple set, trains are immediately coupled
-- When not, a couple entity is spawned and coupling commences on click -- When not, a couple entity is spawned and coupling commences on click
-- Coupling MUST preserve the train ID of the initiating train, so it is done like this: -- Coupling MUST preserve the train ID of the initiating train, so it is done like this:
-- initiating train is reversed
-- stationary train is reversed if required, so that it points towards the initiating train
-- do_connect_trains(initiating, stationary)
-- As a result, the coupled train is reversed in direction. Alternative way of doing things (might be considered later):
-- stationary train is reversed if required, so that it points away from the initiating train
-- index of initiating train is set so that it matches the front pos of stationary train -- index of initiating train is set so that it matches the front pos of stationary train
-- wagons of stationary train are inserted at the beginning of initiating train
-- remove stationary train -- remove stationary train
-- wagons of stationary train are inserted at the beginning of initiating train (considers direction of stat_train and inserts reverse if required)
-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information -- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
-- These objectRefs will delete themselves once the couples no longer match (see below) -- These objectRefs will delete themselves once the couples no longer match (see below)
advtrains.coupler_types = {}
function advtrains.register_coupler_type(code, name)
advtrains.coupler_types[code] = name
end
-- Register some default couplers
advtrains.register_coupler_type("chain", attrans("Buffer and Chain Coupler"))
advtrains.register_coupler_type("scharfenberg", attrans("Scharfenberg Coupler"))
local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front) local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front)
local id1 = train1.id local id1 = train1.id
local id2 = train2.id local id2 = train2.id
@ -142,13 +149,21 @@ end
-- Called from train_step_b() when the current train (init_train) just stopped at one of the end indices of another train (stat_train) -- Called from train_step_b() when the current train (init_train) just stopped at one of the end indices of another train (stat_train)
-- Depending on autocouple, either couples immediately or spawns a couple entity -- Depending on autocouple, either couples immediately or spawns a couple entity
function advtrains.couple_initiate_with(init_train, stat_train, stat_is_front) function advtrains.couple_initiate_with(init_train, stat_train, stat_is_front)
--atdebug("Initiating couplign between init=",init_train.id,"stat=",stat_train.id,"backside=",stat_is_backside) --atdebug("Couple init autocouple=",init_train.autocouple,"atc_w_acpl=",init_train.atc_wait_autocouple)
if init_train.autocouple then if init_train.autocouple or init_train.atc_wait_autocouple then
advtrains.couple_trains(init_train, true, stat_train, stat_is_front) local cplmatch, msg = advtrains.check_matching_coupler_types(init_train, true, stat_train, stat_is_front)
else if cplmatch then
advtrains.couple_trains(init_train, false, stat_train, stat_is_front)
-- clear atc couple waiting blocker
init_train.atc_wait_autocouple = nil
return
end
end
-- get here if either autocouple is not on or couples dont match
local pos = advtrains.path_get_interpolated(init_train, init_train.index) local pos = advtrains.path_get_interpolated(init_train, init_train.index)
create_couple_entity(pos, init_train, true, stat_train, stat_is_front) create_couple_entity(pos, init_train, true, stat_train, stat_is_front)
end -- clear ATC command on collision
advtrains.atc.train_reset_command(init_train)
end end
@ -177,54 +192,147 @@ function advtrains.safe_couple_trains(train1, t1_is_front, train2, t2_is_front,
wck_t2 = check_twagon_owner(train2, t2_is_front, pname) wck_t2 = check_twagon_owner(train2, t2_is_front, pname)
end end
if (wck_t1 or wck_t2) or not pname then if (wck_t1 or wck_t2) or not pname then
advtrains.couple_trains(train1, t1_is_front, train2, t2_is_front)
local cplmatch, msg = advtrains.check_matching_coupler_types(train1, t1_is_front, train2, t2_is_front)
if cplmatch then
advtrains.couple_trains(train1, not t1_is_front, train2, t2_is_front)
else
minetest.chat_send_player(pname, msg)
end
end end
end end
-- Actually performs the train coupling. Always retains train ID of train1 -- Actually performs the train coupling. Always retains train ID of train1
function advtrains.couple_trains(train1, t1_is_front, train2, t2_is_front) function advtrains.couple_trains(init_train, invert_init_train, stat_train, stat_train_opposite)
--atdebug("Couple trains init=",init_train.id,"stat=",stat_train.id,"statreverse=",stat_must_reverse) --atdebug("Couple trains init=",init_train.id,"initinv=",invert_init_train,"stat=",stat_train.id,"statreverse=",stat_train_opposite)
-- see comment on top of file
if t1_is_front then
advtrains.invert_train(train1.id)
end
if not t2_is_front then
advtrains.invert_train(train2.id)
end
advtrains.do_connect_trains(train1, train2) if not advtrains.train_ensure_init(init_train.id, init_train) then
end atwarn("Coupling: initiating train",init_train.id,"is not initialized! Operation aborted!")
-- Adds the wagons of first to second and deletes second_id afterwards
-- Assumes that second_id stands right behind first_id and both trains point to the same direction
function advtrains.do_connect_trains(first, second)
if not advtrains.train_ensure_init(first.id, first) then
atwarn("Coupling: first train",first.id,"is not initialized! Operation aborted!")
return return
end end
if not advtrains.train_ensure_init(second.id, second) then if not advtrains.train_ensure_init(stat_train.id, stat_train) then
atwarn("Coupling: second train",second.id,"is not initialized! Operation aborted!") atwarn("Coupling: stationary train",stat_train.id,"is not initialized! Operation aborted!")
return return
end end
local first_wagoncnt=#first.trainparts -- only used with the couple entity
local second_wagoncnt=#second.trainparts if invert_init_train then
advtrains.invert_train(init_train.id)
for _,v in ipairs(second.trainparts) do
table.insert(first.trainparts, v)
end end
advtrains.remove_train(second.id) local itp = init_train.trainparts
local init_wagoncnt = #itp
local stp = stat_train.trainparts
local stat_wagoncnt = #stp
local stat_trainlen = stat_train.trainlen -- save the train length of stat train, to be added to index
first.velocity = 0 if stat_train_opposite then
-- insert wagons in inverse order and set their wagon_flipped state
for i=1,stat_wagoncnt do
table.insert(itp, 1, stp[i])
local wdata = advtrains.wagons[stp[i]]
if wdata then
wdata.wagon_flipped = not wdata.wagon_flipped
else
atwarn("While coupling, wagon",stp[i],"of stationary train",stat_train.id,"not found!")
end
end
else
--insert wagons in normal order
for i=stat_wagoncnt,1,-1 do
table.insert(itp, 1, stp[i])
end
end
advtrains.update_trainpart_properties(first.id) -- TODO: migrate some of the properties from stat_train to init_train?
advtrains.couple_invalidate(first)
advtrains.remove_train(stat_train.id)
-- Set train index forward
init_train.index = advtrains.path_get_index_by_offset(init_train, init_train.index, stat_trainlen)
advtrains.update_trainpart_properties(init_train.id)
advtrains.update_train_start_and_end(init_train)
advtrains.couple_invalidate(init_train)
return true return true
end end
-- Couple types matching check
-- returns: true, nil if OK
-- false, errmsg if there is an error
function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front)
-- 1. get wagons
local t1_wid
if t1_front then
t1_wid = t1.trainparts[1]
else
t1_wid = t1.trainparts[#t1.trainparts]
end
local t2_wid
if t2_front then
t2_wid = t2.trainparts[1]
else
t2_wid = t2.trainparts[#t2.trainparts]
end
--atdebug("CMCT: t1_wid",t1_wid,"t2_wid",t2_wid,"")
if not t1_wid or not t2_wid then
return false, "Unable to retrieve wagons from train"--note: no translation needed, case should not occur
end
local t1_wagon = advtrains.wagons[t1_wid]
local t2_wagon = advtrains.wagons[t2_wid]
if not t1_wagon or not t2_wagon then
return false, "At least one of wagons "..t1_wagon.." or "..t2_wagon.." does not exist"--note: no translation needed, case should not occur
end
-- these calls do not fail, they may return placeholder - doesn't matter
local _,t1_wpro = advtrains.get_wagon_prototype(t1_wagon)
local _,t2_wpro = advtrains.get_wagon_prototype(t2_wagon)
-- get correct couplers table (front/back)
local t1_cplt
if not t1_front == not t1_wagon.wagon_flipped then --fancy XOR
t1_cplt = t1_wpro.coupler_types_back
else
t1_cplt = t1_wpro.coupler_types_front
end
local t2_cplt
if not t2_front == not t2_wagon.wagon_flipped then --fancy XOR
t2_cplt = t2_wpro.coupler_types_back
else
t2_cplt = t2_wpro.coupler_types_front
end
--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
return true
end
-- have common coupler?
for typ,_ in pairs(t1_cplt) do
if t2_cplt[typ] then
--atdebug("CMCT: Matching type",typ)
return true
end
end
--no match, give user an info
local t1_cplhr, t2_cplhr = {},{}
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("<none>") 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("<none>") 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
-- DECOUPLING -- -- DECOUPLING --
function advtrains.split_train_at_fc(train, count_empty, length_limit) function advtrains.split_train_at_fc(train, count_empty, length_limit)

View file

@ -0,0 +1,15 @@
% advtrains_speed_lessp(3advtrains) | Advtrains Developer's Manual
# NAME
`advtrains.speed.lessp`, `advtrains.speed.greaterp`, `advtrains.speed.not_lessp`, `advtrains.speed_not_greaterp`, `advtrains.speed.equalp`, `advtrains.speed.not_equalp`, `advtrains.speed.max`, `advtrains.speed.min` - speed restriction comparison functions
# SYNOPSIS
Each function takes two arguments and returns a boolean or (for `advtrains.speed.max` and `advtrains.speed.min`) a valid speed limit
# DESCRIPTION
The functions above correspond to the arithmetic `<`, `>`, `>=`, `<=`, `==`, `~=` operators and the `math.max` and `math.min` functions, respectively. The constants `nil` and `false` are treated as -1.
# NOTES
These functions are trivial to implement and the implementation can be easily embedded into existing code. They are simply provided for convenience.

View file

@ -0,0 +1,18 @@
% advtrains_speed_set_restriction(3advtrains) | Advtrains Developer's Manual
# NAME
`advtrains.speed.set_restriction`, `advtrains.speed.merge_aspect` - modify speed restriction
# SYNOPSIS
* `advtrains.speed.set_restriction(train, rtype, rval)`
* `advtrains.speed.merge_aspect(train, asp)`
# DESCRIPTION
The `advtrains.speed.set_restriction` function sets the speed restriction of type `rtype` of `train` to `rval` and updates the speed restriction value to the strictest speed restriction in the table, or `nil` if all speed restrictions are `nil` or `-1`. If the speed restriction table does not exist, it is created with the `"main"` speed restriction being the speed restriction value of `train`.
The `advtrains.speed.merge_aspect` function merges the main aspect of `asp` into the speed restriction table with the same procedure described above. If the signal aspect table does not provide the type of speed restriction, the restriction type `"main"` is assumed.
# SIDE EFFECTS
Both functions modify `train.speed_restriction` and `train.speed_restrictions_t`.

View file

@ -0,0 +1,24 @@
% signal_aspect(7advtrains) | Advtrains Developer's Manual
# DESCRIPTION
The signal aspect table used by advtrains has the following fields:
* `main`: The main speed restriction
* `dst`: The `main` aspect of the distant signal (not implemented)
* `type`: The type of speed restriction given by the signal
* `shunt`: Whether shunting is allowed
* `proceed_as_main`: Whether to proceed without shunting
The `main` and `dst` fields may contain the following values:
* `-1`: No speed restriction
* `nil`: No information is available
The `type` field can be any valid table index, but it should usually be one of the following values:
* "main": The main signal aspect used before the introduction of speed restriction types. This is the default value if the `type` field is absent.
* "line": The speed limit for the physical line.
* "temp": The speed limit that is temporarily introduced.
# NOTES
A signal with the `main` aspect of zero should not provide distant signal aspect.

View file

@ -198,6 +198,8 @@ advtrains.meseconrules =
advtrains.fpath=minetest.get_worldpath().."/advtrains" advtrains.fpath=minetest.get_worldpath().."/advtrains"
advtrains.speed = dofile(advtrains.modpath.."/speed.lua")
dofile(advtrains.modpath.."/path.lua") dofile(advtrains.modpath.."/path.lua")
dofile(advtrains.modpath.."/trainlogic.lua") dofile(advtrains.modpath.."/trainlogic.lua")
dofile(advtrains.modpath.."/trainhud.lua") dofile(advtrains.modpath.."/trainhud.lua")
@ -467,8 +469,8 @@ advtrains.avt_save = function(remove_players_from_wagons)
"trainparts", "recently_collided_with_env", "trainparts", "recently_collided_with_env",
"atc_brake_target", "atc_wait_finish", "atc_command", "atc_delay", "door_open", "atc_brake_target", "atc_wait_finish", "atc_command", "atc_delay", "door_open",
"text_outside", "text_inside", "line", "routingcode", "text_outside", "text_inside", "line", "routingcode",
"il_sections", "speed_restriction", "is_shunt", "il_sections", "speed_restriction", "speed_restrictions_t", "is_shunt",
"points_split", "autocouple", "ars_disable", "points_split", "autocouple", "atc_wait_autocouple", "ars_disable",
}) })
--then save it --then save it
tmp_trains[id]=v tmp_trains[id]=v

View file

@ -70,3 +70,8 @@ This track can not be removed!=Diese Schiene kann nicht entfernt werden!
Position is occupied by a train.=Ein Zug steht an dieser Position. 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 Track Circuit Break here.=Hier ist eine Gleisabschnittsgrenze (TCB).
There's a Signal Influence Point here.=Hier ist ein Signal-Beeinflussungspunkt. 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)
<none>=<keine>

View file

@ -90,7 +90,7 @@ local function look_ahead(id, train)
--local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + params.BRAKE_SPACE) --local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + params.BRAKE_SPACE)
-- worst case (don't use index_by_offset) -- worst case (don't use index_by_offset)
local brake_i = atfloor(train.index + brakedst + params.BRAKE_SPACE) local brake_i = atfloor(train.index + brakedst + params.BRAKE_SPACE)
atprint("LZB: looking ahead up to ", brake_i) --atprint("LZB: looking ahead up to ", brake_i)
--local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE) --local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE)
@ -134,7 +134,7 @@ local function call_runover_callbacks(id, train)
local ckp = train.lzb.checkpoints local ckp = train.lzb.checkpoints
while ckp[i] do while ckp[i] do
if ckp[i].index <= idx then if ckp[i].index <= idx then
atprint("LZB: checkpoint run over: i=",ckp[i].index,"s=",ckp[i].speed) --atprint("LZB: checkpoint run over: i=",ckp[i].index,"s=",ckp[i].speed,"p=",ckp[i].pos)
-- call callback -- call callback
local it = ckp[i] local it = ckp[i]
if it.callback then if it.callback then
@ -153,7 +153,7 @@ local function apply_checkpoint_to_path(train, checkpoint)
if not checkpoint.speed then if not checkpoint.speed then
return return
end end
atprint("LZB: applying checkpoint: i=",checkpoint.index,"s=",checkpoint.speed) --atprint("LZB: applying checkpoint: i=",checkpoint.index,"s=",checkpoint.speed,"p=",checkpoint.pos)
if checkpoint.speed == 0 then if checkpoint.speed == 0 then
train.lzb.zero_checkpoint = true train.lzb.zero_checkpoint = true
@ -196,6 +196,9 @@ s = v0 * ------- + - * | ------- | = -----------
-- Removes all LZB checkpoints and restarts the traverser at the current train index -- Removes all LZB checkpoints and restarts the traverser at the current train index
function advtrains.lzb_invalidate(train) function advtrains.lzb_invalidate(train)
--advtrains.atprint_context_tid = train.id
--atprint("LZB: invalidate")
--advtrains.atprint_context_tid = nil
train.lzb = { train.lzb = {
trav_index = atfloor(train.index) + 1, trav_index = atfloor(train.index) + 1,
checkpoints = {}, checkpoints = {},
@ -205,8 +208,11 @@ end
-- LZB part of path_invalidate_ahead. Clears all checkpoints that are ahead of start_idx -- LZB part of path_invalidate_ahead. Clears all checkpoints that are ahead of start_idx
-- in contrast to path_inv_ahead, doesn't complain if start_idx is behind train.index, clears everything then -- in contrast to path_inv_ahead, doesn't complain if start_idx is behind train.index, clears everything then
function advtrains.lzb_invalidate_ahead(train, start_idx) function advtrains.lzb_invalidate_ahead(train, start_idx)
--advtrains.atprint_context_tid = train.id
--atprint("LZB: invalidate ahead i=",start_idx)
if train.lzb then if train.lzb then
local idx = atfloor(start_idx) local idx = atfloor(start_idx)
--atprint("LZB: invalidate ahead p=",train.path[start_idx])
local i = 1 local i = 1
while train.lzb.checkpoints[i] do while train.lzb.checkpoints[i] do
if train.lzb.checkpoints[i].index >= idx then if train.lzb.checkpoints[i].index >= idx then
@ -225,6 +231,7 @@ function advtrains.lzb_invalidate_ahead(train, start_idx)
apply_checkpoint_to_path(train, ckp) apply_checkpoint_to_path(train, ckp)
end end
end end
--advtrains.atprint_context_tid = nil
end end
-- Add LZB control point -- Add LZB control point

View file

@ -302,7 +302,7 @@ ndb.run_lbm = function(pos, node)
minetest.swap_node(pos, newnode) minetest.swap_node(pos, newnode)
local ndef=minetest.registered_nodes[nodeid] local ndef=minetest.registered_nodes[nodeid]
if ndef and ndef.advtrains and ndef.advtrains.on_updated_from_nodedb then if ndef and ndef.advtrains and ndef.advtrains.on_updated_from_nodedb then
ndef.advtrains.on_updated_from_nodedb(pos, newnode) ndef.advtrains.on_updated_from_nodedb(pos, newnode, node)
end end
return true return true
end end

View file

@ -18,7 +18,7 @@ end
local function aspect(b) local function aspect(b)
return { return {
main = (not b) and 0, -- b ? false : 0 main = b and -1 or 0,
shunt = false, shunt = false,
proceed_as_main = true, proceed_as_main = true,
dst = false, dst = false,
@ -27,7 +27,7 @@ return {
end end
local suppasp = { local suppasp = {
main = {0, false}, main = {0, -1},
dst = {false}, dst = {false},
shunt = nil, shunt = nil,
proceed_as_main = true, proceed_as_main = true,

View file

@ -0,0 +1,70 @@
package.path = "../?.lua;" .. package.path
advtrains = {}
_G.advtrains = advtrains
local speed = require("speed")
describe("Arithmetic functions on speed restrictions", function()
it("should work", function()
local a = math.random()
local b = math.random(20)
-- This test is basically a "typo check"
assert.is_true (speed.lessp(a, b))
assert.is_false(speed.greaterp(a, b))
assert.is_false(speed.not_lessp(a, b))
assert.is_true (speed.not_greaterp(a, b))
assert.is_false(speed.lessp(a, a))
assert.is_false(speed.greaterp(a, a))
assert.is_true (speed.equalp(a, a))
assert.is_false(speed.not_equalp(a, a))
assert.equal(b, speed.max(a, b))
assert.equal(a, speed.min(a, b))
end)
it("should handle -1", function()
assert.is_false(speed.lessp(-1, math.random()))
end)
it("should handle nil", function()
assert.is_true(speed.greaterp(nil, math.random()))
end)
it("should handle mixed nil and -1", function()
assert.is_true(speed.equalp(nil, -1))
end)
end)
describe("The speed restriction setter", function()
it("should set the signal aspect", function()
local t = {speed_restrictions_t = {x = 5, y = 9}}
local u = {speed_restrictions_t = {x = 7, y = 9}, speed_restriction = 7}
speed.merge_aspect(t, {main = 7, type = "x"})
assert.same(u, t)
end)
it("should work with existing signal aspect tables", function()
local t = {speed_restrictions_t = {main = 5, foo = 3}}
local u = {speed_restrictions_t = {main = 7, foo = 3}, speed_restriction = 3}
speed.merge_aspect(t, {main = 7})
assert.same(u, t)
end)
it("should work with distant signals", function()
local t = {speed_restrictions_t = {main = 5}}
local u = {speed_restrictions_t = {main = 5}, speed_restriction = 5}
speed.merge_aspect(t, {})
assert.same(u, t)
end)
it("should create the restriction table if necessary", function()
local t = {speed_restriction = 5}
local u = {speed_restriction = 3, speed_restrictions_t = {main = 5, foo = 3}}
speed.merge_aspect(t, {main = 3, type = "foo"})
assert.same(u, t)
end)
it("should also create the restriction table for trains without any speed limit", function()
local t = {}
local u = {speed_restrictions_t = {}}
speed.merge_aspect(t, {})
assert.same(u, t)
end)
it("should set the speed restriction to nil if that is the case", function()
local t = {speed_restriction = math.random(20)}
local u = {speed_restrictions_t = {main = -1}}
speed.merge_aspect(t, {main = -1})
assert.same(u, t)
end)
end)

View file

@ -0,0 +1,88 @@
-- auxiliary functions for the reworked speed restriction system
local function s_lessp(a, b)
if not a or a == -1 then
return false
elseif not b or b == -1 then
return true
else
return a < b
end
end
local function s_greaterp(a, b)
return s_lessp(b, a)
end
local function s_not_lessp(a, b)
return not s_lessp(a, b)
end
local function s_not_greaterp(a, b)
return not s_greaterp(a, b)
end
local function s_equalp(a, b)
return (a or -1) == (b or -1)
end
local function s_not_equalp(a, b)
return (a or -1) ~= (b or -1)
end
local function s_max(a, b)
if s_lessp(a, b) then
return b
else
return a
end
end
local function s_min(a, b)
if s_lessp(a, b) then
return a
else
return b
end
end
local function get_speed_restriction_from_table (tbl)
local strictest = -1
for _, v in pairs(tbl) do
strictest = s_min(strictest, v)
end
if strictest == -1 then
return nil
end
return strictest
end
local function set_speed_restriction (tbl, rtype, rval)
if rval then
tbl[rtype or "main"] = rval
end
return tbl
end
local function set_speed_restriction_for_train (train, rtype, rval)
local t = train.speed_restrictions_t or {main = train.speed_restriction}
train.speed_restrictions_t = set_speed_restriction(t, rtype, rval)
train.speed_restriction = get_speed_restriction_from_table(t)
end
local function merge_speed_restriction_from_aspect_to_train (train, asp)
return set_speed_restriction_for_train(train, asp.type, asp.main)
end
return {
lessp = s_lessp,
greaterp = s_greaterp,
not_lessp = s_not_lessp,
not_greaterp = s_not_greaterp,
equalp = s_equalp,
not_equalp = s_not_equalp,
max = s_max,
min = s_min,
set_restriction = set_speed_restriction_for_train,
merge_aspect = merge_speed_restriction_from_aspect_to_train,
}

View file

@ -281,6 +281,8 @@ function advtrains.hud_train_format(train, flip)
local oc = lzb.checkpoints local oc = lzb.checkpoints
for i = 1, #oc do for i = 1, #oc do
local spd = oc[i].speed 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 local c = not spd and "lime" or (type(spd) == "number" and (spd == 0) and "red" or "orange") or nil
if c then if c then
ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c) ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c)

View file

@ -251,6 +251,11 @@ local callbacks_update, run_callbacks_update = mkcallback("update")
local callbacks_create, run_callbacks_create = mkcallback("create") local callbacks_create, run_callbacks_create = mkcallback("create")
local callbacks_remove, run_callbacks_remove = mkcallback("remove") local callbacks_remove, run_callbacks_remove = mkcallback("remove")
-- required to call from couple.lua
function advtrains.update_train_start_and_end(train)
recalc_end_index(train)
run_callbacks_update(train.id, train)
end
-- train_ensure_init: responsible for creating a state that we can work on, after one of the following events has happened: -- train_ensure_init: responsible for creating a state that we can work on, after one of the following events has happened:
-- - the train's path got cleared -- - the train's path got cleared
@ -387,7 +392,7 @@ function advtrains.train_step_b(id, train, dtime)
-- interlocking speed restriction -- interlocking speed restriction
elseif train.speed_restriction then elseif train.speed_restriction then
--atprint("in train_step_b: applying interlocking speed restriction",train.speed_restriction) --atprint("in train_step_b: applying interlocking speed restriction",train.speed_restriction)
sit_v_cap = train.speed_restriction sit_v_cap = math.min(sit_v_cap or math.huge, train.speed_restriction)
end end
--apply off-track handling: --apply off-track handling:
@ -418,9 +423,11 @@ function advtrains.train_step_b(id, train, dtime)
ctrl_lever = userc ctrl_lever = userc
else else
if train.atc_command then if train.atc_command then
if (not train.atc_delay or train.atc_delay<=0) and not train.atc_wait_finish then if (not train.atc_delay or train.atc_delay<=0)
and not train.atc_wait_finish
and not train.atc_wait_autocouple then
advtrains.atc.execute_atc_command(id, train) advtrains.atc.execute_atc_command(id, train)
else elseif train.atc_delay and train.atc_delay > 0 then
train.atc_delay=train.atc_delay-dtime train.atc_delay=train.atc_delay-dtime
end end
elseif train.atc_delay then elseif train.atc_delay then
@ -641,7 +648,8 @@ function advtrains.train_step_b(id, train, dtime)
if target_is_inside then 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)
--atdebug("Backprojected our_index",our_index) --atdebug("Backprojected our_index",our_index)
if our_index and our_index <= new_index_curr_tv then 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
-- ON_TRACK COLLISION IS HAPPENING -- ON_TRACK COLLISION IS HAPPENING
-- the actual collision is handled in train_step_c, so set appropriate signal variables -- the actual collision is handled in train_step_c, so set appropriate signal variables
train.ontrack_collision_info = { train.ontrack_collision_info = {
@ -711,12 +719,15 @@ function advtrains.train_step_c(id, train, dtime)
if train.ontrack_collision_info then if train.ontrack_collision_info then
train.velocity = 0 train.velocity = 0
train.acceleration = 0 train.acceleration = 0
advtrains.atc.train_reset_command(train) --advtrains.atc.train_reset_command(train) will occur in couple_initiate_with if required
local otrn = advtrains.trains[train.ontrack_collision_info.otid] local otrn = advtrains.trains[train.ontrack_collision_info.otid]
if otrn.velocity == 0 then -- other train must be standing, else don't initiate coupling if otrn.velocity == 0 then -- other train must be standing, else don't initiate coupling
advtrains.couple_initiate_with(train, otrn, not train.ontrack_collision_info.same_dir) advtrains.couple_initiate_with(train, otrn, not train.ontrack_collision_info.same_dir)
else
-- other collision - stop any ATC control
advtrains.atc.train_reset_command(train)
end end
train.ontrack_collision_info = nil train.ontrack_collision_info = nil
@ -1108,6 +1119,7 @@ end
function advtrains.split_train_at_index(train, index) function advtrains.split_train_at_index(train, index)
-- this function splits a train at index, creating a new train from the back part of the train. -- this function splits a train at index, creating a new train from the back part of the train.
--atdebug("split_train_at_index invoked on",train.id,"index",index)
local train_id=train.id local train_id=train.id
if index > #train.trainparts then if index > #train.trainparts then
@ -1130,6 +1142,7 @@ function advtrains.split_train_at_index(train, index)
local p_index=advtrains.path_get_index_by_offset(train, train.index, - data.pos_in_train + wagon.wagon_span) local p_index=advtrains.path_get_index_by_offset(train, train.index, - data.pos_in_train + wagon.wagon_span)
local pos, connid, frac = advtrains.path_getrestore(train, p_index) local pos, connid, frac = advtrains.path_getrestore(train, p_index)
--atdebug("new train position p_index",p_index,"pos",pos,"connid",connid,"frac",frac)
local tp = {} local tp = {}
for k,v in ipairs(train.trainparts) do for k,v in ipairs(train.trainparts) do
if k >= index then if k >= index then
@ -1139,11 +1152,13 @@ function advtrains.split_train_at_index(train, index)
end end
advtrains.update_trainpart_properties(train_id) advtrains.update_trainpart_properties(train_id)
recalc_end_index(train) recalc_end_index(train)
--atdebug("old train index",train.index,"end_index",train.end_index)
run_callbacks_update(train_id, train) run_callbacks_update(train_id, train)
--create subtrain --create subtrain
local newtrain_id=advtrains.create_new_train_at(pos, connid, frac, tp) local newtrain_id=advtrains.create_new_train_at(pos, connid, frac, tp)
local newtrain=advtrains.trains[newtrain_id] local newtrain=advtrains.trains[newtrain_id]
--atdebug("new train created with ID",newtrain_id,"index",newtrain.index,"end_index",newtrain.end_index)
newtrain.velocity=train.velocity newtrain.velocity=train.velocity
-- copy various properties from the old to the new train -- copy various properties from the old to the new train
@ -1153,6 +1168,7 @@ function advtrains.split_train_at_index(train, index)
newtrain.line = train.line newtrain.line = train.line
newtrain.routingcode = train.routingcode newtrain.routingcode = train.routingcode
newtrain.speed_restriction = train.speed_restriction newtrain.speed_restriction = train.speed_restriction
newtrain.speed_restrictions_t = table.copy(train.speed_restrictions_t or {main=train.speed_restriction})
newtrain.is_shunt = train.is_shunt newtrain.is_shunt = train.is_shunt
newtrain.points_split = advtrains.merge_tables(train.points_split) newtrain.points_split = advtrains.merge_tables(train.points_split)
newtrain.autocouple = train.autocouple newtrain.autocouple = train.autocouple
@ -1195,10 +1211,10 @@ function advtrains.invert_train(train_id)
-- If interlocking present, check whether this train is in a section and then set as shunt move after reversion -- 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 if advtrains.interlocking and train.il_sections and #train.il_sections > 0 then
train.is_shunt = true train.is_shunt = true
train.speed_restriction = advtrains.SHUNT_SPEED_MAX advtrains.speed.set_restriction(train, "main", advtrains.SHUNT_SPEED_MAX)
else else
train.is_shunt = false train.is_shunt = false
train.speed_restriction = nil advtrains.speed.set_restriction(train, "main", -1)
end end
end end

View file

@ -1316,13 +1316,22 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
minetest.register_entity(":"..sysname,prototype) minetest.register_entity(":"..sysname,prototype)
advtrains.wagon_prototypes[sysname] = prototype advtrains.wagon_prototypes[sysname] = prototype
--group classification to make recipe searching easier
local wagon_groups = { not_in_creative_inventory = nincreative and 1 or 0}
if prototype.is_locomotive then wagon_groups['at_loco'] = 1 end
if prototype.seat_groups then
if prototype.seat_groups.dstand then wagon_groups['at_control'] = 1 end
if prototype.seat_groups.pass then wagon_groups['at_pax'] = 1 end
end
if prototype.has_inventory then wagon_groups['at_freight'] = 1 end
minetest.register_craftitem(":"..sysname, { minetest.register_craftitem(":"..sysname, {
description = desc, description = desc,
inventory_image = inv_img, inventory_image = inv_img,
wield_image = inv_img, wield_image = inv_img,
stack_max = 1, stack_max = 1,
groups = { not_in_creative_inventory = nincreative and 1 or 0}, groups = wagon_groups,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
if not pointed_thing.type == "node" then if not pointed_thing.type == "node" then

View file

@ -14,19 +14,19 @@ local SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX
local il = advtrains.interlocking local il = advtrains.interlocking
local function get_over_function(speed, shunt) local function get_over_function(speed, shunt, asptype)
return function(pos, id, train, index, speed, lzbdata) return function(pos, id, train, index, speed, lzbdata)
if speed == 0 and minetest.settings:get_bool("at_il_force_lzb_halt") then if speed == 0 and minetest.settings:get_bool("at_il_force_lzb_halt") then
atwarn(id,"overrun LZB 0 restriction (red signal) ",pos) atwarn(id,"overrun LZB 0 restriction (red signal) ",pos)
-- Set train 1 index backward. Hope this does not lead to bugs... -- Set train 1 index backward. Hope this does not lead to bugs...
--train.index = index - 0.5 --train.index = index - 0.5
train.speed_restriction = 0 advtrains.speed.set_restriction(train, "main", 0)
--TODO temporary --TODO temporary
--advtrains.drb_dump(id) --advtrains.drb_dump(id)
--error("Debug: "..id.." triggered LZB-0") --error("Debug: "..id.." triggered LZB-0")
else else
train.speed_restriction = speed advtrains.speed.set_restriction(train, asptype, speed or -1)
train.is_shunt = shunt train.is_shunt = shunt
end end
--atdebug("train drove over IP: speed=",speed,"shunt=",shunt) --atdebug("train drove over IP: speed=",speed,"shunt=",shunt)
@ -94,6 +94,7 @@ advtrains.tnc_register_on_approach(function(pos, id, train, index, has_entered,
end end
-- nspd can now be: 1. !=0: new speed restriction, 2. =0: stop here or 3. nil: keep travspd -- nspd can now be: 1. !=0: new speed restriction, 2. =0: stop here or 3. nil: keep travspd
if nspd then if nspd then
travspd = nspd
if nspd == -1 then if nspd == -1 then
travspd = nil travspd = nil
else else
@ -106,7 +107,7 @@ advtrains.tnc_register_on_approach(function(pos, id, train, index, has_entered,
lspd = travspd lspd = travspd
local udata = {signal_pos = spos} local udata = {signal_pos = spos}
local callback = get_over_function(lspd, travsht) local callback = get_over_function(lspd, travsht, asp.type)
lzbdata.il_shunt = travsht lzbdata.il_shunt = travsht
lzbdata.il_speed = travspd lzbdata.il_speed = travspd
--atdebug("new lzbdata",lzbdata) --atdebug("new lzbdata",lzbdata)

View file

@ -133,9 +133,11 @@ function advtrains.interlocking.ars_check(sigd, train)
local tcbs = il.db.get_tcbs(sigd) local tcbs = il.db.get_tcbs(sigd)
if not tcbs or not tcbs.routes then return end if not tcbs or not tcbs.routes then return end
if tcbs.ars_disabled then if tcbs.ars_disabled or tcbs.ars_ignore_next then
-- No-ARS mode of signal. -- No-ARS mode of signal.
-- ignore... -- ignore...
-- Note: ars_ignore_next is set by signalling formspec when route is cancelled
tcbs.ars_ignore_next = nil
return return
end end

View file

@ -634,6 +634,28 @@ function ildb.get_ip_by_signalpos(spos)
end end
end end
end end
function ildb.check_for_duplicate_ip(spos)
local main_ip_found = false
-- first pass: check for duplicates
for pts,tab in pairs(influence_points) do
for connid,pos in pairs(tab) do
if vector.equals(pos, spos) then
if main_ip_found then
atwarn("Signal at",spos,": Deleting duplicate signal influence point at",pts,"/",connid)
tab[connid] = nil
end
main_ip_found = true
end
end
end
-- second pass: delete empty tables
for pts,tab in pairs(influence_points) do
if not tab[1] and not tab[2] then -- only those two connids may exist
influence_points[pts] = nil
end
end
end
-- clear signal assignment given the signal position -- clear signal assignment given the signal position
function ildb.clear_ip_by_signalpos(spos) function ildb.clear_ip_by_signalpos(spos)
local pts, connid = ildb.get_ip_by_signalpos(spos) local pts, connid = ildb.get_ip_by_signalpos(spos)

View file

@ -326,6 +326,7 @@ function advtrains.interlocking.show_ip_form(pos, pname, only_notset)
return return
end end
local form = "size[7,5]label[0.5,0.5;Signal at "..minetest.pos_to_string(pos).."]" local form = "size[7,5]label[0.5,0.5;Signal at "..minetest.pos_to_string(pos).."]"
advtrains.interlocking.db.check_for_duplicate_ip(pos)
local pts, connid = advtrains.interlocking.db.get_ip_by_signalpos(pos) local pts, connid = advtrains.interlocking.db.get_ip_by_signalpos(pos)
if pts then if pts then
form = form.."label[0.5,1.5;Influence point is set at "..pts.."/"..connid.."]" form = form.."label[0.5,1.5;Influence point is set at "..pts.."/"..connid.."]"
@ -428,7 +429,7 @@ function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_
} }
local purpose = p_purpose or "" local purpose = p_purpose or ""
local form = "size[7,5]label[0.5,0.5;Select Signal Aspect:]" local form = "size[7,7]label[0.5,0.5;Select Signal Aspect:]"
form = form.."label[0.5,1;"..purpose.."]" form = form.."label[0.5,1;"..purpose.."]"
form = form.."label[0.5,1.5;== Main Signal ==]" form = form.."label[0.5,1.5;== Main Signal ==]"
@ -461,7 +462,28 @@ function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_
form = form.."dropdown[0.5,3.5;6;shunt_free;---,allowed;"..st.."]" form = form.."dropdown[0.5,3.5;6;shunt_free;---,allowed;"..st.."]"
end end
form = form.."button_exit[0.5,4.5; 5,1;save;OK]" form = form.."label[0.5,4.5;== Distant Signal ==]"
local selid = 1
local entries = {}
for idx, spv in ipairs(suppasp.dst) do
local entry
if spv == 0 then
entry = "Expect to stop at the next signal"
elseif spv == -1 then
entry = "Expect to pass the next signal at maximum speed"
elseif not spv then
entry = "No info"
else
entry = string.format("Expect to pass the next signal at speed of %d", spv)
end
entries[idx] = idx.."| "..entry
if isasp and spv == (isasp.dst or false) then
selid = idx
end
end
form = form.."dropdown[0.5,5;6;dst;"..table.concat(entries, ",")..";"..selid.."]"
form = form.."button_exit[0.5,6;5,1;save;Save signal aspect]"
local token = advtrains.random_id() local token = advtrains.random_id()
@ -499,9 +521,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.save then if fields.save then
local maini = ddindex(fields.main) local maini = ddindex(fields.main)
if not maini then return end if not maini then return end
local dsti = ddindex(fields.dst)
if not dsti then return end
local asp = { local asp = {
main = psl.suppasp.main[maini], main = psl.suppasp.main[maini],
dst = false, dst = psl.suppasp.dst[dsti],
shunt = usebool(psl.suppasp.shunt, fields.shunt_free, "allowed"), shunt = usebool(psl.suppasp.shunt, fields.shunt_free, "allowed"),
info = {} info = {}
} }

View file

@ -0,0 +1,67 @@
-- test the serialization function
package.path = "../?.lua;" .. package.path
_G.advtrains = {}
_G.advtrains.interlocking = {}
require("ars")
local arstb = {{ ln="Foo"}, {c="Bar"}, {n=true, rc="Boo"}}
local arsdef = {{ ln="Foo"}, {c="Bar"}, {rc="Boo"}, default=true}
local arstr = [[LN Foo
#Bar
!RC Boo]]
local defstr = [[*
LN Foo
#Bar
RC Boo]]
il = _G.advtrains.interlocking
describe("ars_to_text", function ()
it("read table", function ()
assert.equals(il.ars_to_text(arstb),arstr)
end)
it("reads back and forth", function ()
assert.equals(il.ars_to_text(il.text_to_ars(arstr)),arstr)
end)
it("handles default routes properly", function ()
assert.equals(il.ars_to_text(arsdef),defstr)
end)
end)
describe("text_to_ars", function ()
it("writes table", function()
assert.same(il.text_to_ars(arstr),arstb)
end)
it("handles default routes properly", function ()
assert.same(il.text_to_ars(defstr),arsdef)
end)
end)
train1 = {}
train2 = {}
train3 = {}
train1.line = "Foo"
train1.routingcode = "Boo"
train2.line= "Bar"
train2.routingcode = "NotBoo NotBoo"
train3.routingcode = "Foo Boo Moo Zoo"
describe("check_rule_match", function ()
it("matches rules correctly", function()
assert.equals(il.ars_check_rule_match(arstb,train1),1)
assert.equals(il.ars_check_rule_match(arsdef,train2),nil)
end)
it("matches negative rules", function()
assert.equals(il.ars_check_rule_match(arstb,train2),3)
assert.equals(il.ars_check_rule_match(arstb,train3),nil)
end)
it("matches RC in a list correctly", function()
assert.equals(il.ars_check_rule_match(arsdef,train3),3)
end)
end)

View file

@ -723,11 +723,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
connid = tonumber(connids) connid = tonumber(connids)
if not connid or connid<1 or connid>2 then return end if not connid or connid<1 or connid>2 then return end
end end
if pos and connid and not fields.quit then if pos and connid then
local sigd = {p=pos, s=connid} local sigd = {p=pos, s=connid}
local tcbs = ildb.get_tcbs(sigd) local tcbs = ildb.get_tcbs(sigd)
if not tcbs then return end if not tcbs then return end
if fields.quit then
-- form quit: disable temporary ARS ignore
tcbs.ars_ignore_next = nil
return
end
local sel_rte local sel_rte
if fields.rtelist then if fields.rtelist then
local tev = minetest.explode_textlist_event(fields.rtelist) local tev = minetest.explode_textlist_event(fields.rtelist)
@ -740,7 +746,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
if tcbs.routeset and fields.cancelroute then if tcbs.routeset and fields.cancelroute then
if tcbs.routes[tcbs.routeset] and tcbs.routes[tcbs.routeset].ars then if tcbs.routes[tcbs.routeset] and tcbs.routes[tcbs.routeset].ars then
tcbs.ars_disabled = true tcbs.ars_ignore_next = true
end end
-- if route committed, cancel route ts info -- if route committed, cancel route ts info
ilrs.update_route(sigd, tcbs, nil, true) ilrs.update_route(sigd, tcbs, nil, true)
@ -749,6 +755,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.newroute and hasprivs then if fields.newroute and hasprivs then
advtrains.interlocking.init_route_prog(pname, sigd) advtrains.interlocking.init_route_prog(pname, sigd)
minetest.close_formspec(pname, formname) minetest.close_formspec(pname, formname)
tcbs.ars_ignore_next = nil
return return
end end
if sel_rte and tcbs.routes[sel_rte] then if sel_rte and tcbs.routes[sel_rte] then

11
mods/advtrains/advtrains_luaautomation/README.md Normal file → Executable file
View file

@ -260,6 +260,8 @@ There are several functions available especially for shunting operations. Some o
- `split_at_index(index, atc_command)` - `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. 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.
`index` must be more than 1 to avoid trying to decouple the very front of a train.
Example: train has wagons `"foo","foo","foo","bar","bar","bar"` Example: train has wagons `"foo","foo","foo","bar","bar","bar"`
Command: `split_at_index(4,"S0")` Command: `split_at_index(4,"S0")`
Result: first train (continues at previous speed): `"foo","foo","foo"`, second train (slows at S0): `"bar","bar","bar"` Result: first train (continues at previous speed): `"foo","foo","foo"`, second train (slows at S0): `"bar","bar","bar"`
@ -312,12 +314,15 @@ Deprecated:
#### Interlocking #### Interlocking
This additional function is available when advtrains_interlocking is enabled: These additional functions are available when advtrains_interlocking is enabled:
- `atc_set_disable_ars(boolean)` - `atc_set_ars_disable(boolean)`
Disables (true) or enables (false) the use of ARS for this train. The train will not trigger ARS (automatic route setting) on signals then. Disables (true) or enables (false) the use of ARS for this train. The train will not trigger ARS (automatic route setting) on signals then.
Note: If you want to disable ARS from an approach callback, the call to `atc_set_disable_ars(true)` *must* happen during the approach callback, and may not be deferred to an interrupt(). Else the train might trigger an ARS before the interrupt fires. Note: If you want to disable ARS from an approach callback, the call to `atc_set_ars_disable(true)` *must* happen during the approach callback, and may not be deferred to an interrupt(). Else the train might trigger an ARS before the interrupt fires.
- `section_occupancy(section_id)`
Returns a table of train ids for the specified section, nil if no section id is provided, false if the section id is invalid, an empty table if the section id is valid but empty of trains.
#### Approach callbacks #### Approach callbacks
The LuaATC interface provides a way to hook into the approach callback system, which is for example used in the TSR rails (provided by advtrains_interlocking) or the station tracks (provided by advtrains_lines). However, for compatibility reasons, this behavior needs to be explicitly enabled. The LuaATC interface provides a way to hook into the approach callback system, which is for example used in the TSR rails (provided by advtrains_interlocking) or the station tracks (provided by advtrains_lines). However, for compatibility reasons, this behavior needs to be explicitly enabled.

View file

@ -14,7 +14,7 @@ end
function ac.after_place_node(pos, player) function ac.after_place_node(pos, player)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
meta:set_string("formspec", ac.getform(pos, meta)) meta:set_string("formspec", ac.getform(pos, meta))
meta:set_string("infotext", "LuaAutomation component, unconfigured.") meta:set_string("infotext", "LuaATC component, unconfigured.")
local ph=minetest.pos_to_string(pos) local ph=minetest.pos_to_string(pos)
--just get first available key! --just get first available key!
for en,_ in pairs(atlatc.envs) do for en,_ in pairs(atlatc.envs) do
@ -48,7 +48,7 @@ function ac.getform(pos, meta_p)
.."button[5,0.2;2,1;save;Save]" .."button[5,0.2;2,1;save;Save]"
.."button[7,0.2;3,1;cle;Clear Local Env.]" .."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).."]" .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;Code;"..minetest.formspec_escape(code).."]"
.."label[0,9.7;"..err.."]" .."label["..atlatc.CODE_FORM_ERRLABELPOS..";"..err.."]"
return form return form
end end
@ -91,17 +91,17 @@ function ac.on_receive_fields(pos, formname, fields, player)
meta:set_string("formspec", ac.getform(pos, meta)) meta:set_string("formspec", ac.getform(pos, meta))
if nodetbl.env then if nodetbl.env then
meta:set_string("infotext", "LuaAutomation component, assigned to environment '"..nodetbl.env.."'") meta:set_string("infotext", "LuaATC component, assigned to environment '"..nodetbl.env.."'")
else else
meta:set_string("infotext", "LuaAutomation component, invalid enviroment set!") meta:set_string("infotext", "LuaATC component, invalid enviroment set!")
end end
end end
function ac.run_in_env(pos, evtdata, customfct_p) function ac.run_in_env(pos, evtdata, customfct_p, ignore_no_code)
local ph=minetest.pos_to_string(pos) local ph=minetest.pos_to_string(pos)
local nodetbl = ac.nodes[ph] local nodetbl = ac.nodes[ph]
if not nodetbl then if not nodetbl then
atwarn("LuaAutomation component at",ph,": Data not in memory! Please visit component and click 'Save'!") atwarn("LuaATC component at",ph,": Data not in memory! Please visit component and click 'Save'!")
return return
end end
@ -111,12 +111,14 @@ function ac.run_in_env(pos, evtdata, customfct_p)
end end
if not nodetbl.env or not atlatc.envs[nodetbl.env] then if not nodetbl.env or not atlatc.envs[nodetbl.env] then
atwarn("LuaAutomation component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>")) atwarn("LuaATC component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>"))
return false return false
end end
local env = atlatc.envs[nodetbl.env] local env = atlatc.envs[nodetbl.env]
if not nodetbl.code or nodetbl.code=="" then if not nodetbl.code or nodetbl.code=="" then
env:log("warning", "LuaAutomation component at",ph,": No code to run! (insert -- to suppress warning)") if not ignore_no_code then
env:log("warning", "LuaATC component at",ph,": No code to run! (insert -- to suppress warning)")
end
return false return false
end end

View file

@ -14,7 +14,7 @@ function r.fire_event(pos, evtdata, appr_internal)
local railtbl = atlatc.active.nodes[ph] local railtbl = atlatc.active.nodes[ph]
if not railtbl then if not railtbl then
atwarn("LuaAutomation ATC interface rail at",ph,": Data not in memory! Please visit position and click 'Save'!") atwarn("LuaATC interface rail at",ph,": Data not in memory! Please visit position and click 'Save'!")
return return
end end
@ -56,7 +56,7 @@ function r.fire_event(pos, evtdata, appr_internal)
split_at_index = function(index, cmd) split_at_index = function(index, cmd)
if not train_id then return false end if not train_id then return false end
assertt(cmd, "string") assertt(cmd, "string")
if type(index) ~= "number" then if type(index) ~= "number" or index < 2 then
return false return false
end end
local new_id = advtrains.split_train_at_index(train, index) local new_id = advtrains.split_train_at_index(train, index)
@ -130,9 +130,8 @@ function r.fire_event(pos, evtdata, appr_internal)
get_rc = function() get_rc = function()
return train.routingcode return train.routingcode
end, end,
atc_reset = function(cmd) atc_reset = function()
if not train_id then return false end if not train_id then return false end
assertt(cmd, "string")
advtrains.atc.train_reset_command(train) advtrains.atc.train_reset_command(train)
return true return true
end, end,
@ -188,7 +187,7 @@ advtrains.register_tracks("default", {
models_prefix="advtrains_dtrack", models_prefix="advtrains_dtrack",
models_suffix=".b3d", models_suffix=".b3d",
shared_texture="advtrains_dtrack_shared_atc.png", shared_texture="advtrains_dtrack_shared_atc.png",
description=atltrans("LuaAutomation ATC Rail"), description=atltrans("LuaATC Rail"),
formats={}, formats={},
get_additional_definiton = function(def, preset, suffix, rotation) get_additional_definiton = function(def, preset, suffix, rotation)
return { return {

14
mods/advtrains/advtrains_luaautomation/environment.lua Normal file → Executable file
View file

@ -150,7 +150,7 @@ local static_env = {
--interrupts are handled per node, position unknown. (same goes for digilines) --interrupts are handled per node, position unknown. (same goes for digilines)
--however external interrupts can be set here. --however external interrupts can be set here.
interrupt_pos = function(parpos, imesg) interrupt_pos = function(parpos, imesg)
local pos=atlatc.pcnaming.resolve_pos(parpos) local pos=atlatc.pcnaming.resolve_pos(parpos, "interrupt_pos")
atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg}) atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg})
end, end,
-- sends an atc command to train regardless of where it is in the world -- sends an atc command to train regardless of where it is in the world
@ -223,6 +223,18 @@ if advtrains.interlocking then
local pos = atlatc.pcnaming.resolve_pos(signal) local pos = atlatc.pcnaming.resolve_pos(signal)
return advtrains.interlocking.signal_set_aspect(pos) return advtrains.interlocking.signal_set_aspect(pos)
end end
--section_occupancy()
static_env.section_occupancy = function(ts_id)
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
end
end end
-- Lines-specific: -- Lines-specific:

View file

@ -14,6 +14,8 @@ minetest.register_privilege("atlatc", { description = "Player can place and modi
--Size of code input forms in X,Y notation. Must be at least 10x10 --Size of code input forms in X,Y notation. Must be at least 10x10
atlatc.CODE_FORM_SIZE = "15,12" atlatc.CODE_FORM_SIZE = "15,12"
--Position of Error Label in Code Form
atlatc.CODE_FORM_ERRLABELPOS = "0,12"
--assertt helper. error if a variable is not of a type --assertt helper. error if a variable is not of a type
function assertt(var, typ) function assertt(var, typ)
@ -31,6 +33,9 @@ dofile(mp.."/interrupt.lua")
dofile(mp.."/active_common.lua") dofile(mp.."/active_common.lua")
dofile(mp.."/atc_rail.lua") dofile(mp.."/atc_rail.lua")
dofile(mp.."/operation_panel.lua") dofile(mp.."/operation_panel.lua")
if mesecon then
dofile(mp.."/mesecon_controller.lua")
end
dofile(mp.."/pcnaming.lua") dofile(mp.."/pcnaming.lua")
dofile(mp.."/chatcmds.lua") dofile(mp.."/chatcmds.lua")

View file

@ -0,0 +1,259 @@
-- mesecon_controller.lua
-- Mesecon-interfaceable Operation Panel alternative
-- Looks like a Mesecon Luacontroller
-- Luacontroller Adapted Code
-- From Mesecons mod https://mesecons.net/
-- (c) Jeija and Contributors
local BASENAME = "advtrains_luaautomation:mesecon_controller"
local rules = {
a = {x = -1, y = 0, z = 0, name="A"},
b = {x = 0, y = 0, z = 1, name="B"},
c = {x = 1, y = 0, z = 0, name="C"},
d = {x = 0, y = 0, z = -1, name="D"},
}
local function generate_name(ports)
local d = ports.d and 1 or 0
local c = ports.c and 1 or 0
local b = ports.b and 1 or 0
local a = ports.a and 1 or 0
return BASENAME..d..c..b..a
end
local function set_port(pos, rule, state)
if state then
mesecon.receptor_on(pos, {rule})
else
mesecon.receptor_off(pos, {rule})
end
end
local function clean_port_states(ports)
ports.a = ports.a and true or false
ports.b = ports.b and true or false
ports.c = ports.c and true or false
ports.d = ports.d and true or false
end
-- Local table for storing which Mesecons off events should be ignored
-- Indexed by hex encoded position
local ignored_off_events = {}
local function set_port_states(pos, ports)
local node = advtrains.ndb.get_node(pos)
local name = node.name
clean_port_states(ports)
local vports = minetest.registered_nodes[name].virtual_portstates
local new_name = generate_name(ports)
if name ~= new_name and vports then
-- Problem:
-- We need to place the new node first so that when turning
-- off some port, it won't stay on because the rules indicate
-- there is an onstate output port there.
-- When turning the output off then, it will however cause feedback
-- so that the luacontroller will receive an "off" event by turning
-- its output off.
-- Solution / Workaround:
-- Remember which output was turned off and ignore next "off" event.
local ph=minetest.pos_to_string(pos)
local railtbl = atlatc.active.nodes[ph]
if not railtbl then return end
local ign = railtbl.ignored_off_events or {}
if ports.a and not vports.a and not mesecon.is_powered(pos, rules.a) then ign.A = true end
if ports.b and not vports.b and not mesecon.is_powered(pos, rules.b) then ign.B = true end
if ports.c and not vports.c and not mesecon.is_powered(pos, rules.c) then ign.C = true end
if ports.d and not vports.d and not mesecon.is_powered(pos, rules.d) then ign.D = true end
railtbl.ignored_off_events = ign
advtrains.ndb.swap_node(pos, {name = new_name, param2 = node.param2})
-- Apply mesecon state only if node loaded
-- If node is not loaded, mesecon update will occur on next load via on_updated_from_nodedb
if advtrains.is_node_loaded(pos) then
if ports.a ~= vports.a then set_port(pos, rules.a, ports.a) end
if ports.b ~= vports.b then set_port(pos, rules.b, ports.b) end
if ports.c ~= vports.c then set_port(pos, rules.c, ports.c) end
if ports.d ~= vports.d then set_port(pos, rules.d, ports.d) end
end
end
end
local function on_updated_from_nodedb(pos, newnode, oldnode)
-- Switch appropriate Mesecon receptors depending on the node change
local vports = minetest.registered_nodes[oldnode.name].virtual_portstates
local ports = minetest.registered_nodes[newnode.name].virtual_portstates
if ports.a ~= vports.a then set_port(pos, rules.a, ports.a) end
if ports.b ~= vports.b then set_port(pos, rules.b, ports.b) end
if ports.c ~= vports.c then set_port(pos, rules.c, ports.c) end
if ports.d ~= vports.d then set_port(pos, rules.d, ports.d) end
end
local function ignore_offevent(pos, rule)
local ph=minetest.pos_to_string(pos)
local railtbl = atlatc.active.nodes[ph]
if not railtbl then return nil end
local ign = railtbl.ignored_off_events
if ign and ign[rule.name] then
ign[rule.name] = nil
return true
end
return false
end
local valid_ports = {a=true, b=true, c=true, d=true}
local function fire_event(pos, evtdata)
local customfct={
set_mesecon_outputs = function(states)
assertt(states, "table")
set_port_states(pos, states)
end,
get_mesecon_input = function(port)
local portl = string.lower(port)
if not valid_ports[portl] then
error("get_mesecon_input: Invalid port (expected a,b,c,d)")
end
if mesecon.is_powered(pos, rules[portl]) then
return true
end
return false
end,
}
atlatc.active.run_in_env(pos, evtdata, customfct, true)
end
local output_rules = {}
local input_rules = {}
local node_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, -- Bottom slab
{-5/16, -7/16, -5/16, 5/16, -6/16, 5/16}, -- Circuit board
{-3/16, -6/16, -3/16, 3/16, -5/16, 3/16}, -- IC
}
}
local selection_box = {
type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 },
}
for a = 0, 1 do -- 0 = off 1 = on
for b = 0, 1 do
for c = 0, 1 do
for d = 0, 1 do
local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a)
local node_name = BASENAME..cid
local top = "atlatc_luacontroller_top.png"
if a == 1 then
top = top.."^atlatc_luacontroller_LED_A.png"
end
if b == 1 then
top = top.."^atlatc_luacontroller_LED_B.png"
end
if c == 1 then
top = top.."^atlatc_luacontroller_LED_C.png"
end
if d == 1 then
top = top.."^atlatc_luacontroller_LED_D.png"
end
local groups
if a + b + c + d ~= 0 then
groups = {dig_immediate=2, not_in_creative_inventory=1, save_in_at_nodedb=1}
else
groups = {dig_immediate=2, save_in_at_nodedb=1}
end
output_rules[cid] = {}
input_rules[cid] = {}
if a == 1 then table.insert(output_rules[cid], rules.a) end
if b == 1 then table.insert(output_rules[cid], rules.b) end
if c == 1 then table.insert(output_rules[cid], rules.c) end
if d == 1 then table.insert(output_rules[cid], rules.d) end
if a == 0 then table.insert( input_rules[cid], rules.a) end
if b == 0 then table.insert( input_rules[cid], rules.b) end
if c == 0 then table.insert( input_rules[cid], rules.c) end
if d == 0 then table.insert( input_rules[cid], rules.d) end
local mesecons = {
effector = {
rules = input_rules[cid],
action_change = function (pos, _, rule_name, new_state)
if new_state == "off" then
-- check for ignored off event on this node
if ignore_offevent(pos, rule_name) then
return
end
end
--Note: rule_name is not a *name* but actually the full rule table (position + name field)
--Event format consistent with Mesecons Luacontroller event
atlatc.interrupt.add(0, pos, {type=new_state, [new_state]=true, pin=rule_name})
end,
},
receptor = {
state = mesecon.state.on,
rules = output_rules[cid]
},
}
minetest.register_node(node_name, {
description = "LuaATC Mesecon Controller",
drawtype = "nodebox",
tiles = {
top,
"atlatc_luacontroller_bottom.png",
"atlatc_luacontroller_sides.png",
"atlatc_luacontroller_sides.png",
"atlatc_luacontroller_sides.png",
"atlatc_luacontroller_sides.png"
},
inventory_image = top,
paramtype = "light",
is_ground_content = false,
groups = groups,
drop = BASENAME.."0000",
sunlight_propagates = true,
selection_box = selection_box,
node_box = node_box,
mesecons = mesecons,
-- Virtual portstates are the ports that
-- the node shows as powered up (light up).
virtual_portstates = {
a = a == 1,
b = b == 1,
c = c == 1,
d = d == 1,
},
after_dig_node = function (pos, node, player)
mesecon.receptor_off(pos, output_rules)
atlatc.active.after_dig_node(pos, node, player)
end,
after_place_node = atlatc.active.after_place_node,
on_receive_fields = atlatc.active.on_receive_fields,
advtrains = {
on_updated_from_nodedb = on_updated_from_nodedb
},
luaautomation = {
fire_event=fire_event
},
digiline = {
receptor = {},
effector = {
action = atlatc.active.on_digiline_receive
},
},
})
end
end
end
end

View file

@ -7,7 +7,7 @@ end
minetest.register_node("advtrains_luaautomation:oppanel", { minetest.register_node("advtrains_luaautomation:oppanel", {
drawtype = "normal", drawtype = "normal",
tiles={"atlatc_oppanel.png"}, tiles={"atlatc_oppanel.png"},
description = "LuaAutomation operation panel", description = "LuaATC operation panel",
groups = { groups = {
cracky = 1, cracky = 1,
save_in_at_nodedb=1, save_in_at_nodedb=1,

View file

@ -44,7 +44,12 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{
return return
end end
local node = advtrains.ndb.get_node(pos) local node = advtrains.ndb.get_node(pos)
if node.name and (minetest.get_item_group(node.name, "advtrains_signal")>0 or advtrains.is_passive(pos)) then local ndef = minetest.registered_nodes[node.name]
if node.name and (
minetest.get_item_group(node.name, "advtrains_signal")>0 --is IL signal
or advtrains.is_passive(pos) -- is passive component
or (ndef and ndef.luaautomation) -- is active component
) then
--look if this one already has a name --look if this one already has a name
local pn="" local pn=""
for name, npos in pairs(atlatc.pcnaming.name_map) do for name, npos in pairs(atlatc.pcnaming.name_map) do

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View file

@ -0,0 +1,52 @@
% advtrains_signals_ks(7advtrains) | Advtrains User Guide
# NAME
`advtrains_signals_ks` - Ks signals for advtrains
# DESCRIPTION
This mod includes a modified subset of German rail signals. This page documents the signals implemented by this mod and some differences between this mod and German signals used in real life.
# SIGNAL ASPECTS
This section mainly describes the different signal aspects. Please note that the meaning of some signal aspects may differ from their RL counterparts, and that the differences documented in the following section are not comprehensive.
Due to historical reasons, "ex-DB" and "ex-DR" are used to refer to the former Deutsche Bundesbahn (West Germany) and the former Deutsche Reichsbahn (East Germany), respectively.
## Ks signals
The Ks signals are used like most other signals in advtrains. It has the following aspects:
* Hp 0 (red light): Stop
* Ks 1 (green light): Proceed at maximum speed or with the speed limit shown on the Zs 3 indicator directly above the signal (if present) and expect to proceed the next main signal at maximum speed or, if the green light is flashing, with the speed limit shown on the Zs 3v indicator directly below the signal
* Ks 2 (yellow light): Proceed at maximum speed or with the speed limit shown on the Zs 3 indicator directly above the signal (if present) and expect to stop in front of the next main signal.
In addition, Sh 1 (see below) may also appear with Hp 0, in which case the train continues in shunt mode.
## Shunt signals
Shunt signals are labeled "Ks Shunting signal" in-game. It has the following aspects:
* Sh 0 (two horizontally aligned red lights): Stop
* Sh 1/(ex-DR) Ra 12 (two white lights aligned on a slanted line): shunting allowed
## Signal signs
There are a few signal signs provided by this mod:
* Zs 3 (white number on a black background): Proceed with the permanent speed limit shown on the sign
* Zs 10 (an sign shaped like an upward-pointing arrow): The speed limit previously set by Zs 3 is lifted
* Lf 1/2 (black number on an orange background): Proceed with the temporary speed limit shown on the sign
* Lf 3 (black letter "E" on a white background): The temporary speed limit previously set by Lf 1/2 is lifted
* Lf 7 (black number on a white background): Proceed with the line speed limit shown on the sign
* Ra 10 (the black text "Halt für Rangierfahrten" on a white semicircle): Do not proceed if in shunt mode
* Proceed as main ("PAM", in-game only) ("S" below a green arrow): Proceed without shunt mode
# DIFFERENCES FROM REAL-LIFE SIGNALING
[This document](https://www.bahnstatistik.de/Signale_pdf/SB-DBAG.pdf) is used for reference,
* The speed is indicated in m/s instead of multiples of 10km/h.
* Due to the potentially large number of nodes, only certain hard-coded values are allowed.
* Certain visual effects, such as making signal signs reflective or lit at night, are not implemented.
* Distant signaling is not yet implemented.
* The location of most signals are not checked. The location of Zs 3 and Zs 3v are only checked relative to the location of the main (Ks) signal.
* The "shunt signals" in this mod are actually known as "Schutzsignale". The word "Rangiersignale" refers to a different set of signals (including acoustic signals) given by the person specifically responsible for train shunting.
* The ex-DB definition of Sh 1 ("Fahrverbot aufgehoben") is that the track section ahead is clear and does not imply that the driver is allowed to proceed.

View file

@ -4,28 +4,78 @@
-- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities" -- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities"
-- advtrains_signal=1 is meant for signals that do not implement set_aspect. -- advtrains_signal=1 is meant for signals that do not implement set_aspect.
local function asp_to_zs3type(asp)
local n = tonumber(asp)
if not n or n < 4 then return "off" end
if n < 8 then return 2*math.floor(n/2) end
return math.min(16,4*math.floor(n/4))
end
local function setzs3(msp, lim, rot)
local pos = {x = msp.x, y = msp.y+1, z = msp.z}
local node = advtrains.ndb.get_node(pos)
local asp = asp_to_zs3type(lim)
if node.name:find("^advtrains_signals_ks:zs3_") then
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:zs3_"..asp.."_"..rot, param2 = node.param2})
end
end
local function getzs3(msp)
local pos = {x = msp.x, y = msp.y+1, z = msp.z}
local nodename = advtrains.ndb.get_node(pos).name
local speed = nodename:match("^advtrains_signals_ks:zs3_(%w+)_%d+$")
if not speed then return nil end
speed = tonumber(speed)
if not speed then return false end
return speed
end
local function setzs3v(msp, lim, rot)
local pos = {x = msp.x, y = msp.y-1, z = msp.z}
local node = advtrains.ndb.get_node(pos)
local asp = asp_to_zs3type(lim)
if node.name:find("^advtrains_signals_ks:zs3v_") then
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:zs3v_"..asp.."_"..rot, param2 = node.param2})
end
end
local function getzs3v(msp)
local pos = {x = msp.x, y = msp.y-1, z = msp.z}
local nodename = advtrains.ndb.get_node(pos).name
local speed = nodename:match("^advtrains_signals_ks:zs3v_(%w+)_%d+$")
if not speed then return nil end
speed = tonumber(speed)
if not speed then return false end
return speed
end
local setaspectf = function(rot) local setaspectf = function(rot)
return function(pos, node, asp) return function(pos, node, asp)
setzs3(pos, asp.main, rot)
if asp.main == 0 then if asp.main == 0 then
if asp.shunt then if asp.shunt then
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_shunt_"..rot, param2 = node.param2}) advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_shunt_"..rot, param2 = node.param2})
else else
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_danger_"..rot, param2 = node.param2}) advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_danger_"..rot, param2 = node.param2})
end end
setzs3v(pos, nil, rot)
else else
if asp.dst ~= 0 and asp.main == -1 then if not asp.dst or asp.dst == -1 then
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_free_"..rot, param2 = node.param2}) advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_free_"..rot, param2 = node.param2})
else elseif asp.dst == 0 then
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_slow_"..rot, param2 = node.param2}) advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_slow_"..rot, param2 = node.param2})
else
advtrains.ndb.swap_node(pos, {name="advtrains_signals_ks:hs_nextslow_"..rot, param2 = node.param2})
end end
setzs3v(pos, asp.dst, rot)
end end
end end
end end
local suppasp = { local suppasp = {
main = {0, 6, -1}, main = {0, 4, 6, 8, 12, 16, -1},
dst = {0, false}, dst = {0, 4, 6, 8, 12, 16, -1, false},
shunt = nil, shunt = nil,
proceed_as_main = true, proceed_as_main = true,
info = { info = {
@ -66,6 +116,10 @@ local suppasp_ra = {
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:hs") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:hs")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:ra") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:ra")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign_lf")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:sign_lf7")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:zs3")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:zs3v")
advtrains.trackplacer.register_tracktype("advtrains_signals_ks:mast") advtrains.trackplacer.register_tracktype("advtrains_signals_ks:mast")
for _, rtab in ipairs({ for _, rtab in ipairs({
@ -77,15 +131,47 @@ for _, rtab in ipairs({
local rot = rtab.rot local rot = rtab.rot
for typ, prts in pairs({ for typ, prts in pairs({
danger = {asp = advtrains.interlocking.DANGER, n = "slow", ici=true}, danger = {asp = advtrains.interlocking.DANGER, n = "slow", ici=true},
slow = {asp = { main = 6, proceed_as_main = true} , n = "free"}, slow = {
free = {asp = { main = -1, proceed_as_main = true} , n = "shunt"}, asp = function(pos)
return { main = getzs3(pos) or -1, proceed_as_main = true, dst = 0 }
end,
n = "nextslow"
},
nextslow = {
asp = function(pos)
return { main = getzs3(pos) or -1, proceed_as_main = true, dst = getzs3v(pos) or 6 }
end,
n = "free"
},
free = {
asp = function(pos)
return { main = getzs3(pos) or -1, proceed_as_main = true, dst = -1 }
end,
n = "shunt"
},
shunt = {asp = { main = 0, shunt = true} , n = "danger"}, shunt = {asp = { main = 0, shunt = true} , n = "danger"},
}) do }) do
local tile = "advtrains_signals_ks_ltm_"..typ..".png"
local afunc = prts.asp
if type(afunc) == "table" then
afunc = function() return prts.asp end
end
if typ == "nextslow" then
tile = {
name = tile,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 1,
}
}
end
minetest.register_node("advtrains_signals_ks:hs_"..typ.."_"..rot, { minetest.register_node("advtrains_signals_ks:hs_"..typ.."_"..rot, {
description = "Ks Main Signal", description = "Ks Main Signal",
drawtype = "mesh", drawtype = "mesh",
mesh = "advtrains_signals_ks_main_smr"..rot..".obj", mesh = "advtrains_signals_ks_main_smr"..rot..".obj",
tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_ltm_"..typ..".png"}, tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png", "advtrains_signals_ks_head.png", tile},
paramtype="light", paramtype="light",
sunlight_propagates=true, sunlight_propagates=true,
@ -108,16 +194,14 @@ for _, rtab in ipairs({
advtrains = { advtrains = {
set_aspect = setaspectf(rot), set_aspect = setaspectf(rot),
supported_aspects = suppasp, supported_aspects = suppasp,
get_aspect = function(pos, node) get_aspect = afunc,
return prts.asp
end,
}, },
on_rightclick = advtrains.interlocking.signal_rc_handler, on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig, can_dig = advtrains.interlocking.signal_can_dig,
after_dig_node = advtrains.interlocking.signal_after_dig, after_dig_node = advtrains.interlocking.signal_after_dig,
}) })
-- rotatable by trackworker -- rotatable by trackworker
advtrains.trackplacer.add_worked("advtrains_signals_ks:hs", typ, "_"..rot, prts.n) advtrains.trackplacer.add_worked("advtrains_signals_ks:hs", typ, "_"..rot)
end end
@ -162,26 +246,16 @@ for _, rtab in ipairs({
after_dig_node = advtrains.interlocking.signal_after_dig, after_dig_node = advtrains.interlocking.signal_after_dig,
}) })
-- rotatable by trackworker -- rotatable by trackworker
advtrains.trackplacer.add_worked("advtrains_signals_ks:ra", typ, "_"..rot, prts.n) advtrains.trackplacer.add_worked("advtrains_signals_ks:ra", typ, "_"..rot)
end end
-- Schilder: -- Schilder:
for typ, prts in pairs({ local function register_sign(prefix, typ, nxt, description, mesh, tile2, dtyp, inv, asp)
-- Speed restrictions: minetest.register_node("advtrains_signals_ks:"..prefix.."_"..typ.."_"..rot, {
["8"] = {asp = { main = 8, shunt = true }, n = "12", ici=true}, description = description,
["12"] = {asp = { main = 12, shunt = true }, n = "16"},
["16"] = {asp = { main = 16, shunt = true }, n = "e"},
-- Speed restriction lifted
["e"] = {asp = { main = -1, shunt = true }, n = "hfs"},
-- Halt for shunt moves:
["hfs"] = {asp = { main = false, shunt = false }, n = "pam"},
["pam"] = {asp = { main = -1, shunt = false, proceed_as_main = true}, n = "8"},
}) do
minetest.register_node("advtrains_signals_ks:sign_"..typ.."_"..rot, {
description = "Signal Sign",
drawtype = "mesh", drawtype = "mesh",
mesh = "advtrains_signals_ks_sign_smr"..rot..".obj", mesh = "advtrains_signals_ks_"..mesh.."_smr"..rot..".obj",
tiles = {"advtrains_signals_ks_signpost.png", "advtrains_signals_ks_sign_"..typ..".png"}, tiles = {"advtrains_signals_ks_signpost.png", tile2},
paramtype="light", paramtype="light",
sunlight_propagates=true, sunlight_propagates=true,
@ -197,22 +271,123 @@ for _, rtab in ipairs({
advtrains_signal = 2, advtrains_signal = 2,
not_blocking_trains = 1, not_blocking_trains = 1,
save_in_at_nodedb = 1, save_in_at_nodedb = 1,
not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1, not_in_creative_inventory = (rtab.ici and typ == dtyp) and 0 or 1,
}, },
drop = "advtrains_signals_ks:sign_8_0", drop = "advtrains_signals_ks:"..prefix.."_"..dtyp.."_0",
inventory_image = "advtrains_signals_ks_sign_8.png", inventory_image = inv,
advtrains = { advtrains = {
-- This is a static signal! No set_aspect get_aspect = function() return asp end
get_aspect = function(pos, node)
return prts.asp
end,
}, },
on_rightclick = advtrains.interlocking.signal_rc_handler, on_rightclick = advtrains.interlocking.signal_rc_handler,
can_dig = advtrains.interlocking.signal_can_dig, can_dig = advtrains.interlocking.signal_can_dig,
after_dig_node = advtrains.interlocking.signal_after_dig, after_dig_node = advtrains.interlocking.signal_after_dig,
}) })
-- rotatable by trackworker -- rotatable by trackworker
advtrains.trackplacer.add_worked("advtrains_signals_ks:sign", typ, "_"..rot, prts.n) advtrains.trackplacer.add_worked("advtrains_signals_ks:"..prefix, typ, "_"..rot, nxt)
end
for typ, prts in pairs {
["hfs"] = {asp = {main = false, shunt = false}, n = "pam", mesh = "_hfs"},
["pam"] = {asp = {main = -1, shunt = false, proceed_as_main = true}, n = "hfs"}
} do
local mesh = prts.mesh or ""
local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)"
if typ == "hfs" then
tile2 = "advtrains_signals_ks_sign_hfs.png"
end
register_sign("sign", typ, prts.n, "Signal Sign", "sign"..mesh, tile2, "hfs", "advtrains_signals_ks_sign_lf7.png", prts.asp)
end
for typ, prts in pairs {
-- Speed restrictions:
["4"] = {asp = { main = 4, shunt = true }, n = "6"},
["6"] = {asp = { main = 6, shunt = true }, n = "8"},
["8"] = {asp = { main = 8, shunt = true }, n = "12"},
["12"] = {asp = { main = 12, shunt = true }, n = "16"},
["16"] = {asp = { main = 16, shunt = true }, n = "e"},
-- Speed restriction lifted
["e"] = {asp = { main = -1, shunt = true }, n = "4", mesh = "_zs10"},
} do
local mesh = tonumber(typ) and "_zs3" or prts.mesh or ""
local tile2 = "[combine:40x40:0,0=\\(advtrains_signals_ks_sign_off.png\\^[resize\\:40x40\\):3,-2=advtrains_signals_ks_sign_"..typ..".png^[invert:rgb"
if typ == "e" then
tile2 = "advtrains_signals_ks_sign_zs10.png"
end
register_sign("sign", typ, prts.n, "Permanent local speed restriction sign", "sign"..mesh, tile2, "8", "advtrains_signals_ks_sign_8.png^[invert:rgb", prts.asp)
end
for typ, prts in pairs {
["4"] = {main = 4, n = "6"},
["6"] = {main = 6, n = "8"},
["8"] = {main = 8, n = "12"},
["12"] = {main = 12, n = "16"},
["16"] = {main = 16, n = "e"},
["e"] = {main = -1, n = "4"},
} do
local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)"..(typ == "e" and "" or "^[multiply:orange")
local inv = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)^[multiply:orange"
register_sign("sign_lf", typ, prts.n, "Temporary local speed restriction sign", "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "temp"})
end
for typ, prts in pairs {
["4"] = {main = 4, n = "6"},
["6"] = {main = 6, n = "8"},
["8"] = {main = 8, n = "12"},
["12"] = {main = 12, n = "16"},
["16"] = {main = 16, n = "20"},
["20"] = {main = 20, n = "4"},
} do
local tile2 = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_"..typ..".png^[makealpha:255,255,255)"
local inv = "advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)"
register_sign("sign_lf7", typ, prts.n, "Line speed restriction sign", "sign", tile2, "8", inv, {main = prts.main, shunt = true, type = "line"})
end
-- Geschwindigkeits(vor)anzeiger für Ks-Signale
for typ, prts in pairs({
["off"] = {n = "4", ici = true},
["4"] = {n = "6"},
["6"] = {n = "8"},
["8"] = {n = "12"},
["12"] = {n = "16"},
["16"] = {n = "off"},
}) do
local def = {
drawtype = "mesh",
tiles = {"advtrains_signals_ks_mast.png","advtrains_signals_ks_head.png","advtrains_signals_ks_sign_"..typ..".png^[invert:rgb^[noalpha"},
paramtype = "light",
sunlight_propagates = true,
light_source = 4,
paramtype2 = "facedir",
selection_box = {
type = "fixed",
fixed = {rtab.sbox, {-1/4, -1/2, -1/4, 1/4, -7/16, 1/4}}
},
groups = {
cracky = 2,
not_blocking_trains = 1,
save_in_at_nodedb = 1,
not_in_creative_inventory = (rtab.ici and prts.ici) and 0 or 1,
},
after_dig_node = function(pos) advtrains.ndb.update(pos) end
}
-- Zs 3
local t = table.copy(def)
t.description = "Ks speed limit indicator"
t.mesh = "advtrains_signals_ks_zs_top_smr"..rot..".obj"
t.drop = "advtrains_signals_ks:zs3_off_0"
t.selection_box.fixed[1][5] = 0
minetest.register_node("advtrains_signals_ks:zs3_"..typ.."_"..rot, t)
advtrains.trackplacer.add_worked("advtrains_signals_ks:zs3", typ, "_"..rot)
-- Zs 3v
local t = table.copy(def)
t.description = "Ks distant speed limit indicator"
t.mesh = "advtrains_signals_ks_zs_bottom_smr"..rot..".obj"
t.drop = "advtrains_signals_ks:zs3v_off_0"
t.tiles[3] = t.tiles[3] .. "^[multiply:yellow"
minetest.register_node("advtrains_signals_ks:zs3v_"..typ.."_"..rot, t)
advtrains.trackplacer.add_worked("advtrains_signals_ks:zs3v", typ, "_"..rot)
end end
minetest.register_node("advtrains_signals_ks:mast_mast_"..rot, { minetest.register_node("advtrains_signals_ks:mast_mast_"..rot, {
@ -284,3 +459,23 @@ minetest.register_craft({
}, },
}) })
sign_material = nil sign_material = nil
minetest.register_craft{
output = "advtrains_signals_ks:sign_8_0 1",
recipe = {{"advtrains_signals_ks:sign_lf7_8_0"}}
}
minetest.register_craft{
output = "advtrains_signals_ks:sign_hfs_0 1",
recipe = {{"advtrains_signals_ks:sign_8_0"}}
}
minetest.register_craft{
output = "advtrains_signals_ks:sign_lf_8_0 1",
recipe = {{"advtrains_signals_ks:sign_hfs_0"}}
}
minetest.register_craft{
output = "advtrains_signals_ks:sign_lf7_8_0 1",
recipe = {{"advtrains_signals_ks:sign_lf_8_0"}}
}

View file

@ -60,7 +60,7 @@ minetest.register_node("advtrains_signals_ks:zs_top", {
type = "fixed", type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
}, },
mesh = "advtrains_signals_ks_zs_top.obj", mesh = "advtrains_signals_ks_zs_top_smr0.obj",
tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"}, tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"},
description="Ks Speed Restriction Signal (top)", description="Ks Speed Restriction Signal (top)",
sunlight_propagates=true, sunlight_propagates=true,
@ -81,7 +81,7 @@ minetest.register_node("advtrains_signals_ks:zs_bottom", {
type = "fixed", type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
}, },
mesh = "advtrains_signals_ks_zs_bottom.obj", mesh = "advtrains_signals_ks_zs_bottom_smr0.obj",
tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"}, tiles = {"advtrains_signals_ks_mast.png", "advtrains_signals_ks_head.png"},
description="Ks Speed Restriction Signal (bottom)", description="Ks Speed Restriction Signal (bottom)",
sunlight_propagates=true, sunlight_propagates=true,

View file

@ -0,0 +1,262 @@
# Blender v2.92.0 OBJ File: 'rangierhalttafel.blend'
# www.blender.org
mtllib advtrains_signals_ks_sign_hfs_smr0.mtl
o Cube
v -0.024805 1.055075 -0.274918
v -0.035079 1.055075 -0.299723
v -0.000000 1.055075 -0.264644
v -0.024805 1.055075 -0.324528
v 0.024805 1.055075 -0.274918
v -0.000000 1.055075 -0.334802
v 0.035079 1.055075 -0.299723
v 0.024805 1.055075 -0.324528
v 0.024805 1.055075 -0.324528
v 0.035079 1.055075 -0.299723
v -0.000000 1.055075 -0.334802
v 0.024805 1.055075 -0.274918
v -0.035079 1.055075 -0.299723
v -0.000000 1.055075 -0.264644
v -0.024805 1.055075 -0.324528
v -0.024805 1.055075 -0.274918
v -0.000000 -0.698893 -0.299723
v -0.035079 -0.499729 -0.299723
v -0.024804 -0.499729 -0.274918
v 0.000000 -0.499729 -0.264644
v 0.024805 -0.499729 -0.274918
v 0.035080 -0.499729 -0.299723
v 0.024805 -0.499729 -0.324528
v 0.000000 -0.499729 -0.334802
v -0.024804 -0.499729 -0.324528
v 0.340021 0.866098 -0.338486
v 0.340021 0.866098 -0.324528
v -0.340022 0.866098 -0.338486
v -0.340022 0.866098 -0.324528
v -0.333488 0.932433 -0.338486
v -0.333488 0.932433 -0.324528
v -0.314139 0.996219 -0.338486
v -0.314139 0.996219 -0.324528
v -0.282718 1.055004 -0.338486
v -0.282718 1.055004 -0.324528
v -0.240432 1.106529 -0.338486
v -0.240432 1.106529 -0.324528
v -0.188906 1.148815 -0.338486
v -0.188906 1.148815 -0.324528
v -0.130121 1.180236 -0.338486
v -0.130121 1.180236 -0.324528
v -0.066335 1.199586 -0.338486
v -0.066335 1.199586 -0.324528
v -0.000000 1.206119 -0.338486
v -0.000000 1.206119 -0.324528
v 0.066335 1.199586 -0.338486
v 0.066335 1.199586 -0.324528
v 0.130121 1.180236 -0.338486
v 0.130121 1.180236 -0.324528
v 0.188906 1.148815 -0.338486
v 0.188906 1.148815 -0.324528
v 0.240431 1.106529 -0.338486
v 0.240431 1.106529 -0.324528
v 0.282717 1.055003 -0.338486
v 0.282717 1.055003 -0.324528
v 0.314139 0.996218 -0.338486
v 0.314139 0.996218 -0.324528
v 0.333488 0.932432 -0.338486
v 0.333488 0.932432 -0.324528
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.009730 0.997467
vt 0.000000 0.983831
vt 0.000000 0.967080
vt 0.009730 0.957025
vt 0.023490 0.959558
vt 0.033220 0.973194
vt 0.033220 0.989946
vt 0.023490 1.000000
vt 0.250000 0.984749
vt 0.250000 0.001193
vt 0.265954 0.000000
vt 0.265954 0.983556
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.983556
vt 0.250000 0.000000
vt 0.265954 0.001193
vt 0.265954 0.984749
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.639500
vt 0.250000 0.005108
vt 0.265954 0.000000
vt 0.265954 0.634392
vt 0.250000 0.634392
vt 0.250000 0.000000
vt 0.265954 0.005108
vt 0.265954 0.639500
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.258978 0.361919
vt 0.250000 0.361919
vt 0.250000 0.331604
vt 0.258978 0.331604
vt 0.250000 0.295958
vt 0.258978 0.295958
vt 0.250000 0.256351
vt 0.258978 0.256351
vt 0.250000 0.214304
vt 0.258978 0.214304
vt 0.250000 0.171433
vt 0.258978 0.171433
vt 0.250000 0.129386
vt 0.258978 0.129386
vt 0.250000 0.089778
vt 0.258978 0.089778
vt 0.250000 0.054132
vt 0.258978 0.054132
vt 0.250000 0.023818
vt 0.258978 0.023818
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258977 0.223103
vt 0.250000 0.223103
vt 0.250000 0.196398
vt 0.258977 0.196398
vt 0.250000 0.163663
vt 0.258977 0.163663
vt 0.250000 0.126156
vt 0.258977 0.126156
vt 0.218691 0.000000
vt 0.218691 0.437382
vt 0.176027 0.433180
vt 0.135002 0.420735
vt 0.097193 0.400526
vt 0.064053 0.373329
vt 0.036856 0.340189
vt 0.016647 0.302381
vt 0.004202 0.261356
vt 0.000000 0.218691
vt 0.004202 0.176027
vt 0.016647 0.135002
vt 0.036856 0.097193
vt 0.064053 0.064053
vt 0.097193 0.036856
vt 0.135001 0.016647
vt 0.176026 0.004202
vt 0.250000 0.085319
vt 0.258977 0.085319
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258978 0.437382
vt 0.250000 0.437382
vt 0.250000 0.042722
vt 0.258977 0.042722
vt 0.250000 0.000000
vt 0.258977 0.000000
vt 0.218691 0.562618
vt 0.218691 1.000000
vt 0.176026 0.995798
vt 0.135001 0.983353
vt 0.097193 0.963144
vt 0.064053 0.935947
vt 0.036856 0.902807
vt 0.016647 0.864998
vt 0.004202 0.823973
vt 0.000000 0.781309
vt 0.004202 0.738644
vt 0.016647 0.697619
vt 0.036856 0.659811
vt 0.064053 0.626671
vt 0.097193 0.599474
vt 0.135002 0.579265
vt 0.176027 0.566820
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn 0.9239 0.0000 0.3827
vn 0.3827 0.0000 0.9239
vn 0.3827 0.0000 -0.9239
vn 0.9239 0.0000 -0.3827
vn -0.3827 -0.0000 0.9239
vn -0.9239 -0.0000 -0.3827
vn -0.9239 -0.0000 0.3827
vn -0.3827 -0.0000 -0.9239
vn -0.9952 0.0980 0.0000
vn -0.9569 0.2903 0.0000
vn -0.8819 0.4714 0.0000
vn -0.7730 0.6344 0.0000
vn -0.6344 0.7730 0.0000
vn -0.4714 0.8819 0.0000
vn -0.2903 0.9569 0.0000
vn -0.0980 0.9952 0.0000
vn 0.0980 0.9952 0.0000
vn 0.2903 0.9569 0.0000
vn 0.4714 0.8819 0.0000
vn 0.6344 0.7730 0.0000
vn 0.7730 0.6344 0.0000
vn 0.8819 0.4714 0.0000
vn -0.0000 -1.0000 0.0000
vn 0.9569 0.2903 0.0000
vn 0.9952 0.0980 0.0000
vn -0.0000 0.0000 -1.0000
g Cube_Cube_Material
usemtl Material
s off
f 8/1/1 6/2/1 11/3/1 9/4/1
f 2/5/1 16/6/1 1/7/1 13/8/1
f 12/9/1 10/10/1 7/11/1 5/12/1
f 6/2/1 4/13/1 15/14/1 11/3/1
f 16/6/1 14/15/1 3/16/1 1/7/1
f 10/10/1 8/1/1 9/4/1 7/11/1
f 4/17/2 2/18/2 16/19/2 14/20/2 12/21/2 10/22/2 8/23/2 6/24/2
f 5/25/3 21/26/3 22/27/3 7/28/3
f 4/13/1 2/5/1 13/8/1 15/14/1
f 14/15/1 12/9/1 5/12/1 3/16/1
f 3/29/4 20/30/4 21/31/4 5/32/4
f 9/33/5 23/34/5 24/35/5 11/36/5
f 7/37/6 22/38/6 23/39/6 9/40/6
f 1/41/7 19/42/7 20/43/7 3/44/7
f 15/45/8 25/46/8 18/47/8 13/48/8
f 13/49/9 18/50/9 19/51/9 1/52/9
f 11/53/10 24/54/10 25/55/10 15/56/10
f 28/57/11 29/58/11 31/59/11 30/60/11
f 30/60/12 31/59/12 33/61/12 32/62/12
f 32/62/13 33/61/13 35/63/13 34/64/13
f 34/64/14 35/63/14 37/65/14 36/66/14
f 36/66/15 37/65/15 39/67/15 38/68/15
f 38/68/16 39/67/16 41/69/16 40/70/16
f 40/70/17 41/69/17 43/71/17 42/72/17
f 42/72/18 43/71/18 45/73/18 44/74/18
f 44/74/19 45/73/19 47/75/19 46/76/19
f 46/76/20 47/75/20 49/77/20 48/78/20
f 48/79/21 49/80/21 51/81/21 50/82/21
f 50/82/22 51/81/22 53/83/22 52/84/22
f 52/84/23 53/83/23 55/85/23 54/86/23
f 29/87/1 27/88/1 59/89/1 57/90/1 55/91/1 53/92/1 51/93/1 49/94/1 47/95/1 45/96/1 43/97/1 41/98/1 39/99/1 37/100/1 35/101/1 33/102/1 31/103/1
f 54/86/24 55/85/24 57/104/24 56/105/24
f 26/106/25 27/107/25 29/108/25 28/109/25
f 56/105/26 57/104/26 59/110/26 58/111/26
f 58/111/27 59/110/27 27/112/27 26/113/27
g Cube_Cube_Display
usemtl Display
f 26/114/28 28/115/28 30/116/28 32/117/28 34/118/28 36/119/28 38/120/28 40/121/28 42/122/28 44/123/28 46/124/28 48/125/28 50/126/28 52/127/28 54/128/28 56/129/28 58/130/28

View file

@ -0,0 +1,262 @@
# Blender v2.92.0 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_hfs_smr30.mtl
o Cube.001
v 0.171853 1.055075 -0.276406
v 0.154594 1.055075 -0.296973
v 0.154594 1.055075 -0.296973
v 0.171853 1.055075 -0.276406
v 0.107281 1.055075 -0.282055
v 0.104941 1.055075 -0.255309
v 0.104941 1.055075 -0.255309
v 0.107281 1.055075 -0.282055
v 0.148945 1.055075 -0.232402
v 0.169512 1.055075 -0.249660
v 0.169512 1.055075 -0.249660
v 0.148945 1.055075 -0.232402
v 0.127848 1.055075 -0.299313
v 0.127848 1.055075 -0.299313
v 0.122199 1.055075 -0.234742
v 0.122199 1.055075 -0.234742
v 0.148945 -0.499729 -0.232402
v 0.169513 -0.499729 -0.249659
v 0.122199 -0.499729 -0.234742
v 0.171853 -0.499729 -0.276406
v 0.154594 -0.499729 -0.296973
v 0.104942 -0.499729 -0.255308
v 0.127849 -0.499729 -0.299313
v 0.107281 -0.499729 -0.282055
v -0.145308 0.866098 -0.457245
v -0.151753 0.866098 -0.444865
v -0.145957 0.932433 -0.441847
v -0.139512 0.932433 -0.454228
v -0.128794 0.996219 -0.432913
v -0.122349 0.996219 -0.445294
v -0.100924 1.055004 -0.418404
v -0.094479 1.055004 -0.430785
v -0.063415 1.106529 -0.398879
v -0.056970 1.106529 -0.411260
v -0.017711 1.148815 -0.375087
v -0.011266 1.148815 -0.387468
v 0.034432 1.180236 -0.347943
v 0.040877 1.180236 -0.360324
v 0.091010 1.199586 -0.318490
v 0.097456 1.199586 -0.330871
v 0.149850 1.206119 -0.287860
v 0.156295 1.206119 -0.300241
v 0.208690 1.199586 -0.257230
v 0.215135 1.199586 -0.269611
v 0.265269 1.180236 -0.227777
v 0.271714 1.180236 -0.240157
v 0.317412 1.148815 -0.200633
v 0.323857 1.148815 -0.213014
v 0.363115 1.106529 -0.176841
v 0.369560 1.106529 -0.189222
v 0.400623 1.055003 -0.157316
v 0.407068 1.055003 -0.169697
v 0.451453 0.866098 -0.130856
v 0.445658 0.932432 -0.133872
v 0.428495 0.996218 -0.142807
v 0.434940 0.996218 -0.155187
v 0.457898 0.866098 -0.143236
v 0.452103 0.932432 -0.146253
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.009730 0.997467
vt 0.000000 0.983831
vt 0.000000 0.967080
vt 0.009730 0.957025
vt 0.023490 0.959558
vt 0.033220 0.973194
vt 0.033220 0.989946
vt 0.023490 1.000000
vt 0.250000 0.984749
vt 0.250000 0.001193
vt 0.265954 0.000000
vt 0.265954 0.983556
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.983556
vt 0.250000 0.000000
vt 0.265954 0.001193
vt 0.265954 0.984749
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.639500
vt 0.250000 0.005108
vt 0.265954 0.000000
vt 0.265954 0.634392
vt 0.250000 0.634392
vt 0.250000 0.000000
vt 0.265954 0.005108
vt 0.265954 0.639500
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.258978 0.361919
vt 0.250000 0.361919
vt 0.250000 0.331604
vt 0.258978 0.331604
vt 0.250000 0.295958
vt 0.258978 0.295958
vt 0.250000 0.256351
vt 0.258978 0.256351
vt 0.250000 0.214304
vt 0.258978 0.214304
vt 0.250000 0.171433
vt 0.258978 0.171433
vt 0.250000 0.129386
vt 0.258978 0.129386
vt 0.250000 0.089778
vt 0.258978 0.089778
vt 0.250000 0.054132
vt 0.258978 0.054132
vt 0.250000 0.023818
vt 0.258978 0.023818
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258977 0.223103
vt 0.250000 0.223103
vt 0.250000 0.196398
vt 0.258977 0.196398
vt 0.250000 0.163663
vt 0.258977 0.163663
vt 0.250000 0.126156
vt 0.258977 0.126156
vt 0.218691 0.000000
vt 0.218691 0.437382
vt 0.176027 0.433180
vt 0.135002 0.420735
vt 0.097193 0.400526
vt 0.064053 0.373329
vt 0.036856 0.340189
vt 0.016647 0.302381
vt 0.004202 0.261356
vt 0.000000 0.218691
vt 0.004202 0.176027
vt 0.016647 0.135002
vt 0.036856 0.097193
vt 0.064053 0.064053
vt 0.097193 0.036856
vt 0.135001 0.016647
vt 0.176026 0.004202
vt 0.250000 0.085319
vt 0.258977 0.085319
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258978 0.437382
vt 0.250000 0.437382
vt 0.250000 0.042722
vt 0.258977 0.042722
vt 0.250000 0.000000
vt 0.258977 0.000000
vt 0.218691 0.562618
vt 0.218691 1.000000
vt 0.176026 0.995798
vt 0.135001 0.983353
vt 0.097193 0.963144
vt 0.064053 0.935947
vt 0.036856 0.902807
vt 0.016647 0.864998
vt 0.004202 0.823973
vt 0.000000 0.781309
vt 0.004202 0.738644
vt 0.016647 0.697619
vt 0.036856 0.659811
vt 0.064053 0.626671
vt 0.097193 0.599474
vt 0.135002 0.579265
vt 0.176027 0.566820
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 -0.0000
vn 0.6428 0.0000 0.7660
vn -0.0872 -0.0000 0.9962
vn 0.7660 0.0000 -0.6428
vn 0.9962 0.0000 0.0872
vn -0.7660 -0.0000 0.6428
vn -0.6428 -0.0000 -0.7660
vn -0.9962 -0.0000 -0.0872
vn 0.0872 -0.0000 -0.9962
vn -0.8827 0.0980 -0.4595
vn -0.8488 0.2903 -0.4419
vn -0.7823 0.4714 -0.4072
vn -0.6857 0.6344 -0.3569
vn -0.5627 0.7730 -0.2929
vn -0.4181 0.8819 -0.2177
vn -0.2575 0.9569 -0.1340
vn -0.0869 0.9952 -0.0453
vn 0.0869 0.9952 0.0453
vn 0.2575 0.9569 0.1340
vn 0.4181 0.8819 0.2177
vn 0.5627 0.7730 0.2929
vn 0.6857 0.6344 0.3569
vn -0.4617 0.0000 0.8870
vn 0.7823 0.4714 0.4072
vn 0.0000 -1.0000 0.0000
vn 0.8488 0.2903 0.4419
vn 0.8827 0.0980 0.4595
vn 0.4617 0.0000 -0.8870
g Cube.001_Cube.001_Material.001
usemtl Material.001
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/1 6/6/1 7/7/1 8/8/1
f 9/9/1 10/10/1 11/11/1 12/12/1
f 2/2/1 13/13/1 14/14/1 3/3/1
f 6/6/1 15/15/1 16/16/1 7/7/1
f 10/10/1 1/1/1 4/4/1 11/11/1
f 13/17/2 5/18/2 6/19/2 15/20/2 9/21/2 10/22/2 1/23/2 2/24/2
f 12/25/3 17/26/3 18/27/3 11/28/3
f 13/13/1 5/5/1 8/8/1 14/14/1
f 15/15/1 9/9/1 12/12/1 16/16/1
f 16/29/4 19/30/4 17/31/4 12/32/4
f 4/33/5 20/34/5 21/35/5 3/36/5
f 11/37/6 18/38/6 20/39/6 4/40/6
f 7/41/7 22/42/7 19/43/7 16/44/7
f 14/45/8 23/46/8 24/47/8 8/48/8
f 8/49/9 24/50/9 22/51/9 7/52/9
f 3/53/10 21/54/10 23/55/10 14/56/10
f 25/57/11 26/58/11 27/59/11 28/60/11
f 28/60/12 27/59/12 29/61/12 30/62/12
f 30/62/13 29/61/13 31/63/13 32/64/13
f 32/64/14 31/63/14 33/65/14 34/66/14
f 34/66/15 33/65/15 35/67/15 36/68/15
f 36/68/16 35/67/16 37/69/16 38/70/16
f 38/70/17 37/69/17 39/71/17 40/72/17
f 40/72/18 39/71/18 41/73/18 42/74/18
f 42/74/19 41/73/19 43/75/19 44/76/19
f 44/76/20 43/75/20 45/77/20 46/78/20
f 46/79/21 45/80/21 47/81/21 48/82/21
f 48/82/22 47/81/22 49/83/22 50/84/22
f 50/84/23 49/83/23 51/85/23 52/86/23
f 26/87/24 53/88/24 54/89/24 55/90/24 51/91/24 49/92/24 47/93/24 45/94/24 43/95/24 41/96/24 39/97/24 37/98/24 35/99/24 33/100/24 31/101/24 29/102/24 27/103/24
f 52/86/25 51/85/25 55/104/25 56/105/25
f 57/106/26 53/107/26 26/108/26 25/109/26
f 56/105/27 55/104/27 54/110/27 58/111/27
f 58/111/28 54/110/28 53/112/28 57/113/28
g Cube.001_Cube.001_Display
usemtl Display
f 57/114/29 25/115/29 28/116/29 30/117/29 32/118/29 34/119/29 36/120/29 38/121/29 40/122/29 42/123/29 44/124/29 46/125/29 48/126/29 50/127/29 52/128/29 56/129/29 58/130/29

View file

@ -0,0 +1,262 @@
# Blender v2.92.0 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_hfs_smr45.mtl
o Cube.001
v 0.247016 1.055075 -0.211936
v 0.236741 1.055075 -0.236741
v 0.236741 1.055075 -0.236741
v 0.247016 1.055075 -0.211936
v 0.187132 1.055075 -0.236741
v 0.176857 1.055075 -0.211936
v 0.176857 1.055075 -0.211936
v 0.187132 1.055075 -0.236741
v 0.211936 1.055075 -0.176857
v 0.236741 1.055075 -0.187132
v 0.236741 1.055075 -0.187132
v 0.211936 1.055075 -0.176857
v 0.211936 1.055075 -0.247016
v 0.211936 1.055075 -0.247016
v 0.187132 1.055075 -0.187132
v 0.187132 1.055075 -0.187132
v 0.211936 -0.499729 -0.176857
v 0.236741 -0.499729 -0.187131
v 0.187132 -0.499729 -0.187132
v 0.247016 -0.499729 -0.211936
v 0.236741 -0.499729 -0.236741
v 0.176857 -0.499729 -0.211935
v 0.211937 -0.499729 -0.247015
v 0.187132 -0.499729 -0.236741
v -0.001086 0.866098 -0.479778
v -0.010956 0.866098 -0.469908
v -0.006336 0.932433 -0.465288
v 0.003534 0.932433 -0.475157
v 0.007346 0.996219 -0.451606
v 0.017216 0.996219 -0.461476
v 0.029564 1.055004 -0.429388
v 0.039434 1.055004 -0.439258
v 0.059465 1.106529 -0.399487
v 0.069335 1.106529 -0.409357
v 0.095899 1.148815 -0.363053
v 0.105769 1.148815 -0.372922
v 0.137466 1.180236 -0.321485
v 0.147336 1.180236 -0.331355
v 0.182570 1.199586 -0.276382
v 0.192440 1.199586 -0.286252
v 0.229476 1.206119 -0.229476
v 0.239346 1.206119 -0.239346
v 0.276382 1.199586 -0.182570
v 0.286252 1.199586 -0.192440
v 0.321485 1.180236 -0.137466
v 0.331355 1.180236 -0.147336
v 0.363053 1.148815 -0.095899
v 0.372922 1.148815 -0.105769
v 0.399486 1.106529 -0.059466
v 0.409356 1.106529 -0.069335
v 0.429387 1.055003 -0.029565
v 0.439257 1.055003 -0.039435
v 0.469907 0.866098 0.010955
v 0.465288 0.932432 0.006336
v 0.451606 0.996218 -0.007346
v 0.461476 0.996218 -0.017216
v 0.479777 0.866098 0.001085
v 0.475157 0.932432 -0.003534
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.009730 0.997467
vt 0.000000 0.983831
vt 0.000000 0.967080
vt 0.009730 0.957025
vt 0.023490 0.959558
vt 0.033220 0.973194
vt 0.033220 0.989946
vt 0.023490 1.000000
vt 0.250000 0.984749
vt 0.250000 0.001193
vt 0.265954 0.000000
vt 0.265954 0.983556
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.983556
vt 0.250000 0.000000
vt 0.265954 0.001193
vt 0.265954 0.984749
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.639500
vt 0.250000 0.005108
vt 0.265954 0.000000
vt 0.265954 0.634392
vt 0.250000 0.634392
vt 0.250000 0.000000
vt 0.265954 0.005108
vt 0.265954 0.639500
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.258978 0.361919
vt 0.250000 0.361919
vt 0.250000 0.331604
vt 0.258978 0.331604
vt 0.250000 0.295958
vt 0.258978 0.295958
vt 0.250000 0.256351
vt 0.258978 0.256351
vt 0.250000 0.214304
vt 0.258978 0.214304
vt 0.250000 0.171433
vt 0.258978 0.171433
vt 0.250000 0.129386
vt 0.258978 0.129386
vt 0.250000 0.089778
vt 0.258978 0.089778
vt 0.250000 0.054132
vt 0.258978 0.054132
vt 0.250000 0.023818
vt 0.258978 0.023818
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258977 0.223103
vt 0.250000 0.223103
vt 0.250000 0.196398
vt 0.258977 0.196398
vt 0.250000 0.163663
vt 0.258977 0.163663
vt 0.250000 0.126156
vt 0.258977 0.126156
vt 0.218691 0.000000
vt 0.218691 0.437382
vt 0.176027 0.433180
vt 0.135002 0.420735
vt 0.097193 0.400526
vt 0.064053 0.373329
vt 0.036856 0.340189
vt 0.016647 0.302381
vt 0.004202 0.261356
vt 0.000000 0.218691
vt 0.004202 0.176027
vt 0.016647 0.135002
vt 0.036856 0.097193
vt 0.064053 0.064053
vt 0.097193 0.036856
vt 0.135001 0.016647
vt 0.176026 0.004202
vt 0.250000 0.085319
vt 0.258977 0.085319
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258978 0.437382
vt 0.250000 0.437382
vt 0.250000 0.042722
vt 0.258977 0.042722
vt 0.250000 0.000000
vt 0.258977 0.000000
vt 0.218691 0.562618
vt 0.218691 1.000000
vt 0.176026 0.995798
vt 0.135001 0.983353
vt 0.097193 0.963144
vt 0.064053 0.935947
vt 0.036856 0.902807
vt 0.016647 0.864998
vt 0.004202 0.823973
vt 0.000000 0.781309
vt 0.004202 0.738644
vt 0.016647 0.697619
vt 0.036856 0.659811
vt 0.064053 0.626671
vt 0.097193 0.599474
vt 0.135002 0.579265
vt 0.176027 0.566820
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 -0.0000
vn 0.3827 0.0000 0.9239
vn -0.3827 -0.0000 0.9239
vn 0.9239 0.0000 -0.3827
vn 0.9239 0.0000 0.3827
vn -0.9239 -0.0000 0.3827
vn -0.3827 -0.0000 -0.9239
vn -0.9239 -0.0000 -0.3827
vn 0.3827 -0.0000 -0.9239
vn -0.7037 0.0980 -0.7037
vn -0.6767 0.2903 -0.6767
vn -0.6236 0.4714 -0.6236
vn -0.5466 0.6344 -0.5466
vn -0.4486 0.7730 -0.4486
vn -0.3333 0.8819 -0.3333
vn -0.2053 0.9569 -0.2053
vn -0.0693 0.9952 -0.0693
vn 0.0693 0.9952 0.0693
vn 0.2053 0.9569 0.2053
vn 0.3333 0.8819 0.3333
vn 0.4486 0.7730 0.4486
vn 0.5466 0.6344 0.5466
vn -0.7071 0.0000 0.7071
vn 0.6236 0.4714 0.6236
vn 0.0000 -1.0000 0.0000
vn 0.6767 0.2903 0.6767
vn 0.7037 0.0980 0.7037
vn 0.7071 0.0000 -0.7071
g Cube.001_Cube.001_Material.001
usemtl Material.001
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/1 6/6/1 7/7/1 8/8/1
f 9/9/1 10/10/1 11/11/1 12/12/1
f 2/2/1 13/13/1 14/14/1 3/3/1
f 6/6/1 15/15/1 16/16/1 7/7/1
f 10/10/1 1/1/1 4/4/1 11/11/1
f 13/17/2 5/18/2 6/19/2 15/20/2 9/21/2 10/22/2 1/23/2 2/24/2
f 12/25/3 17/26/3 18/27/3 11/28/3
f 13/13/1 5/5/1 8/8/1 14/14/1
f 15/15/1 9/9/1 12/12/1 16/16/1
f 16/29/4 19/30/4 17/31/4 12/32/4
f 4/33/5 20/34/5 21/35/5 3/36/5
f 11/37/6 18/38/6 20/39/6 4/40/6
f 7/41/7 22/42/7 19/43/7 16/44/7
f 14/45/8 23/46/8 24/47/8 8/48/8
f 8/49/9 24/50/9 22/51/9 7/52/9
f 3/53/10 21/54/10 23/55/10 14/56/10
f 25/57/11 26/58/11 27/59/11 28/60/11
f 28/60/12 27/59/12 29/61/12 30/62/12
f 30/62/13 29/61/13 31/63/13 32/64/13
f 32/64/14 31/63/14 33/65/14 34/66/14
f 34/66/15 33/65/15 35/67/15 36/68/15
f 36/68/16 35/67/16 37/69/16 38/70/16
f 38/70/17 37/69/17 39/71/17 40/72/17
f 40/72/18 39/71/18 41/73/18 42/74/18
f 42/74/19 41/73/19 43/75/19 44/76/19
f 44/76/20 43/75/20 45/77/20 46/78/20
f 46/79/21 45/80/21 47/81/21 48/82/21
f 48/82/22 47/81/22 49/83/22 50/84/22
f 50/84/23 49/83/23 51/85/23 52/86/23
f 26/87/24 53/88/24 54/89/24 55/90/24 51/91/24 49/92/24 47/93/24 45/94/24 43/95/24 41/96/24 39/97/24 37/98/24 35/99/24 33/100/24 31/101/24 29/102/24 27/103/24
f 52/86/25 51/85/25 55/104/25 56/105/25
f 57/106/26 53/107/26 26/108/26 25/109/26
f 56/105/27 55/104/27 54/110/27 58/111/27
f 58/111/28 54/110/28 53/112/28 57/113/28
g Cube.001_Cube.001_Display
usemtl Display
f 57/114/29 25/115/29 28/116/29 30/117/29 32/118/29 34/119/29 36/120/29 38/121/29 40/122/29 42/123/29 44/124/29 46/125/29 48/126/29 50/127/29 52/128/29 56/129/29 58/130/29

View file

@ -0,0 +1,262 @@
# Blender v2.92.0 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_hfs_smr60.mtl
o Cube.001
v 0.303593 1.055075 -0.117324
v 0.302187 1.055075 -0.144136
v 0.302187 1.055075 -0.144136
v 0.303593 1.055075 -0.117324
v 0.255424 1.055075 -0.160696
v 0.237458 1.055075 -0.140744
v 0.237458 1.055075 -0.140744
v 0.255424 1.055075 -0.160696
v 0.258816 1.055075 -0.095967
v 0.285627 1.055075 -0.097372
v 0.285627 1.055075 -0.097372
v 0.258816 1.055075 -0.095967
v 0.282235 1.055075 -0.162102
v 0.282235 1.055075 -0.162102
v 0.238864 1.055075 -0.113932
v 0.238864 1.055075 -0.113932
v 0.258816 -0.499729 -0.095967
v 0.285628 -0.499729 -0.097371
v 0.238864 -0.499729 -0.113932
v 0.303593 -0.499729 -0.117324
v 0.302187 -0.499729 -0.144136
v 0.237459 -0.499729 -0.140743
v 0.282236 -0.499729 -0.162101
v 0.255424 -0.499729 -0.160696
v 0.159129 0.866098 -0.452621
v 0.146531 0.866098 -0.446612
v 0.149344 0.932433 -0.440714
v 0.161942 0.932433 -0.446723
v 0.157674 0.996219 -0.423250
v 0.170272 0.996219 -0.429259
v 0.171201 1.055004 -0.394890
v 0.183799 1.055004 -0.400899
v 0.189406 1.106529 -0.356723
v 0.202004 1.106529 -0.362732
v 0.211588 1.148815 -0.310217
v 0.224186 1.148815 -0.316226
v 0.236896 1.180236 -0.257158
v 0.249494 1.180236 -0.263167
v 0.264356 1.199586 -0.199586
v 0.276954 1.199586 -0.205595
v 0.292914 1.206119 -0.139713
v 0.305512 1.206119 -0.145722
v 0.321472 1.199586 -0.079840
v 0.334070 1.199586 -0.085849
v 0.348933 1.180236 -0.022268
v 0.361531 1.180236 -0.028277
v 0.374240 1.148815 0.030791
v 0.386839 1.148815 0.024782
v 0.396422 1.106529 0.077297
v 0.409021 1.106529 0.071287
v 0.414627 1.055003 0.115463
v 0.427225 1.055003 0.109454
v 0.439297 0.866098 0.167185
v 0.436484 0.932432 0.161288
v 0.428155 0.996218 0.143824
v 0.440753 0.996218 0.137815
v 0.451895 0.866098 0.161176
v 0.449083 0.932432 0.155279
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.033220 0.437382
vt 0.009730 0.997467
vt 0.000000 0.983831
vt 0.000000 0.967080
vt 0.009730 0.957025
vt 0.023490 0.959558
vt 0.033220 0.973194
vt 0.033220 0.989946
vt 0.023490 1.000000
vt 0.250000 0.984749
vt 0.250000 0.001193
vt 0.265954 0.000000
vt 0.265954 0.983556
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.983556
vt 0.250000 0.000000
vt 0.265954 0.001193
vt 0.265954 0.984749
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.250000 0.639500
vt 0.250000 0.005108
vt 0.265954 0.000000
vt 0.265954 0.634392
vt 0.250000 0.634392
vt 0.250000 0.000000
vt 0.265954 0.005108
vt 0.265954 0.639500
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.265954 0.000000
vt 0.265954 1.000000
vt 0.258978 0.361919
vt 0.250000 0.361919
vt 0.250000 0.331604
vt 0.258978 0.331604
vt 0.250000 0.295958
vt 0.258978 0.295958
vt 0.250000 0.256351
vt 0.258978 0.256351
vt 0.250000 0.214304
vt 0.258978 0.214304
vt 0.250000 0.171433
vt 0.258978 0.171433
vt 0.250000 0.129386
vt 0.258978 0.129386
vt 0.250000 0.089778
vt 0.258978 0.089778
vt 0.250000 0.054132
vt 0.258978 0.054132
vt 0.250000 0.023818
vt 0.258978 0.023818
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258977 0.223103
vt 0.250000 0.223103
vt 0.250000 0.196398
vt 0.258977 0.196398
vt 0.250000 0.163663
vt 0.258977 0.163663
vt 0.250000 0.126156
vt 0.258977 0.126156
vt 0.218691 0.000000
vt 0.218691 0.437382
vt 0.176027 0.433180
vt 0.135002 0.420735
vt 0.097193 0.400526
vt 0.064053 0.373329
vt 0.036856 0.340189
vt 0.016647 0.302381
vt 0.004202 0.261356
vt 0.000000 0.218691
vt 0.004202 0.176027
vt 0.016647 0.135002
vt 0.036856 0.097193
vt 0.064053 0.064053
vt 0.097193 0.036856
vt 0.135001 0.016647
vt 0.176026 0.004202
vt 0.250000 0.085319
vt 0.258977 0.085319
vt 0.250000 0.000000
vt 0.258978 0.000000
vt 0.258978 0.437382
vt 0.250000 0.437382
vt 0.250000 0.042722
vt 0.258977 0.042722
vt 0.250000 0.000000
vt 0.258977 0.000000
vt 0.218691 0.562618
vt 0.218691 1.000000
vt 0.176026 0.995798
vt 0.135001 0.983353
vt 0.097193 0.963144
vt 0.064053 0.935947
vt 0.036856 0.902807
vt 0.016647 0.864998
vt 0.004202 0.823973
vt 0.000000 0.781309
vt 0.004202 0.738644
vt 0.016647 0.697619
vt 0.036856 0.659811
vt 0.064053 0.626671
vt 0.097193 0.599474
vt 0.135002 0.579265
vt 0.176027 0.566820
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 -0.0000
vn 0.0523 0.0000 0.9986
vn -0.6691 -0.0000 0.7431
vn 0.9986 0.0000 -0.0524
vn 0.7431 0.0000 0.6691
vn -0.9986 -0.0000 0.0523
vn -0.0523 -0.0000 -0.9986
vn -0.7431 -0.0000 -0.6691
vn 0.6691 -0.0000 -0.7431
vn -0.4284 0.0980 -0.8982
vn -0.4120 0.2903 -0.8637
vn -0.3797 0.4714 -0.7960
vn -0.3328 0.6344 -0.6977
vn -0.2731 0.7730 -0.5726
vn -0.2029 0.8819 -0.4255
vn -0.1250 0.9569 -0.2620
vn -0.0422 0.9952 -0.0885
vn 0.0422 0.9952 0.0885
vn 0.1250 0.9569 0.2620
vn 0.2029 0.8819 0.4255
vn 0.2731 0.7730 0.5726
vn 0.3328 0.6344 0.6977
vn -0.9026 0.0000 0.4305
vn 0.3797 0.4714 0.7960
vn 0.0000 -1.0000 0.0000
vn 0.4120 0.2903 0.8637
vn 0.4284 0.0980 0.8982
vn 0.9026 0.0000 -0.4305
g Cube.001_Cube.001_Material.001
usemtl Material.001
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/1 6/6/1 7/7/1 8/8/1
f 9/9/1 10/10/1 11/11/1 12/12/1
f 2/2/1 13/13/1 14/14/1 3/3/1
f 6/6/1 15/15/1 16/16/1 7/7/1
f 10/10/1 1/1/1 4/4/1 11/11/1
f 13/17/2 5/18/2 6/19/2 15/20/2 9/21/2 10/22/2 1/23/2 2/24/2
f 12/25/3 17/26/3 18/27/3 11/28/3
f 13/13/1 5/5/1 8/8/1 14/14/1
f 15/15/1 9/9/1 12/12/1 16/16/1
f 16/29/4 19/30/4 17/31/4 12/32/4
f 4/33/5 20/34/5 21/35/5 3/36/5
f 11/37/6 18/38/6 20/39/6 4/40/6
f 7/41/7 22/42/7 19/43/7 16/44/7
f 14/45/8 23/46/8 24/47/8 8/48/8
f 8/49/9 24/50/9 22/51/9 7/52/9
f 3/53/10 21/54/10 23/55/10 14/56/10
f 25/57/11 26/58/11 27/59/11 28/60/11
f 28/60/12 27/59/12 29/61/12 30/62/12
f 30/62/13 29/61/13 31/63/13 32/64/13
f 32/64/14 31/63/14 33/65/14 34/66/14
f 34/66/15 33/65/15 35/67/15 36/68/15
f 36/68/16 35/67/16 37/69/16 38/70/16
f 38/70/17 37/69/17 39/71/17 40/72/17
f 40/72/18 39/71/18 41/73/18 42/74/18
f 42/74/19 41/73/19 43/75/19 44/76/19
f 44/76/20 43/75/20 45/77/20 46/78/20
f 46/79/21 45/80/21 47/81/21 48/82/21
f 48/82/22 47/81/22 49/83/22 50/84/22
f 50/84/23 49/83/23 51/85/23 52/86/23
f 26/87/24 53/88/24 54/89/24 55/90/24 51/91/24 49/92/24 47/93/24 45/94/24 43/95/24 41/96/24 39/97/24 37/98/24 35/99/24 33/100/24 31/101/24 29/102/24 27/103/24
f 52/86/25 51/85/25 55/104/25 56/105/25
f 57/106/26 53/107/26 26/108/26 25/109/26
f 56/105/27 55/104/27 54/110/27 58/111/27
f 58/111/28 54/110/28 53/112/28 57/113/28
g Cube.001_Cube.001_Display
usemtl Display
f 57/114/29 25/115/29 28/116/29 30/117/29 32/118/29 34/119/29 36/120/29 38/121/29 40/122/29 42/123/29 44/124/29 46/125/29 48/126/29 50/127/29 52/128/29 56/129/29 58/130/29

View file

@ -0,0 +1,227 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_zs10_smr0.mtl
o Cube.001
v 0.000000 1.300000 -0.324543
v 0.100000 1.200000 -0.324543
v 0.100000 1.200000 -0.344543
v 0.000000 1.300000 -0.344543
v -0.100000 1.200000 -0.344543
v -0.100000 1.200000 -0.324543
v 0.000000 0.800000 -0.344543
v 0.100000 0.700000 -0.344543
v 0.100000 0.700000 -0.324543
v 0.000000 0.800000 -0.324543
v -0.100000 0.700000 -0.344543
v -0.100000 0.700000 -0.324543
v 0.100000 0.800000 -0.324543
v 0.000000 0.900000 -0.324543
v 0.100000 0.900000 -0.324543
v 0.000000 1.000000 -0.324543
v 0.100000 1.000000 -0.324543
v 0.000000 1.100000 -0.324543
v 0.100000 1.100000 -0.324543
v 0.000000 1.200000 -0.324543
v -0.100000 0.800000 -0.324543
v -0.100000 0.900000 -0.324543
v -0.100000 1.000000 -0.324543
v -0.100000 1.100000 -0.324543
v 0.100000 0.800000 -0.344543
v 0.100000 0.900000 -0.344543
v 0.100000 1.000000 -0.344543
v 0.100000 1.100000 -0.344543
v -0.100000 0.800000 -0.344543
v -0.100000 0.900000 -0.344543
v -0.100000 1.000000 -0.344543
v -0.100000 1.100000 -0.344543
v 0.024805 1.055075 -0.324528
v 0.000000 1.055075 -0.334802
v 0.000000 1.055075 -0.334802
v 0.024805 1.055075 -0.324528
v -0.035079 1.055075 -0.299723
v -0.024805 1.055075 -0.274918
v -0.024805 1.055075 -0.274918
v -0.035079 1.055075 -0.299723
v 0.024805 1.055075 -0.274918
v 0.035079 1.055075 -0.299723
v 0.035079 1.055075 -0.299723
v 0.024805 1.055075 -0.274918
v -0.024805 1.055075 -0.324528
v -0.024805 1.055075 -0.324528
v 0.000000 1.055075 -0.264644
v 0.000000 1.055075 -0.264644
v 0.024805 -0.499729 -0.274918
v 0.035080 -0.499729 -0.299723
v 0.000000 -0.499729 -0.264644
v 0.024805 -0.499729 -0.324528
v 0.000000 -0.499729 -0.334802
v -0.024804 -0.499729 -0.274918
v -0.024804 -0.499729 -0.324528
v -0.035079 -0.499729 -0.299723
vt 0.583333 0.875000
vt 0.583333 0.750000
vt 0.583333 0.500000
vt 0.583333 0.375000
vt 0.583333 0.250000
vt 0.583333 1.000000
vt 0.250000 0.500000
vt 0.375000 0.500000
vt 0.375000 0.750000
vt 0.250000 0.750000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.416667 0.750000
vt 0.416667 0.875000
vt 0.375000 0.875000
vt 0.458333 0.750000
vt 0.458333 0.875000
vt 0.500000 0.750000
vt 0.500000 0.875000
vt 0.541667 0.750000
vt 0.541667 0.875000
vt 0.416667 1.000000
vt 0.375000 1.000000
vt 0.458333 1.000000
vt 0.500000 1.000000
vt 0.541667 1.000000
vt 0.416667 0.500000
vt 0.458333 0.500000
vt 0.500000 0.500000
vt 0.541667 0.500000
vt 0.375000 0.000000
vt 0.416667 0.000000
vt 0.416667 0.250000
vt 0.375000 0.250000
vt 0.458333 0.000000
vt 0.458333 0.250000
vt 0.500000 0.000000
vt 0.500000 0.250000
vt 0.541667 0.000000
vt 0.541667 0.250000
vt 0.583333 0.000000
vt 0.372863 0.578719
vt 0.372317 0.613951
vt 0.371666 0.613734
vt 0.372221 0.578991
vt 0.315877 0.640082
vt 0.292344 0.614764
vt 0.292986 0.614492
vt 0.316131 0.639438
vt 0.315346 0.553400
vt 0.349331 0.553400
vt 0.349077 0.554044
vt 0.315664 0.554020
vt 0.349861 0.640082
vt 0.349543 0.639462
vt 0.292889 0.579531
vt 0.293541 0.579748
vt 0.444102 0.636706
vt 0.409596 0.636706
vt 0.385196 0.612306
vt 0.385196 0.577799
vt 0.409596 0.553400
vt 0.444102 0.553400
vt 0.468502 0.577800
vt 0.468502 0.612306
vt 0.037160 1.987962
vt 0.036793 0.000397
vt 0.071486 0.000384
vt 0.071853 1.987948
vt 0.002468 1.987974
vt 0.002100 0.000409
vt 0.106546 1.987936
vt 0.106179 0.000371
vt 0.140872 0.000358
vt 0.141239 1.987923
vt 0.245318 1.987885
vt 0.244951 0.000319
vt 0.279643 0.000307
vt 0.280011 1.987871
vt 0.175932 1.987910
vt 0.175565 0.000345
vt 0.210258 0.000332
vt 0.210625 1.987897
vt 0.125000 1.000000
vt 0.000000 1.000000
vt -0.000000 0.875000
vt 0.000000 0.750000
vt 0.000000 0.625000
vt 0.000000 0.500000
vt 0.000000 0.375000
vt 0.125000 0.375000
vt 0.250000 0.875000
vt 0.250000 1.000000
vt 0.250000 0.375000
vt 0.250000 0.500000
vt 0.250000 0.625000
vt 0.250000 0.750000
vn 0.0001 -0.7071 0.7071
vn 0.9239 0.3827 -0.0000
vn -0.0000 0.3827 -0.9239
vn 0.0002 -0.7071 -0.7071
vn -0.9239 0.3827 0.0000
vn 0.0000 0.3827 0.9239
vn -0.7071 -0.7071 0.0000
vn 0.7071 -0.7071 0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.9239 0.0000 0.3827
vn 0.3827 -0.0000 0.9239
vn 0.3827 0.0000 -0.9239
vn 0.9239 0.0000 -0.3827
vn -0.3827 -0.0000 0.9239
vn -0.9239 -0.0000 -0.3827
vn -0.9239 -0.0000 0.3827
vn -0.3827 -0.0000 -0.9239
vn 0.0000 0.0000 -1.0000
g Cube.001_Cube.001_Default_OBJ
usemtl Default_OBJ
s off
f 1/1/1 2/2/2 3/3/3 4/4/4 5/5/5 6/6/6
f 7/7/7 8/8/7 9/9/7 10/10/7
f 11/11/8 7/7/8 10/10/8 12/12/8
f 9/9/9 13/13/9 14/14/9 10/15/9
f 13/13/9 15/16/9 16/17/9 14/14/9
f 15/16/9 17/18/9 18/19/9 16/17/9
f 17/18/9 19/20/9 20/21/9 18/19/9
f 19/20/9 2/2/9 1/1/9 20/21/9
f 10/15/9 14/14/9 21/22/9 12/23/9
f 14/14/9 16/17/9 22/24/9 21/22/9
f 16/17/9 18/19/9 23/25/9 22/24/9
f 18/19/9 20/21/9 24/26/9 23/25/9
f 20/21/9 1/1/9 6/6/9 24/26/9
f 8/8/10 25/27/10 13/13/10 9/9/10
f 25/27/10 26/28/10 15/16/10 13/13/10
f 26/28/10 27/29/10 17/18/10 15/16/10
f 27/29/10 28/30/10 19/20/10 17/18/10
f 28/30/10 3/3/10 2/2/10 19/20/10
f 12/31/11 21/32/11 29/33/11 11/34/11
f 21/32/11 22/35/11 30/36/11 29/33/11
f 22/35/11 23/37/11 31/38/11 30/36/11
f 23/37/11 24/39/11 32/40/11 31/38/11
f 24/39/11 6/41/11 5/5/11 32/40/11
s 1
f 33/42/9 34/43/9 35/44/9 36/45/9
f 37/46/9 38/47/9 39/48/9 40/49/9
f 41/50/9 42/51/9 43/52/9 44/53/9
f 34/43/9 45/54/9 46/55/9 35/44/9
f 38/47/9 47/56/9 48/57/9 39/48/9
f 42/51/9 33/42/9 36/45/9 43/52/9
f 45/58/12 37/59/12 38/60/12 47/61/12 41/62/12 42/63/12 33/64/12 34/65/12
f 44/66/13 49/67/13 50/68/13 43/69/13
f 45/54/9 37/46/9 40/49/9 46/55/9
f 47/56/9 41/50/9 44/53/9 48/57/9
f 48/70/14 51/71/14 49/67/14 44/66/14
f 36/72/15 52/73/15 53/74/15 35/75/15
f 43/69/16 50/68/16 52/73/16 36/72/16
f 39/76/17 54/77/17 51/78/17 48/79/17
f 46/80/18 55/81/18 56/82/18 40/83/18
f 40/83/19 56/82/19 54/77/19 39/76/19
f 35/75/20 53/74/20 55/81/20 46/80/20
g Cube.001_Cube.001_Anzeige
usemtl Anzeige
s off
f 4/84/21 3/85/21 28/86/21 27/87/21 26/88/21 25/89/21 8/90/21 7/91/21
f 32/92/21 5/93/21 4/84/21 7/91/21 11/94/21 29/95/21 30/96/21 31/97/21

View file

@ -0,0 +1,228 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_zs10_smr30.mtl
o Cube.001
v 0.144810 1.300000 -0.290445
v 0.234304 1.200000 -0.245825
v 0.243228 1.200000 -0.263724
v 0.153734 1.300000 -0.308343
v 0.064241 1.200000 -0.352963
v 0.055317 1.200000 -0.335064
v 0.153734 0.800000 -0.308343
v 0.243228 0.700000 -0.263724
v 0.234304 0.700000 -0.245825
v 0.144810 0.800000 -0.290445
v 0.064241 0.700000 -0.352963
v 0.055317 0.700000 -0.335064
v 0.234304 0.800000 -0.245825
v 0.144810 0.900000 -0.290445
v 0.234304 0.900000 -0.245825
v 0.144810 1.000000 -0.290445
v 0.234304 1.000000 -0.245825
v 0.144810 1.100000 -0.290445
v 0.234304 1.100000 -0.245825
v 0.144810 1.200000 -0.290445
v 0.055317 0.800000 -0.335064
v 0.055317 0.900000 -0.335064
v 0.055317 1.000000 -0.335064
v 0.055317 1.100000 -0.335064
v 0.243228 0.800000 -0.263724
v 0.243228 0.900000 -0.263724
v 0.243228 1.000000 -0.263724
v 0.243228 1.100000 -0.263724
v 0.064241 0.800000 -0.352963
v 0.064241 0.900000 -0.352963
v 0.064241 1.000000 -0.352963
v 0.064241 1.100000 -0.352963
v 0.167003 1.055075 -0.279363
v 0.149388 1.055075 -0.299626
v 0.149388 1.055075 -0.299626
v 0.167003 1.055075 -0.279363
v 0.102342 1.055075 -0.283885
v 0.100469 1.055075 -0.257101
v 0.100469 1.055075 -0.257101
v 0.102342 1.055075 -0.283885
v 0.144867 1.055075 -0.234966
v 0.165129 1.055075 -0.252580
v 0.165129 1.055075 -0.252580
v 0.144867 1.055075 -0.234966
v 0.122605 1.055075 -0.301499
v 0.122605 1.055075 -0.301499
v 0.118084 1.055075 -0.236839
v 0.118084 1.055075 -0.236839
v 0.144867 -0.499729 -0.234966
v 0.165130 -0.499729 -0.252580
v 0.118084 -0.499729 -0.236839
v 0.167003 -0.499729 -0.279363
v 0.149388 -0.499729 -0.299626
v 0.100470 -0.499729 -0.257101
v 0.122606 -0.499729 -0.301499
v 0.102342 -0.499729 -0.283885
vt 0.583333 0.875000
vt 0.583333 0.750000
vt 0.583333 0.500000
vt 0.583333 0.375000
vt 0.583333 0.250000
vt 0.583333 1.000000
vt 0.250000 0.500000
vt 0.375000 0.500000
vt 0.375000 0.750000
vt 0.250000 0.750000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.416667 0.750000
vt 0.416667 0.875000
vt 0.375000 0.875000
vt 0.458333 0.750000
vt 0.458333 0.875000
vt 0.500000 0.750000
vt 0.500000 0.875000
vt 0.541667 0.750000
vt 0.541667 0.875000
vt 0.416667 1.000000
vt 0.375000 1.000000
vt 0.458333 1.000000
vt 0.500000 1.000000
vt 0.541667 1.000000
vt 0.416667 0.500000
vt 0.458333 0.500000
vt 0.500000 0.500000
vt 0.541667 0.500000
vt 0.375000 0.000000
vt 0.416667 0.000000
vt 0.416667 0.250000
vt 0.375000 0.250000
vt 0.458333 0.000000
vt 0.458333 0.250000
vt 0.500000 0.000000
vt 0.500000 0.250000
vt 0.541667 0.000000
vt 0.541667 0.250000
vt 0.583333 0.000000
vt 0.372863 0.578719
vt 0.372317 0.613951
vt 0.371666 0.613734
vt 0.372221 0.578991
vt 0.315877 0.640082
vt 0.292344 0.614764
vt 0.292986 0.614492
vt 0.316131 0.639438
vt 0.315346 0.553400
vt 0.349331 0.553400
vt 0.349077 0.554044
vt 0.315664 0.554020
vt 0.349861 0.640082
vt 0.349543 0.639462
vt 0.292889 0.579531
vt 0.293541 0.579748
vt 0.444102 0.636706
vt 0.409596 0.636706
vt 0.385196 0.612306
vt 0.385196 0.577799
vt 0.409596 0.553400
vt 0.444102 0.553400
vt 0.468502 0.577800
vt 0.468502 0.612306
vt 0.037160 1.987962
vt 0.036793 0.000397
vt 0.071486 0.000384
vt 0.071853 1.987948
vt 0.002468 1.987974
vt 0.002100 0.000409
vt 0.106546 1.987936
vt 0.106179 0.000371
vt 0.140872 0.000358
vt 0.141239 1.987923
vt 0.245318 1.987885
vt 0.244951 0.000319
vt 0.279643 0.000307
vt 0.280011 1.987871
vt 0.175932 1.987910
vt 0.175565 0.000345
vt 0.210258 0.000332
vt 0.210625 1.987897
vt 0.125000 1.000000
vt 0.000000 1.000000
vt -0.000000 0.875000
vt 0.000000 0.750000
vt 0.000000 0.625000
vt 0.000000 0.500000
vt 0.000000 0.375000
vt 0.125000 0.375000
vt 0.250000 0.875000
vt 0.250000 1.000000
vt 0.250000 0.375000
vt 0.250000 0.500000
vt 0.250000 0.625000
vt 0.250000 0.750000
vn -0.3152 -0.7071 0.6329
vn 0.8268 0.3827 0.4122
vn 0.4122 0.3827 -0.8268
vn 0.3156 -0.7071 -0.6327
vn -0.8268 0.3827 -0.4122
vn -0.4122 0.3827 0.8268
vn -0.6328 -0.7071 -0.3155
vn 0.6328 -0.7071 0.3155
vn -0.4462 -0.0000 0.8949
vn 0.8949 -0.0000 0.4462
vn -0.8949 0.0000 -0.4462
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 -0.0000
vn 0.6561 0.0000 0.7547
vn -0.0698 -0.0000 0.9976
vn 0.7547 0.0000 -0.6561
vn 0.9976 0.0000 0.0698
vn -0.7547 -0.0000 0.6561
vn -0.6561 -0.0000 -0.7547
vn -0.9976 -0.0000 -0.0698
vn 0.0698 -0.0000 -0.9976
vn 0.4462 0.0000 -0.8949
g Cube.001_Cube.001_Default_OBJ
usemtl Default_OBJ
s off
f 1/1/1 2/2/2 3/3/3 4/4/4 5/5/5 6/6/6
f 7/7/7 8/8/7 9/9/7 10/10/7
f 11/11/8 7/7/8 10/10/8 12/12/8
f 9/9/9 13/13/9 14/14/9 10/15/9
f 13/13/9 15/16/9 16/17/9 14/14/9
f 15/16/9 17/18/9 18/19/9 16/17/9
f 17/18/9 19/20/9 20/21/9 18/19/9
f 19/20/9 2/2/9 1/1/9 20/21/9
f 10/15/9 14/14/9 21/22/9 12/23/9
f 14/14/9 16/17/9 22/24/9 21/22/9
f 16/17/9 18/19/9 23/25/9 22/24/9
f 18/19/9 20/21/9 24/26/9 23/25/9
f 20/21/9 1/1/9 6/6/9 24/26/9
f 8/8/10 25/27/10 13/13/10 9/9/10
f 25/27/10 26/28/10 15/16/10 13/13/10
f 26/28/10 27/29/10 17/18/10 15/16/10
f 27/29/10 28/30/10 19/20/10 17/18/10
f 28/30/10 3/3/10 2/2/10 19/20/10
f 12/31/11 21/32/11 29/33/11 11/34/11
f 21/32/11 22/35/11 30/36/11 29/33/11
f 22/35/11 23/37/11 31/38/11 30/36/11
f 23/37/11 24/39/11 32/40/11 31/38/11
f 24/39/11 6/41/11 5/5/11 32/40/11
s 1
f 33/42/12 34/43/12 35/44/12 36/45/12
f 37/46/12 38/47/12 39/48/12 40/49/12
f 41/50/12 42/51/12 43/52/12 44/53/12
f 34/43/12 45/54/12 46/55/12 35/44/12
f 38/47/12 47/56/12 48/57/12 39/48/12
f 42/51/12 33/42/12 36/45/12 43/52/12
f 45/58/13 37/59/13 38/60/13 47/61/13 41/62/13 42/63/13 33/64/13 34/65/13
f 44/66/14 49/67/14 50/68/14 43/69/14
f 45/54/12 37/46/12 40/49/12 46/55/12
f 47/56/12 41/50/12 44/53/12 48/57/12
f 48/70/15 51/71/15 49/67/15 44/66/15
f 36/72/16 52/73/16 53/74/16 35/75/16
f 43/69/17 50/68/17 52/73/17 36/72/17
f 39/76/18 54/77/18 51/78/18 48/79/18
f 46/80/19 55/81/19 56/82/19 40/83/19
f 40/83/20 56/82/20 54/77/20 39/76/20
f 35/75/21 53/74/21 55/81/21 46/80/21
g Cube.001_Cube.001_Anzeige
usemtl Anzeige
s off
f 4/84/22 3/85/22 28/86/22 27/87/22 26/88/22 25/89/22 8/90/22 7/91/22
f 32/92/22 5/93/22 4/84/22 7/91/22 11/94/22 29/95/22 30/96/22 31/97/22

View file

@ -0,0 +1,228 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_zs10_smr45.mtl
o Cube.001
v 0.229487 1.300000 -0.229487
v 0.300197 1.200000 -0.158776
v 0.314339 1.200000 -0.172918
v 0.243629 1.300000 -0.243629
v 0.172918 1.200000 -0.314339
v 0.158776 1.200000 -0.300197
v 0.243629 0.800000 -0.243629
v 0.314339 0.700000 -0.172918
v 0.300197 0.700000 -0.158776
v 0.229487 0.800000 -0.229487
v 0.172918 0.700000 -0.314339
v 0.158776 0.700000 -0.300197
v 0.300197 0.800000 -0.158776
v 0.229487 0.900000 -0.229487
v 0.300197 0.900000 -0.158776
v 0.229487 1.000000 -0.229487
v 0.300197 1.000000 -0.158776
v 0.229487 1.100000 -0.229487
v 0.300197 1.100000 -0.158776
v 0.229487 1.200000 -0.229487
v 0.158776 0.800000 -0.300197
v 0.158776 0.900000 -0.300197
v 0.158776 1.000000 -0.300197
v 0.158776 1.100000 -0.300197
v 0.314339 0.800000 -0.172918
v 0.314339 0.900000 -0.172918
v 0.314339 1.000000 -0.172918
v 0.314339 1.100000 -0.172918
v 0.172918 0.800000 -0.314339
v 0.172918 0.900000 -0.314339
v 0.172918 1.000000 -0.314339
v 0.172918 1.100000 -0.314339
v 0.247016 1.055075 -0.211936
v 0.236741 1.055075 -0.236741
v 0.236741 1.055075 -0.236741
v 0.247016 1.055075 -0.211936
v 0.187132 1.055075 -0.236741
v 0.176857 1.055075 -0.211936
v 0.176857 1.055075 -0.211936
v 0.187132 1.055075 -0.236741
v 0.211936 1.055075 -0.176857
v 0.236741 1.055075 -0.187132
v 0.236741 1.055075 -0.187132
v 0.211936 1.055075 -0.176857
v 0.211936 1.055075 -0.247016
v 0.211936 1.055075 -0.247016
v 0.187132 1.055075 -0.187132
v 0.187132 1.055075 -0.187132
v 0.211936 -0.499729 -0.176857
v 0.236741 -0.499729 -0.187131
v 0.187132 -0.499729 -0.187132
v 0.247016 -0.499729 -0.211936
v 0.236741 -0.499729 -0.236741
v 0.176857 -0.499729 -0.211935
v 0.211937 -0.499729 -0.247015
v 0.187132 -0.499729 -0.236741
vt 0.583333 0.875000
vt 0.583333 0.750000
vt 0.583333 0.500000
vt 0.583333 0.375000
vt 0.583333 0.250000
vt 0.583333 1.000000
vt 0.250000 0.500000
vt 0.375000 0.500000
vt 0.375000 0.750000
vt 0.250000 0.750000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.416667 0.750000
vt 0.416667 0.875000
vt 0.375000 0.875000
vt 0.458333 0.750000
vt 0.458333 0.875000
vt 0.500000 0.750000
vt 0.500000 0.875000
vt 0.541667 0.750000
vt 0.541667 0.875000
vt 0.416667 1.000000
vt 0.375000 1.000000
vt 0.458333 1.000000
vt 0.500000 1.000000
vt 0.541667 1.000000
vt 0.416667 0.500000
vt 0.458333 0.500000
vt 0.500000 0.500000
vt 0.541667 0.500000
vt 0.375000 0.000000
vt 0.416667 0.000000
vt 0.416667 0.250000
vt 0.375000 0.250000
vt 0.458333 0.000000
vt 0.458333 0.250000
vt 0.500000 0.000000
vt 0.500000 0.250000
vt 0.541667 0.000000
vt 0.541667 0.250000
vt 0.583333 0.000000
vt 0.372863 0.578719
vt 0.372317 0.613951
vt 0.371666 0.613734
vt 0.372221 0.578991
vt 0.315877 0.640082
vt 0.292344 0.614764
vt 0.292986 0.614492
vt 0.316131 0.639438
vt 0.315346 0.553400
vt 0.349331 0.553400
vt 0.349077 0.554044
vt 0.315664 0.554020
vt 0.349861 0.640082
vt 0.349543 0.639462
vt 0.292889 0.579531
vt 0.293541 0.579748
vt 0.444102 0.636706
vt 0.409596 0.636706
vt 0.385196 0.612306
vt 0.385196 0.577799
vt 0.409596 0.553400
vt 0.444102 0.553400
vt 0.468502 0.577800
vt 0.468502 0.612306
vt 0.037160 1.987962
vt 0.036793 0.000397
vt 0.071486 0.000384
vt 0.071853 1.987948
vt 0.002468 1.987974
vt 0.002100 0.000409
vt 0.106546 1.987936
vt 0.106179 0.000371
vt 0.140872 0.000358
vt 0.141239 1.987923
vt 0.245318 1.987885
vt 0.244951 0.000319
vt 0.279643 0.000307
vt 0.280011 1.987871
vt 0.175932 1.987910
vt 0.175565 0.000345
vt 0.210258 0.000332
vt 0.210625 1.987897
vt 0.125000 1.000000
vt 0.000000 1.000000
vt -0.000000 0.875000
vt 0.000000 0.750000
vt 0.000000 0.625000
vt 0.000000 0.500000
vt 0.000000 0.375000
vt 0.125000 0.375000
vt 0.250000 0.875000
vt 0.250000 1.000000
vt 0.250000 0.375000
vt 0.250000 0.500000
vt 0.250000 0.625000
vt 0.250000 0.750000
vn -0.4998 -0.7071 0.5002
vn 0.6533 0.3827 0.6533
vn 0.6533 0.3827 -0.6533
vn 0.5001 -0.7071 -0.4999
vn -0.6533 0.3827 -0.6532
vn -0.6533 0.3827 0.6533
vn -0.5000 -0.7071 -0.5000
vn 0.5000 -0.7071 0.5000
vn -0.7071 0.0000 0.7071
vn 0.7071 0.0000 0.7071
vn -0.7071 0.0000 -0.7071
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 -0.0000
vn 0.3827 0.0000 0.9239
vn -0.3827 -0.0000 0.9239
vn 0.9239 0.0000 -0.3827
vn 0.9239 0.0000 0.3827
vn -0.9239 -0.0000 0.3827
vn -0.3827 -0.0000 -0.9239
vn -0.9239 -0.0000 -0.3827
vn 0.3827 -0.0000 -0.9239
vn 0.7071 0.0000 -0.7071
g Cube.001_Cube.001_Default_OBJ
usemtl Default_OBJ
s off
f 1/1/1 2/2/2 3/3/3 4/4/4 5/5/5 6/6/6
f 7/7/7 8/8/7 9/9/7 10/10/7
f 11/11/8 7/7/8 10/10/8 12/12/8
f 9/9/9 13/13/9 14/14/9 10/15/9
f 13/13/9 15/16/9 16/17/9 14/14/9
f 15/16/9 17/18/9 18/19/9 16/17/9
f 17/18/9 19/20/9 20/21/9 18/19/9
f 19/20/9 2/2/9 1/1/9 20/21/9
f 10/15/9 14/14/9 21/22/9 12/23/9
f 14/14/9 16/17/9 22/24/9 21/22/9
f 16/17/9 18/19/9 23/25/9 22/24/9
f 18/19/9 20/21/9 24/26/9 23/25/9
f 20/21/9 1/1/9 6/6/9 24/26/9
f 8/8/10 25/27/10 13/13/10 9/9/10
f 25/27/10 26/28/10 15/16/10 13/13/10
f 26/28/10 27/29/10 17/18/10 15/16/10
f 27/29/10 28/30/10 19/20/10 17/18/10
f 28/30/10 3/3/10 2/2/10 19/20/10
f 12/31/11 21/32/11 29/33/11 11/34/11
f 21/32/11 22/35/11 30/36/11 29/33/11
f 22/35/11 23/37/11 31/38/11 30/36/11
f 23/37/11 24/39/11 32/40/11 31/38/11
f 24/39/11 6/41/11 5/5/11 32/40/11
s 1
f 33/42/12 34/43/12 35/44/12 36/45/12
f 37/46/12 38/47/12 39/48/12 40/49/12
f 41/50/12 42/51/12 43/52/12 44/53/12
f 34/43/12 45/54/12 46/55/12 35/44/12
f 38/47/12 47/56/12 48/57/12 39/48/12
f 42/51/12 33/42/12 36/45/12 43/52/12
f 45/58/13 37/59/13 38/60/13 47/61/13 41/62/13 42/63/13 33/64/13 34/65/13
f 44/66/14 49/67/14 50/68/14 43/69/14
f 45/54/12 37/46/12 40/49/12 46/55/12
f 47/56/12 41/50/12 44/53/12 48/57/12
f 48/70/15 51/71/15 49/67/15 44/66/15
f 36/72/16 52/73/16 53/74/16 35/75/16
f 43/69/17 50/68/17 52/73/17 36/72/17
f 39/76/18 54/77/18 51/78/18 48/79/18
f 46/80/19 55/81/19 56/82/19 40/83/19
f 40/83/20 56/82/20 54/77/20 39/76/20
f 35/75/21 53/74/21 55/81/21 46/80/21
g Cube.001_Cube.001_Anzeige
usemtl Anzeige
s off
f 4/84/22 3/85/22 28/86/22 27/87/22 26/88/22 25/89/22 8/90/22 7/91/22
f 32/92/22 5/93/22 4/84/22 7/91/22 11/94/22 29/95/22 30/96/22 31/97/22

View file

@ -0,0 +1,228 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_zs10_smr60.mtl
o Cube.001
v 0.290445 1.300000 -0.144810
v 0.335064 1.200000 -0.055317
v 0.352963 1.200000 -0.064241
v 0.308343 1.300000 -0.153734
v 0.263724 1.200000 -0.243228
v 0.245825 1.200000 -0.234304
v 0.308343 0.800000 -0.153734
v 0.352963 0.700000 -0.064241
v 0.335064 0.700000 -0.055317
v 0.290445 0.800000 -0.144810
v 0.263724 0.700000 -0.243228
v 0.245825 0.700000 -0.234304
v 0.335064 0.800000 -0.055317
v 0.290445 0.900000 -0.144810
v 0.335064 0.900000 -0.055317
v 0.290445 1.000000 -0.144810
v 0.335064 1.000000 -0.055317
v 0.290445 1.100000 -0.144810
v 0.335064 1.100000 -0.055317
v 0.290445 1.200000 -0.144810
v 0.245825 0.800000 -0.234304
v 0.245825 0.900000 -0.234304
v 0.245825 1.000000 -0.234304
v 0.245825 1.100000 -0.234304
v 0.352963 0.800000 -0.064241
v 0.352963 0.900000 -0.064241
v 0.352963 1.000000 -0.064241
v 0.352963 1.100000 -0.064241
v 0.263724 0.800000 -0.243228
v 0.263724 0.900000 -0.243228
v 0.263724 1.000000 -0.243228
v 0.263724 1.100000 -0.243228
v 0.301499 1.055075 -0.122605
v 0.299626 1.055075 -0.149388
v 0.299626 1.055075 -0.149388
v 0.301499 1.055075 -0.122605
v 0.252580 1.055075 -0.165129
v 0.234966 1.055075 -0.144867
v 0.234966 1.055075 -0.144867
v 0.252580 1.055075 -0.165129
v 0.257101 1.055075 -0.100469
v 0.283885 1.055075 -0.102342
v 0.283885 1.055075 -0.102342
v 0.257101 1.055075 -0.100469
v 0.279363 1.055075 -0.167002
v 0.279363 1.055075 -0.167002
v 0.236839 1.055075 -0.118084
v 0.236839 1.055075 -0.118084
v 0.257102 -0.499729 -0.100469
v 0.283885 -0.499729 -0.102341
v 0.236839 -0.499729 -0.118084
v 0.301499 -0.499729 -0.122605
v 0.299626 -0.499729 -0.149388
v 0.234966 -0.499729 -0.144866
v 0.279364 -0.499729 -0.167002
v 0.252580 -0.499729 -0.165129
vt 0.583333 0.875000
vt 0.583333 0.750000
vt 0.583333 0.500000
vt 0.583333 0.375000
vt 0.583333 0.250000
vt 0.583333 1.000000
vt 0.250000 0.500000
vt 0.375000 0.500000
vt 0.375000 0.750000
vt 0.250000 0.750000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.416667 0.750000
vt 0.416667 0.875000
vt 0.375000 0.875000
vt 0.458333 0.750000
vt 0.458333 0.875000
vt 0.500000 0.750000
vt 0.500000 0.875000
vt 0.541667 0.750000
vt 0.541667 0.875000
vt 0.416667 1.000000
vt 0.375000 1.000000
vt 0.458333 1.000000
vt 0.500000 1.000000
vt 0.541667 1.000000
vt 0.416667 0.500000
vt 0.458333 0.500000
vt 0.500000 0.500000
vt 0.541667 0.500000
vt 0.375000 0.000000
vt 0.416667 0.000000
vt 0.416667 0.250000
vt 0.375000 0.250000
vt 0.458333 0.000000
vt 0.458333 0.250000
vt 0.500000 0.000000
vt 0.500000 0.250000
vt 0.541667 0.000000
vt 0.541667 0.250000
vt 0.583333 0.000000
vt 0.372863 0.578719
vt 0.372317 0.613951
vt 0.371666 0.613734
vt 0.372221 0.578991
vt 0.315877 0.640082
vt 0.292344 0.614764
vt 0.292986 0.614492
vt 0.316131 0.639438
vt 0.315346 0.553400
vt 0.349331 0.553400
vt 0.349077 0.554044
vt 0.315664 0.554020
vt 0.349861 0.640082
vt 0.349543 0.639462
vt 0.292889 0.579531
vt 0.293541 0.579748
vt 0.444102 0.636706
vt 0.409596 0.636706
vt 0.385196 0.612306
vt 0.385196 0.577799
vt 0.409596 0.553400
vt 0.444102 0.553400
vt 0.468502 0.577800
vt 0.468502 0.612306
vt 0.037160 1.987962
vt 0.036793 0.000397
vt 0.071486 0.000384
vt 0.071853 1.987948
vt 0.002468 1.987974
vt 0.002100 0.000409
vt 0.106546 1.987936
vt 0.106179 0.000371
vt 0.140872 0.000358
vt 0.141239 1.987923
vt 0.245318 1.987885
vt 0.244951 0.000319
vt 0.279643 0.000307
vt 0.280011 1.987871
vt 0.175932 1.987910
vt 0.175565 0.000345
vt 0.210258 0.000332
vt 0.210625 1.987897
vt 0.125000 1.000000
vt 0.000000 1.000000
vt -0.000000 0.875000
vt 0.000000 0.750000
vt 0.000000 0.625000
vt 0.000000 0.500000
vt 0.000000 0.375000
vt 0.125000 0.375000
vt 0.250000 0.875000
vt 0.250000 1.000000
vt 0.250000 0.375000
vt 0.250000 0.500000
vt 0.250000 0.625000
vt 0.250000 0.750000
vn -0.6326 -0.7071 0.3159
vn 0.4123 0.3827 0.8268
vn 0.8268 0.3827 -0.4123
vn 0.6328 -0.7071 -0.3155
vn -0.4123 0.3827 -0.8268
vn -0.8268 0.3827 0.4123
vn -0.3155 -0.7071 -0.6328
vn 0.3155 -0.7071 0.6328
vn -0.8949 0.0000 0.4462
vn 0.4462 0.0000 0.8949
vn -0.4462 0.0000 -0.8949
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn 0.0698 0.0000 0.9976
vn -0.6561 -0.0000 0.7547
vn 0.9976 0.0000 -0.0698
vn 0.7547 0.0000 0.6561
vn -0.9976 -0.0000 0.0698
vn -0.0698 -0.0000 -0.9976
vn -0.7547 -0.0000 -0.6561
vn 0.6561 -0.0000 -0.7547
vn 0.8949 0.0000 -0.4462
g Cube.001_Cube.001_Default_OBJ
usemtl Default_OBJ
s off
f 1/1/1 2/2/2 3/3/3 4/4/4 5/5/5 6/6/6
f 7/7/7 8/8/7 9/9/7 10/10/7
f 11/11/8 7/7/8 10/10/8 12/12/8
f 9/9/9 13/13/9 14/14/9 10/15/9
f 13/13/9 15/16/9 16/17/9 14/14/9
f 15/16/9 17/18/9 18/19/9 16/17/9
f 17/18/9 19/20/9 20/21/9 18/19/9
f 19/20/9 2/2/9 1/1/9 20/21/9
f 10/15/9 14/14/9 21/22/9 12/23/9
f 14/14/9 16/17/9 22/24/9 21/22/9
f 16/17/9 18/19/9 23/25/9 22/24/9
f 18/19/9 20/21/9 24/26/9 23/25/9
f 20/21/9 1/1/9 6/6/9 24/26/9
f 8/8/10 25/27/10 13/13/10 9/9/10
f 25/27/10 26/28/10 15/16/10 13/13/10
f 26/28/10 27/29/10 17/18/10 15/16/10
f 27/29/10 28/30/10 19/20/10 17/18/10
f 28/30/10 3/3/10 2/2/10 19/20/10
f 12/31/11 21/32/11 29/33/11 11/34/11
f 21/32/11 22/35/11 30/36/11 29/33/11
f 22/35/11 23/37/11 31/38/11 30/36/11
f 23/37/11 24/39/11 32/40/11 31/38/11
f 24/39/11 6/41/11 5/5/11 32/40/11
s 1
f 33/42/12 34/43/12 35/44/12 36/45/12
f 37/46/12 38/47/12 39/48/12 40/49/12
f 41/50/12 42/51/12 43/52/12 44/53/12
f 34/43/12 45/54/12 46/55/12 35/44/12
f 38/47/12 47/56/12 48/57/12 39/48/12
f 42/51/12 33/42/12 36/45/12 43/52/12
f 45/58/13 37/59/13 38/60/13 47/61/13 41/62/13 42/63/13 33/64/13 34/65/13
f 44/66/14 49/67/14 50/68/14 43/69/14
f 45/54/12 37/46/12 40/49/12 46/55/12
f 47/56/12 41/50/12 44/53/12 48/57/12
f 48/70/15 51/71/15 49/67/15 44/66/15
f 36/72/16 52/73/16 53/74/16 35/75/16
f 43/69/17 50/68/17 52/73/17 36/72/17
f 39/76/18 54/77/18 51/78/18 48/79/18
f 46/80/19 55/81/19 56/82/19 40/83/19
f 40/83/20 56/82/20 54/77/20 39/76/20
f 35/75/21 53/74/21 55/81/21 46/80/21
g Cube.001_Cube.001_Anzeige
usemtl Anzeige
s off
f 4/84/22 3/85/22 28/86/22 27/87/22 26/88/22 25/89/22 8/90/22 7/91/22
f 32/92/22 5/93/22 4/84/22 7/91/22 11/94/22 29/95/22 30/96/22 31/97/22

View file

@ -0,0 +1,128 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
mtllib advtrains_signals_ks_sign_zs3_smr0.mtl
o Cube.002
v 0.024805 1.055075 -0.324528
v 0.000000 1.055075 -0.334802
v 0.000000 1.055075 -0.334802
v 0.024805 1.055075 -0.324528
v -0.035079 1.055075 -0.299723
v -0.024805 1.055075 -0.274918
v -0.024805 1.055075 -0.274918
v -0.035079 1.055075 -0.299723
v 0.024805 1.055075 -0.274918
v 0.035079 1.055075 -0.299723
v 0.035079 1.055075 -0.299723
v 0.024805 1.055075 -0.274918
v -0.024805 1.055075 -0.324528
v -0.024805 1.055075 -0.324528
v 0.000000 1.055075 -0.264644
v 0.000000 1.055075 -0.264644
v 0.024805 -0.499729 -0.274918
v 0.035080 -0.499729 -0.299723
v 0.324981 1.306899 -0.346144
v 0.324981 1.306899 -0.330481
v 0.000000 0.746135 -0.330481
v 0.000000 0.746135 -0.346144
v -0.324981 1.306899 -0.346144
v -0.324981 1.306899 -0.330481
v 0.000000 -0.499729 -0.264644
v 0.024805 -0.499729 -0.324528
v 0.000000 -0.499729 -0.334802
v -0.024804 -0.499729 -0.274918
v -0.024804 -0.499729 -0.324528
v -0.035079 -0.499729 -0.299723
vt 0.372863 0.578719
vt 0.372317 0.613951
vt 0.371666 0.613734
vt 0.372221 0.578991
vt 0.315877 0.640082
vt 0.292344 0.614764
vt 0.292986 0.614492
vt 0.316131 0.639438
vt 0.315346 0.553400
vt 0.349331 0.553400
vt 0.349077 0.554044
vt 0.315664 0.554020
vt 0.349861 0.640082
vt 0.349543 0.639462
vt 0.292889 0.579531
vt 0.293541 0.579748
vt 0.444102 0.636706
vt 0.409596 0.636706
vt 0.385196 0.612306
vt 0.385196 0.577799
vt 0.409596 0.553400
vt 0.444102 0.553400
vt 0.468502 0.577800
vt 0.468502 0.612306
vt 0.037160 1.987962
vt 0.036793 0.000397
vt 0.071486 0.000384
vt 0.071853 1.987948
vt 0.677908 0.520935
vt 0.657776 0.520935
vt 0.485125 0.020439
vt 0.677907 0.020439
vt 0.312476 0.541067
vt 0.312476 0.520935
vt 0.657776 0.541067
vt 0.292344 0.020439
vt 0.292344 0.520935
vt 0.002468 1.987974
vt 0.002100 0.000409
vt 0.106546 1.987936
vt 0.106179 0.000371
vt 0.140872 0.000358
vt 0.141239 1.987923
vt 0.245318 1.987885
vt 0.244951 0.000319
vt 0.279643 0.000307
vt 0.280011 1.987871
vt 0.175932 1.987910
vt 0.175565 0.000345
vt 0.210258 0.000332
vt 0.210625 1.987897
vt 0.492188 0.003906
vt 1.003906 0.996094
vt -0.023438 0.996094
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn 0.9239 0.0000 0.3827
vn 0.8652 -0.5014 0.0000
vn -0.8652 -0.5014 0.0000
vn 0.3827 -0.0000 0.9239
vn 0.3827 0.0000 -0.9239
vn 0.9239 0.0000 -0.3827
vn -0.3827 -0.0000 0.9239
vn -0.9239 -0.0000 -0.3827
vn -0.9239 -0.0000 0.3827
vn -0.3827 -0.0000 -0.9239
vn 0.0000 0.0000 -1.0000
g Cube.002_Cube.002_Default_OBJ.001
usemtl Default_OBJ.001
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/1 6/6/1 7/7/1 8/8/1
f 9/9/1 10/10/1 11/11/1 12/12/1
f 2/2/1 13/13/1 14/14/1 3/3/1
f 6/6/1 15/15/1 16/16/1 7/7/1
f 10/10/1 1/1/1 4/4/1 11/11/1
f 13/17/2 5/18/2 6/19/2 15/20/2 9/21/2 10/22/2 1/23/2 2/24/2
f 12/25/3 17/26/3 18/27/3 11/28/3
f 13/13/1 5/5/1 8/8/1 14/14/1
f 19/29/4 20/30/4 21/31/4 22/32/4
f 23/33/2 24/34/2 20/30/2 19/35/2
f 21/31/1 20/30/1 24/34/1
f 22/36/5 21/31/5 24/34/5 23/37/5
f 15/15/1 9/9/1 12/12/1 16/16/1
f 16/38/6 25/39/6 17/26/6 12/25/6
f 4/40/7 26/41/7 27/42/7 3/43/7
f 11/28/8 18/27/8 26/41/8 4/40/8
f 7/44/9 28/45/9 25/46/9 16/47/9
f 14/48/10 29/49/10 30/50/10 8/51/10
f 8/51/11 30/50/11 28/45/11 7/44/11
f 3/43/12 27/42/12 29/49/12 14/48/12
g Cube.002_Cube.002_Anzeige
usemtl Anzeige
f 22/52/13 23/53/13 19/54/13

Some files were not shown because too many files have changed in this diff Show more