From f806ed9eee8c13eb0b4868641311d25257c63f46 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Tue, 20 Dec 2016 14:17:39 +0100 Subject: Turning mod into a modpack and separating the trains from the core mod --- advtrains/atc.lua | 4 + advtrains/couple.lua | 154 ++++ advtrains/crafting.lua | 71 ++ advtrains/damage.lua | 26 + advtrains/debugitems.lua | 36 + advtrains/depends.txt | 2 + advtrains/description.txt | 8 + advtrains/helpers.lua | 249 ++++++ advtrains/init.lua | 42 + advtrains/misc_nodes.lua | 67 ++ advtrains/models/advtrains_dtrack_bumper_st.b3d | Bin 0 -> 32927 bytes advtrains/models/advtrains_dtrack_bumper_st_30.b3d | Bin 0 -> 48546 bytes advtrains/models/advtrains_dtrack_bumper_st_45.b3d | Bin 0 -> 32926 bytes advtrains/models/advtrains_dtrack_bumper_st_60.b3d | Bin 0 -> 48546 bytes advtrains/models/advtrains_dtrack_cr.b3d | Bin 0 -> 27540 bytes advtrains/models/advtrains_dtrack_cr_30.b3d | Bin 0 -> 27543 bytes advtrains/models/advtrains_dtrack_cr_45.b3d | Bin 0 -> 23037 bytes advtrains/models/advtrains_dtrack_cr_60.b3d | Bin 0 -> 23037 bytes advtrains/models/advtrains_dtrack_detector_st.b3d | Bin 0 -> 17157 bytes .../models/advtrains_dtrack_detector_st_30.b3d | Bin 0 -> 32779 bytes .../models/advtrains_dtrack_detector_st_45.b3d | Bin 0 -> 17163 bytes .../models/advtrains_dtrack_detector_st_60.b3d | Bin 0 -> 32779 bytes advtrains/models/advtrains_dtrack_st.b3d | Bin 0 -> 15828 bytes advtrains/models/advtrains_dtrack_st_30.b3d | Bin 0 -> 31447 bytes advtrains/models/advtrains_dtrack_st_45.b3d | Bin 0 -> 15831 bytes advtrains/models/advtrains_dtrack_st_60.b3d | Bin 0 -> 31447 bytes advtrains/models/advtrains_dtrack_swlcr.b3d | Bin 0 -> 36743 bytes advtrains/models/advtrains_dtrack_swlcr_30.b3d | Bin 0 -> 45922 bytes advtrains/models/advtrains_dtrack_swlcr_45.b3d | Bin 0 -> 32112 bytes advtrains/models/advtrains_dtrack_swlcr_60.b3d | Bin 0 -> 44864 bytes advtrains/models/advtrains_dtrack_swlst.b3d | Bin 0 -> 36743 bytes advtrains/models/advtrains_dtrack_swlst_30.b3d | Bin 0 -> 45922 bytes advtrains/models/advtrains_dtrack_swlst_45.b3d | Bin 0 -> 32112 bytes advtrains/models/advtrains_dtrack_swlst_60.b3d | Bin 0 -> 44864 bytes advtrains/models/advtrains_dtrack_swrcr.b3d | Bin 0 -> 36743 bytes advtrains/models/advtrains_dtrack_swrcr_30.b3d | Bin 0 -> 44864 bytes advtrains/models/advtrains_dtrack_swrcr_45.b3d | Bin 0 -> 32112 bytes advtrains/models/advtrains_dtrack_swrcr_60.b3d | Bin 0 -> 45922 bytes advtrains/models/advtrains_dtrack_swrst.b3d | Bin 0 -> 36743 bytes advtrains/models/advtrains_dtrack_swrst_30.b3d | Bin 0 -> 44864 bytes advtrains/models/advtrains_dtrack_swrst_45.b3d | Bin 0 -> 32112 bytes advtrains/models/advtrains_dtrack_swrst_60.b3d | Bin 0 -> 45922 bytes advtrains/models/advtrains_dtrack_vst1.b3d | Bin 0 -> 21495 bytes advtrains/models/advtrains_dtrack_vst1_45.b3d | Bin 0 -> 20739 bytes advtrains/models/advtrains_dtrack_vst2.b3d | Bin 0 -> 25143 bytes advtrains/models/advtrains_dtrack_vst2_45.b3d | Bin 0 -> 20919 bytes advtrains/models/advtrains_dtrack_vst31.b3d | Bin 0 -> 19051 bytes advtrains/models/advtrains_dtrack_vst32.b3d | Bin 0 -> 21635 bytes advtrains/models/advtrains_dtrack_vst33.b3d | Bin 0 -> 28795 bytes advtrains/models/advtrains_modernwagon.b3d | Bin 0 -> 172028 bytes advtrains/models/advtrains_retrosignal_off.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_off_30.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_off_45.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_off_60.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_on.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_on_30.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_on_45.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_retrosignal_on_60.b3d | Bin 0 -> 13093 bytes advtrains/models/advtrains_signal.b3d | Bin 0 -> 61544 bytes advtrains/models/advtrains_signal_30.b3d | Bin 0 -> 61544 bytes advtrains/models/advtrains_signal_45.b3d | Bin 0 -> 61544 bytes advtrains/models/advtrains_signal_60.b3d | Bin 0 -> 61544 bytes advtrains/models/advtrains_track_cr.b3d | Bin 0 -> 8023 bytes advtrains/models/advtrains_track_st.b3d | Bin 0 -> 15831 bytes advtrains/models/advtrains_track_st_45.b3d | Bin 0 -> 8935 bytes .../models/blender/engine-with-animation.blend | Bin 0 -> 599504 bytes .../models/blender/gleis/infos/Grafik_weiche.png | Bin 0 -> 361700 bytes advtrains/models/blender/gleis/infos/breite | 1 + advtrains/models/blender/gleis/licence.txt~ | 0 advtrains/models/blender/gleis/rail_my.blend | Bin 0 -> 654772 bytes advtrains/models/blender/gleis/rail_my.blend1 | Bin 0 -> 674164 bytes advtrains/models/blender/gleis/rail_my_rt.blend | Bin 0 -> 847060 bytes advtrains/models/blender/gleis/rail_my_rt.blend1 | Bin 0 -> 767780 bytes .../models/blender/gleis/rail_my_rt_final.blend | Bin 0 -> 1094836 bytes .../models/blender/gleis/rail_my_rt_final.blend1 | Bin 0 -> 827052 bytes .../models/blender/gleis/rail_my_rt_switches.blend | Bin 0 -> 2184236 bytes .../blender/gleis/rail_my_rt_switches.blend1 | Bin 0 -> 1945588 bytes .../blender/gleis/rail_my_rt_switches2.blend | Bin 0 -> 2139340 bytes .../blender/gleis/rail_my_rt_switches2.blend1 | Bin 0 -> 2172972 bytes advtrains/models/blender/gleis/rail_together.blend | Bin 0 -> 1016920 bytes advtrains/models/blender/gleis/rail_together.png | Bin 0 -> 233544 bytes advtrains/models/blender/gleis/rail_together2.png | Bin 0 -> 312891 bytes advtrains/models/blender/gleis/rail_together3.png | Bin 0 -> 309398 bytes .../models/blender/gleis/rail_verticals.blend | Bin 0 -> 550748 bytes .../models/blender/gleis/rail_verticals.blend1 | Bin 0 -> 574100 bytes .../models/blender/gleis/rail_verticals3.blend | Bin 0 -> 591800 bytes .../models/blender/gleis/rail_verticals3.blend1 | Bin 0 -> 554196 bytes .../models/blender/gleis/rail_verticals45.blend | Bin 0 -> 547788 bytes .../models/blender/gleis/rail_verticals45.blend1 | Bin 0 -> 547300 bytes .../models/blender/gleis/rail_verticals45.blend11 | Bin 0 -> 547300 bytes advtrains/models/blender/gleis/texturen/rail.png | Bin 0 -> 2616 bytes advtrains/models/blender/gleis/texturen/uv.png | Bin 0 -> 2343 bytes .../models/blender/industrial/industry_loc.blend | Bin 0 -> 652640 bytes .../models/blender/industrial/industry_loc.blend1 | Bin 0 -> 652640 bytes .../models/blender/industrial/industry_loc.blend11 | Bin 0 -> 659096 bytes .../blender/industrial/industry_oil_ wagong.blend | Bin 0 -> 693488 bytes .../blender/industrial/industry_oil_ wagong.blend1 | Bin 0 -> 693488 bytes .../blender/industrial/industry_tree_wagong.blend | Bin 0 -> 640056 bytes .../blender/industrial/industry_tree_wagong.blend1 | Bin 0 -> 640056 bytes .../blender/industrial/industry_tree_wagong.png | Bin 0 -> 316 bytes advtrains/models/blender/locomotive.blend | Bin 0 -> 459600 bytes advtrains/models/blender/magnet_track.blend | Bin 0 -> 516836 bytes .../models/blender/mbb/advtrains_wagon_japan.xcf | Bin 0 -> 814467 bytes .../blender/mbb/modern_japanlocomotive.blend | Bin 0 -> 715116 bytes .../blender/mbb/modern_japanlocomotive.blend1 | Bin 0 -> 715116 bytes .../models/blender/mbb/modern_japanlocomotive.png | Bin 0 -> 204978 bytes .../models/blender/mbb/modern_japanlocomotive.xcf | Bin 0 -> 957175 bytes .../models/blender/mbb/modern_locomotive.blend | Bin 0 -> 732124 bytes advtrains/models/blender/mbb/modern_wagong.blend | Bin 0 -> 471140 bytes advtrains/models/blender/mbb/modern_wagong.blend1 | Bin 0 -> 518316 bytes .../models/blender/mbb/modern_wagong_uv.blend | Bin 0 -> 571364 bytes .../models/blender/mbb/modern_wagong_uv.blend1 | Bin 0 -> 575708 bytes advtrains/models/blender/mbb/modern_wagong_uv.png | Bin 0 -> 189564 bytes advtrains/models/blender/mbb/prellbock.blend | Bin 0 -> 745176 bytes advtrains/models/blender/mbb/prellbock.blend1 | Bin 0 -> 485416 bytes advtrains/models/blender/mbb/prellbock.uv.png | Bin 0 -> 4034 bytes .../models/blender/mbb/regio-lokomotive.blend | Bin 0 -> 704160 bytes advtrains/models/blender/mbb/regio-waron.blend | Bin 0 -> 545620 bytes advtrains/models/blender/mbb/retrosignal.blend | Bin 0 -> 488920 bytes advtrains/models/blender/mbb/retrosignal.blend1 | Bin 0 -> 507800 bytes advtrains/models/blender/mbb/signal(2)_hoch.blend | Bin 0 -> 472092 bytes advtrains/models/blender/mbb/signal(2)_unten.blend | Bin 0 -> 472092 bytes advtrains/models/blender/mbb/signal.blend | Bin 0 -> 570336 bytes advtrains/models/blender/mbb/signal.blend1 | Bin 0 -> 570336 bytes advtrains/models/blender/mbb/signal.png | Bin 0 -> 244314 bytes advtrains/models/blender/mbb/signal.xcf | Bin 0 -> 881142 bytes advtrains/models/blender/mbb/signal2.png | Bin 0 -> 39924 bytes advtrains/models/blender/mbb/tr-logo.png | Bin 0 -> 197 bytes advtrains/models/blender/mbb/weichenhebel1.blend | Bin 0 -> 493028 bytes advtrains/models/blender/mbb/weichenhebel2.blend | Bin 0 -> 492996 bytes advtrains/models/blender/newlocomotive.blend | Bin 0 -> 603376 bytes advtrains/models/blender/newlocomotive.blend1 | Bin 0 -> 603376 bytes advtrains/models/blender/newlocomotive_uvs.png | Bin 0 -> 175030 bytes advtrains/models/blender/newwagon.blend | Bin 0 -> 542188 bytes advtrains/models/blender/newwagon.blend1 | Bin 0 -> 550292 bytes advtrains/models/blender/newwagon.png | Bin 0 -> 108762 bytes advtrains/models/blender/subway-train.blend | Bin 0 -> 536268 bytes advtrains/models/blender/subway-train.blend1 | Bin 0 -> 538188 bytes advtrains/models/blender/subway-train.png | Bin 0 -> 96773 bytes advtrains/models/blender/subway-train.xcf | Bin 0 -> 92558 bytes advtrains/models/blender/trackplane.blend | Bin 0 -> 462200 bytes advtrains/models/blender/trackvertical1.blend | Bin 0 -> 453656 bytes advtrains/models/blender/trackvertical1.blend1 | Bin 0 -> 453344 bytes advtrains/models/blender/trackvertical1.png | Bin 0 -> 59146 bytes advtrains/models/blender/trackvertical2.blend | Bin 0 -> 459216 bytes advtrains/models/blender/trackvertical2.png | Bin 0 -> 66755 bytes advtrains/models/oldmodels/locomotive.b3d | Bin 0 -> 181112 bytes advtrains/models/oldmodels/trackvertical1.b3d | Bin 0 -> 629 bytes advtrains/models/oldmodels/trackvertical2.b3d | Bin 0 -> 869 bytes advtrains/models/trackplane.b3d | Bin 0 -> 262 bytes advtrains/pseudoload.lua | 180 +++++ advtrains/readme.txt | 23 + advtrains/signals.lua | 76 ++ advtrains/textures/advtrains_couple.png | Bin 0 -> 265 bytes advtrains/textures/advtrains_discouple.png | Bin 0 -> 307 bytes .../textures/advtrains_dtrack_bumper_placer.png | Bin 0 -> 2213 bytes .../textures/advtrains_dtrack_detector_placer.png | Bin 0 -> 1253 bytes advtrains/textures/advtrains_dtrack_placer.png | Bin 0 -> 5831 bytes advtrains/textures/advtrains_dtrack_rail.png | Bin 0 -> 2810 bytes .../textures/advtrains_dtrack_rail_detector_on.png | Bin 0 -> 2844 bytes .../textures/advtrains_dtrack_slopeplacer.png | Bin 0 -> 2415 bytes advtrains/textures/advtrains_newlocomotive.xcf | Bin 0 -> 7462378 bytes advtrains/textures/advtrains_platform.png | Bin 0 -> 193 bytes advtrains/textures/advtrains_retrosignal.png | Bin 0 -> 8496 bytes advtrains/textures/advtrains_retrosignal_inv.png | Bin 0 -> 2242 bytes advtrains/textures/advtrains_signal_inv.png | Bin 0 -> 856 bytes advtrains/textures/advtrains_signal_off.png | Bin 0 -> 5882 bytes advtrains/textures/advtrains_signal_on.png | Bin 0 -> 5884 bytes advtrains/textures/advtrains_track_cr.png | Bin 0 -> 33370 bytes advtrains/textures/advtrains_track_cr_45.png | Bin 0 -> 33938 bytes advtrains/textures/advtrains_track_placer.png | Bin 0 -> 32349 bytes advtrains/textures/advtrains_track_st.png | Bin 0 -> 20405 bytes advtrains/textures/advtrains_track_st_45.png | Bin 0 -> 39977 bytes advtrains/textures/advtrains_track_swlcr.png | Bin 0 -> 33378 bytes advtrains/textures/advtrains_track_swlcr_45.png | Bin 0 -> 45772 bytes advtrains/textures/advtrains_track_swlst.png | Bin 0 -> 32321 bytes advtrains/textures/advtrains_track_swlst_45.png | Bin 0 -> 46408 bytes advtrains/textures/advtrains_track_swrcr.png | Bin 0 -> 33670 bytes advtrains/textures/advtrains_track_swrcr_45.png | Bin 0 -> 46865 bytes advtrains/textures/advtrains_track_swrst.png | Bin 0 -> 32654 bytes advtrains/textures/advtrains_track_swrst_45.png | Bin 0 -> 47636 bytes advtrains/textures/advtrains_trackworker.png | Bin 0 -> 328 bytes advtrains/textures/drwho_screwdriver.png | Bin 0 -> 328 bytes advtrains/textures/larger rails.xcf | Bin 0 -> 1239132 bytes advtrains/trackplacer.lua | 282 +++++++ advtrains/tracks.lua | 693 ++++++++++++++++ advtrains/trainhud.lua | 109 +++ advtrains/trainlogic.lua | 895 +++++++++++++++++++++ advtrains/wagons.lua | 607 ++++++++++++++ advtrains_train_industrial/depends.txt | 1 + advtrains_train_industrial/init.lua | 61 ++ .../models/advtrains_engine_industrial.b3d | Bin 0 -> 143659 bytes .../models/advtrains_wagon_tank.b3d | Bin 0 -> 223975 bytes .../models/advtrains_wagon_wood.b3d | Bin 0 -> 193975 bytes .../textures/advtrains_engine_industrial.png | Bin 0 -> 59019 bytes .../textures/advtrains_engine_industrial_inv.png | Bin 0 -> 381 bytes .../textures/advtrains_wagon_tank.png | Bin 0 -> 8975 bytes .../textures/advtrains_wagon_tank_inv.png | Bin 0 -> 408 bytes .../textures/advtrains_wagon_wood.png | Bin 0 -> 5974 bytes .../textures/advtrains_wagon_wood_inv.png | Bin 0 -> 316 bytes advtrains_train_japan/depends.txt | 1 + advtrains_train_japan/init.lua | 34 + .../models/advtrains_engine_japan.b3d | Bin 0 -> 165287 bytes .../models/advtrains_wagon_japan.b3d | Bin 0 -> 171991 bytes .../textures/advtrains_engine_japan.png | Bin 0 -> 12664 bytes .../textures/advtrains_engine_japan_inv.png | Bin 0 -> 434 bytes .../textures/advtrains_wagon_japan.png | Bin 0 -> 11175 bytes .../textures/advtrains_wagon_japan_inv.png | Bin 0 -> 400 bytes advtrains_train_steam/depends.txt | 1 + advtrains_train_steam/init.lua | 115 +++ .../models/advtrains_engine_steam.b3d | Bin 0 -> 298687 bytes advtrains_train_steam/models/advtrains_wagon.b3d | Bin 0 -> 107352 bytes .../textures/advtrains_newlocomotive.png | Bin 0 -> 31800 bytes .../textures/advtrains_newlocomotive_inv.png | Bin 0 -> 469 bytes advtrains_train_steam/textures/advtrains_wagon.png | Bin 0 -> 35724 bytes .../textures/advtrains_wagon_box.png | Bin 0 -> 22503 bytes .../textures/advtrains_wagon_box_inv.png | Bin 0 -> 347 bytes .../textures/advtrains_wagon_inv.png | Bin 0 -> 709 bytes advtrains_train_subway/depends.txt | 1 + advtrains_train_subway/init.lua | 28 + .../models/advtrains_subway_train.b3d | Bin 0 -> 95856 bytes .../textures/advtrains_subway_train.png | Bin 0 -> 12002 bytes .../textures/advtrains_subway_train_inv.png | Bin 0 -> 900 bytes atc.lua | 4 - couple.lua | 154 ---- crafting.lua | 103 --- damage.lua | 26 - debugitems.lua | 36 - depends.txt | 2 - description.txt | 8 - helpers.lua | 249 ------ init.lua | 42 - misc_nodes.lua | 67 -- models/advtrains_dtrack_bumper_st.b3d | Bin 32927 -> 0 bytes models/advtrains_dtrack_bumper_st_30.b3d | Bin 48546 -> 0 bytes models/advtrains_dtrack_bumper_st_45.b3d | Bin 32926 -> 0 bytes models/advtrains_dtrack_bumper_st_60.b3d | Bin 48546 -> 0 bytes models/advtrains_dtrack_cr.b3d | Bin 27540 -> 0 bytes models/advtrains_dtrack_cr_30.b3d | Bin 27543 -> 0 bytes models/advtrains_dtrack_cr_45.b3d | Bin 23037 -> 0 bytes models/advtrains_dtrack_cr_60.b3d | Bin 23037 -> 0 bytes models/advtrains_dtrack_detector_st.b3d | Bin 17157 -> 0 bytes models/advtrains_dtrack_detector_st_30.b3d | Bin 32779 -> 0 bytes models/advtrains_dtrack_detector_st_45.b3d | Bin 17163 -> 0 bytes models/advtrains_dtrack_detector_st_60.b3d | Bin 32779 -> 0 bytes models/advtrains_dtrack_st.b3d | Bin 15828 -> 0 bytes models/advtrains_dtrack_st_30.b3d | Bin 31447 -> 0 bytes models/advtrains_dtrack_st_45.b3d | Bin 15831 -> 0 bytes models/advtrains_dtrack_st_60.b3d | Bin 31447 -> 0 bytes models/advtrains_dtrack_swlcr.b3d | Bin 36743 -> 0 bytes models/advtrains_dtrack_swlcr_30.b3d | Bin 45922 -> 0 bytes models/advtrains_dtrack_swlcr_45.b3d | Bin 32112 -> 0 bytes models/advtrains_dtrack_swlcr_60.b3d | Bin 44864 -> 0 bytes models/advtrains_dtrack_swlst.b3d | Bin 36743 -> 0 bytes models/advtrains_dtrack_swlst_30.b3d | Bin 45922 -> 0 bytes models/advtrains_dtrack_swlst_45.b3d | Bin 32112 -> 0 bytes models/advtrains_dtrack_swlst_60.b3d | Bin 44864 -> 0 bytes models/advtrains_dtrack_swrcr.b3d | Bin 36743 -> 0 bytes models/advtrains_dtrack_swrcr_30.b3d | Bin 44864 -> 0 bytes models/advtrains_dtrack_swrcr_45.b3d | Bin 32112 -> 0 bytes models/advtrains_dtrack_swrcr_60.b3d | Bin 45922 -> 0 bytes models/advtrains_dtrack_swrst.b3d | Bin 36743 -> 0 bytes models/advtrains_dtrack_swrst_30.b3d | Bin 44864 -> 0 bytes models/advtrains_dtrack_swrst_45.b3d | Bin 32112 -> 0 bytes models/advtrains_dtrack_swrst_60.b3d | Bin 45922 -> 0 bytes models/advtrains_dtrack_vst1.b3d | Bin 21495 -> 0 bytes models/advtrains_dtrack_vst1_45.b3d | Bin 20739 -> 0 bytes models/advtrains_dtrack_vst2.b3d | Bin 25143 -> 0 bytes models/advtrains_dtrack_vst2_45.b3d | Bin 20919 -> 0 bytes models/advtrains_dtrack_vst31.b3d | Bin 19051 -> 0 bytes models/advtrains_dtrack_vst32.b3d | Bin 21635 -> 0 bytes models/advtrains_dtrack_vst33.b3d | Bin 28795 -> 0 bytes models/advtrains_engine_industrial.b3d | Bin 143659 -> 0 bytes models/advtrains_engine_japan.b3d | Bin 165287 -> 0 bytes models/advtrains_engine_steam.b3d | Bin 298687 -> 0 bytes models/advtrains_modernwagon.b3d | Bin 172028 -> 0 bytes models/advtrains_retrosignal_off.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_off_30.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_off_45.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_off_60.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_on.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_on_30.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_on_45.b3d | Bin 13093 -> 0 bytes models/advtrains_retrosignal_on_60.b3d | Bin 13093 -> 0 bytes models/advtrains_signal.b3d | Bin 61544 -> 0 bytes models/advtrains_signal_30.b3d | Bin 61544 -> 0 bytes models/advtrains_signal_45.b3d | Bin 61544 -> 0 bytes models/advtrains_signal_60.b3d | Bin 61544 -> 0 bytes models/advtrains_subway_train.b3d | Bin 95856 -> 0 bytes models/advtrains_track_cr.b3d | Bin 8023 -> 0 bytes models/advtrains_track_st.b3d | Bin 15831 -> 0 bytes models/advtrains_track_st_45.b3d | Bin 8935 -> 0 bytes models/advtrains_wagon.b3d | Bin 107352 -> 0 bytes models/advtrains_wagon_japan.b3d | Bin 171991 -> 0 bytes models/advtrains_wagon_tank.b3d | Bin 223975 -> 0 bytes models/advtrains_wagon_wood.b3d | Bin 193975 -> 0 bytes models/blender/engine-with-animation.blend | Bin 599504 -> 0 bytes models/blender/gleis/infos/Grafik_weiche.png | Bin 361700 -> 0 bytes models/blender/gleis/infos/breite | 1 - models/blender/gleis/licence.txt~ | 0 models/blender/gleis/rail_my.blend | Bin 654772 -> 0 bytes models/blender/gleis/rail_my.blend1 | Bin 674164 -> 0 bytes models/blender/gleis/rail_my_rt.blend | Bin 847060 -> 0 bytes models/blender/gleis/rail_my_rt.blend1 | Bin 767780 -> 0 bytes models/blender/gleis/rail_my_rt_final.blend | Bin 1094836 -> 0 bytes models/blender/gleis/rail_my_rt_final.blend1 | Bin 827052 -> 0 bytes models/blender/gleis/rail_my_rt_switches.blend | Bin 2184236 -> 0 bytes models/blender/gleis/rail_my_rt_switches.blend1 | Bin 1945588 -> 0 bytes models/blender/gleis/rail_my_rt_switches2.blend | Bin 2139340 -> 0 bytes models/blender/gleis/rail_my_rt_switches2.blend1 | Bin 2172972 -> 0 bytes models/blender/gleis/rail_together.blend | Bin 1016920 -> 0 bytes models/blender/gleis/rail_together.png | Bin 233544 -> 0 bytes models/blender/gleis/rail_together2.png | Bin 312891 -> 0 bytes models/blender/gleis/rail_together3.png | Bin 309398 -> 0 bytes models/blender/gleis/rail_verticals.blend | Bin 550748 -> 0 bytes models/blender/gleis/rail_verticals.blend1 | Bin 574100 -> 0 bytes models/blender/gleis/rail_verticals3.blend | Bin 591800 -> 0 bytes models/blender/gleis/rail_verticals3.blend1 | Bin 554196 -> 0 bytes models/blender/gleis/rail_verticals45.blend | Bin 547788 -> 0 bytes models/blender/gleis/rail_verticals45.blend1 | Bin 547300 -> 0 bytes models/blender/gleis/rail_verticals45.blend11 | Bin 547300 -> 0 bytes models/blender/gleis/texturen/rail.png | Bin 2616 -> 0 bytes models/blender/gleis/texturen/uv.png | Bin 2343 -> 0 bytes models/blender/industrial/industry_loc.blend | Bin 652640 -> 0 bytes models/blender/industrial/industry_loc.blend1 | Bin 652640 -> 0 bytes models/blender/industrial/industry_loc.blend11 | Bin 659096 -> 0 bytes .../blender/industrial/industry_oil_ wagong.blend | Bin 693488 -> 0 bytes .../blender/industrial/industry_oil_ wagong.blend1 | Bin 693488 -> 0 bytes .../blender/industrial/industry_tree_wagong.blend | Bin 640056 -> 0 bytes .../blender/industrial/industry_tree_wagong.blend1 | Bin 640056 -> 0 bytes models/blender/industrial/industry_tree_wagong.png | Bin 316 -> 0 bytes models/blender/locomotive.blend | Bin 459600 -> 0 bytes models/blender/magnet_track.blend | Bin 516836 -> 0 bytes models/blender/mbb/advtrains_wagon_japan.xcf | Bin 814467 -> 0 bytes models/blender/mbb/modern_japanlocomotive.blend | Bin 715116 -> 0 bytes models/blender/mbb/modern_japanlocomotive.blend1 | Bin 715116 -> 0 bytes models/blender/mbb/modern_japanlocomotive.png | Bin 204978 -> 0 bytes models/blender/mbb/modern_japanlocomotive.xcf | Bin 957175 -> 0 bytes models/blender/mbb/modern_locomotive.blend | Bin 732124 -> 0 bytes models/blender/mbb/modern_wagong.blend | Bin 471140 -> 0 bytes models/blender/mbb/modern_wagong.blend1 | Bin 518316 -> 0 bytes models/blender/mbb/modern_wagong_uv.blend | Bin 571364 -> 0 bytes models/blender/mbb/modern_wagong_uv.blend1 | Bin 575708 -> 0 bytes models/blender/mbb/modern_wagong_uv.png | Bin 189564 -> 0 bytes models/blender/mbb/prellbock.blend | Bin 745176 -> 0 bytes models/blender/mbb/prellbock.blend1 | Bin 485416 -> 0 bytes models/blender/mbb/prellbock.uv.png | Bin 4034 -> 0 bytes models/blender/mbb/regio-lokomotive.blend | Bin 704160 -> 0 bytes models/blender/mbb/regio-waron.blend | Bin 545620 -> 0 bytes models/blender/mbb/retrosignal.blend | Bin 488920 -> 0 bytes models/blender/mbb/retrosignal.blend1 | Bin 507800 -> 0 bytes models/blender/mbb/signal(2)_hoch.blend | Bin 472092 -> 0 bytes models/blender/mbb/signal(2)_unten.blend | Bin 472092 -> 0 bytes models/blender/mbb/signal.blend | Bin 570336 -> 0 bytes models/blender/mbb/signal.blend1 | Bin 570336 -> 0 bytes models/blender/mbb/signal.png | Bin 244314 -> 0 bytes models/blender/mbb/signal.xcf | Bin 881142 -> 0 bytes models/blender/mbb/signal2.png | Bin 39924 -> 0 bytes models/blender/mbb/tr-logo.png | Bin 197 -> 0 bytes models/blender/mbb/weichenhebel1.blend | Bin 493028 -> 0 bytes models/blender/mbb/weichenhebel2.blend | Bin 492996 -> 0 bytes models/blender/newlocomotive.blend | Bin 603376 -> 0 bytes models/blender/newlocomotive.blend1 | Bin 603376 -> 0 bytes models/blender/newlocomotive_uvs.png | Bin 175030 -> 0 bytes models/blender/newwagon.blend | Bin 542188 -> 0 bytes models/blender/newwagon.blend1 | Bin 550292 -> 0 bytes models/blender/newwagon.png | Bin 108762 -> 0 bytes models/blender/subway-train.blend | Bin 536268 -> 0 bytes models/blender/subway-train.blend1 | Bin 538188 -> 0 bytes models/blender/subway-train.png | Bin 96773 -> 0 bytes models/blender/subway-train.xcf | Bin 92558 -> 0 bytes models/blender/trackplane.blend | Bin 462200 -> 0 bytes models/blender/trackvertical1.blend | Bin 453656 -> 0 bytes models/blender/trackvertical1.blend1 | Bin 453344 -> 0 bytes models/blender/trackvertical1.png | Bin 59146 -> 0 bytes models/blender/trackvertical2.blend | Bin 459216 -> 0 bytes models/blender/trackvertical2.png | Bin 66755 -> 0 bytes models/oldmodels/locomotive.b3d | Bin 181112 -> 0 bytes models/oldmodels/trackvertical1.b3d | Bin 629 -> 0 bytes models/oldmodels/trackvertical2.b3d | Bin 869 -> 0 bytes models/trackplane.b3d | Bin 262 -> 0 bytes modpack.txt | 0 pseudoload.lua | 180 ----- readme.txt | 23 - signals.lua | 76 -- textures/advtrains_couple.png | Bin 265 -> 0 bytes textures/advtrains_discouple.png | Bin 307 -> 0 bytes textures/advtrains_dtrack_bumper_placer.png | Bin 2213 -> 0 bytes textures/advtrains_dtrack_detector_placer.png | Bin 1253 -> 0 bytes textures/advtrains_dtrack_placer.png | Bin 5831 -> 0 bytes textures/advtrains_dtrack_rail.png | Bin 2810 -> 0 bytes textures/advtrains_dtrack_rail_detector_on.png | Bin 2844 -> 0 bytes textures/advtrains_dtrack_slopeplacer.png | Bin 2415 -> 0 bytes textures/advtrains_engine_industrial.png | Bin 59019 -> 0 bytes textures/advtrains_engine_industrial_inv.png | Bin 381 -> 0 bytes textures/advtrains_engine_japan.png | Bin 12664 -> 0 bytes textures/advtrains_engine_japan_inv.png | Bin 434 -> 0 bytes textures/advtrains_newlocomotive.png | Bin 31800 -> 0 bytes textures/advtrains_newlocomotive.xcf | Bin 7462378 -> 0 bytes textures/advtrains_newlocomotive_inv.png | Bin 469 -> 0 bytes textures/advtrains_platform.png | Bin 193 -> 0 bytes textures/advtrains_retrosignal.png | Bin 8496 -> 0 bytes textures/advtrains_retrosignal_inv.png | Bin 2242 -> 0 bytes textures/advtrains_signal_inv.png | Bin 856 -> 0 bytes textures/advtrains_signal_off.png | Bin 5882 -> 0 bytes textures/advtrains_signal_on.png | Bin 5884 -> 0 bytes textures/advtrains_subway_train.png | Bin 12002 -> 0 bytes textures/advtrains_subway_train_inv.png | Bin 900 -> 0 bytes textures/advtrains_track_cr.png | Bin 33370 -> 0 bytes textures/advtrains_track_cr_45.png | Bin 33938 -> 0 bytes textures/advtrains_track_placer.png | Bin 32349 -> 0 bytes textures/advtrains_track_st.png | Bin 20405 -> 0 bytes textures/advtrains_track_st_45.png | Bin 39977 -> 0 bytes textures/advtrains_track_swlcr.png | Bin 33378 -> 0 bytes textures/advtrains_track_swlcr_45.png | Bin 45772 -> 0 bytes textures/advtrains_track_swlst.png | Bin 32321 -> 0 bytes textures/advtrains_track_swlst_45.png | Bin 46408 -> 0 bytes textures/advtrains_track_swrcr.png | Bin 33670 -> 0 bytes textures/advtrains_track_swrcr_45.png | Bin 46865 -> 0 bytes textures/advtrains_track_swrst.png | Bin 32654 -> 0 bytes textures/advtrains_track_swrst_45.png | Bin 47636 -> 0 bytes textures/advtrains_trackworker.png | Bin 328 -> 0 bytes textures/advtrains_wagon.png | Bin 35724 -> 0 bytes textures/advtrains_wagon_box.png | Bin 22503 -> 0 bytes textures/advtrains_wagon_box_inv.png | Bin 347 -> 0 bytes textures/advtrains_wagon_inv.png | Bin 709 -> 0 bytes textures/advtrains_wagon_japan.png | Bin 11175 -> 0 bytes textures/advtrains_wagon_japan_inv.png | Bin 400 -> 0 bytes textures/advtrains_wagon_tank.png | Bin 8975 -> 0 bytes textures/advtrains_wagon_tank_inv.png | Bin 408 -> 0 bytes textures/advtrains_wagon_wood.png | Bin 5974 -> 0 bytes textures/advtrains_wagon_wood_inv.png | Bin 316 -> 0 bytes textures/drwho_screwdriver.png | Bin 328 -> 0 bytes textures/larger rails.xcf | Bin 1239132 -> 0 bytes trackplacer.lua | 282 ------- tracks.lua | 693 ---------------- trainhud.lua | 109 --- trainlogic.lua | 895 --------------------- wagons.lua | 790 ------------------ 439 files changed, 3767 insertions(+), 3740 deletions(-) create mode 100644 advtrains/atc.lua create mode 100644 advtrains/couple.lua create mode 100644 advtrains/crafting.lua create mode 100644 advtrains/damage.lua create mode 100644 advtrains/debugitems.lua create mode 100644 advtrains/depends.txt create mode 100644 advtrains/description.txt create mode 100644 advtrains/helpers.lua create mode 100644 advtrains/init.lua create mode 100644 advtrains/misc_nodes.lua create mode 100644 advtrains/models/advtrains_dtrack_bumper_st.b3d create mode 100644 advtrains/models/advtrains_dtrack_bumper_st_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_bumper_st_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_bumper_st_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_cr.b3d create mode 100644 advtrains/models/advtrains_dtrack_cr_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_cr_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_cr_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_detector_st.b3d create mode 100644 advtrains/models/advtrains_dtrack_detector_st_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_detector_st_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_detector_st_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_st.b3d create mode 100644 advtrains/models/advtrains_dtrack_st_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_st_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_st_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlcr.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlcr_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlcr_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlcr_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlst.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlst_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlst_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_swlst_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrcr.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrcr_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrcr_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrcr_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrst.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrst_30.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrst_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_swrst_60.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst1.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst1_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst2.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst2_45.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst31.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst32.b3d create mode 100644 advtrains/models/advtrains_dtrack_vst33.b3d create mode 100644 advtrains/models/advtrains_modernwagon.b3d create mode 100644 advtrains/models/advtrains_retrosignal_off.b3d create mode 100644 advtrains/models/advtrains_retrosignal_off_30.b3d create mode 100644 advtrains/models/advtrains_retrosignal_off_45.b3d create mode 100644 advtrains/models/advtrains_retrosignal_off_60.b3d create mode 100644 advtrains/models/advtrains_retrosignal_on.b3d create mode 100644 advtrains/models/advtrains_retrosignal_on_30.b3d create mode 100644 advtrains/models/advtrains_retrosignal_on_45.b3d create mode 100644 advtrains/models/advtrains_retrosignal_on_60.b3d create mode 100644 advtrains/models/advtrains_signal.b3d create mode 100644 advtrains/models/advtrains_signal_30.b3d create mode 100644 advtrains/models/advtrains_signal_45.b3d create mode 100644 advtrains/models/advtrains_signal_60.b3d create mode 100644 advtrains/models/advtrains_track_cr.b3d create mode 100644 advtrains/models/advtrains_track_st.b3d create mode 100644 advtrains/models/advtrains_track_st_45.b3d create mode 100644 advtrains/models/blender/engine-with-animation.blend create mode 100644 advtrains/models/blender/gleis/infos/Grafik_weiche.png create mode 100644 advtrains/models/blender/gleis/infos/breite create mode 100644 advtrains/models/blender/gleis/licence.txt~ create mode 100644 advtrains/models/blender/gleis/rail_my.blend create mode 100644 advtrains/models/blender/gleis/rail_my.blend1 create mode 100644 advtrains/models/blender/gleis/rail_my_rt.blend create mode 100644 advtrains/models/blender/gleis/rail_my_rt.blend1 create mode 100644 advtrains/models/blender/gleis/rail_my_rt_final.blend create mode 100644 advtrains/models/blender/gleis/rail_my_rt_final.blend1 create mode 100644 advtrains/models/blender/gleis/rail_my_rt_switches.blend create mode 100644 advtrains/models/blender/gleis/rail_my_rt_switches.blend1 create mode 100644 advtrains/models/blender/gleis/rail_my_rt_switches2.blend create mode 100644 advtrains/models/blender/gleis/rail_my_rt_switches2.blend1 create mode 100644 advtrains/models/blender/gleis/rail_together.blend create mode 100644 advtrains/models/blender/gleis/rail_together.png create mode 100644 advtrains/models/blender/gleis/rail_together2.png create mode 100644 advtrains/models/blender/gleis/rail_together3.png create mode 100644 advtrains/models/blender/gleis/rail_verticals.blend create mode 100644 advtrains/models/blender/gleis/rail_verticals.blend1 create mode 100644 advtrains/models/blender/gleis/rail_verticals3.blend create mode 100644 advtrains/models/blender/gleis/rail_verticals3.blend1 create mode 100644 advtrains/models/blender/gleis/rail_verticals45.blend create mode 100644 advtrains/models/blender/gleis/rail_verticals45.blend1 create mode 100644 advtrains/models/blender/gleis/rail_verticals45.blend11 create mode 100644 advtrains/models/blender/gleis/texturen/rail.png create mode 100644 advtrains/models/blender/gleis/texturen/uv.png create mode 100644 advtrains/models/blender/industrial/industry_loc.blend create mode 100644 advtrains/models/blender/industrial/industry_loc.blend1 create mode 100644 advtrains/models/blender/industrial/industry_loc.blend11 create mode 100644 advtrains/models/blender/industrial/industry_oil_ wagong.blend create mode 100644 advtrains/models/blender/industrial/industry_oil_ wagong.blend1 create mode 100644 advtrains/models/blender/industrial/industry_tree_wagong.blend create mode 100644 advtrains/models/blender/industrial/industry_tree_wagong.blend1 create mode 100644 advtrains/models/blender/industrial/industry_tree_wagong.png create mode 100644 advtrains/models/blender/locomotive.blend create mode 100644 advtrains/models/blender/magnet_track.blend create mode 100644 advtrains/models/blender/mbb/advtrains_wagon_japan.xcf create mode 100644 advtrains/models/blender/mbb/modern_japanlocomotive.blend create mode 100644 advtrains/models/blender/mbb/modern_japanlocomotive.blend1 create mode 100644 advtrains/models/blender/mbb/modern_japanlocomotive.png create mode 100644 advtrains/models/blender/mbb/modern_japanlocomotive.xcf create mode 100644 advtrains/models/blender/mbb/modern_locomotive.blend create mode 100644 advtrains/models/blender/mbb/modern_wagong.blend create mode 100644 advtrains/models/blender/mbb/modern_wagong.blend1 create mode 100644 advtrains/models/blender/mbb/modern_wagong_uv.blend create mode 100644 advtrains/models/blender/mbb/modern_wagong_uv.blend1 create mode 100644 advtrains/models/blender/mbb/modern_wagong_uv.png create mode 100644 advtrains/models/blender/mbb/prellbock.blend create mode 100644 advtrains/models/blender/mbb/prellbock.blend1 create mode 100644 advtrains/models/blender/mbb/prellbock.uv.png create mode 100644 advtrains/models/blender/mbb/regio-lokomotive.blend create mode 100644 advtrains/models/blender/mbb/regio-waron.blend create mode 100644 advtrains/models/blender/mbb/retrosignal.blend create mode 100644 advtrains/models/blender/mbb/retrosignal.blend1 create mode 100644 advtrains/models/blender/mbb/signal(2)_hoch.blend create mode 100644 advtrains/models/blender/mbb/signal(2)_unten.blend create mode 100644 advtrains/models/blender/mbb/signal.blend create mode 100644 advtrains/models/blender/mbb/signal.blend1 create mode 100644 advtrains/models/blender/mbb/signal.png create mode 100644 advtrains/models/blender/mbb/signal.xcf create mode 100644 advtrains/models/blender/mbb/signal2.png create mode 100644 advtrains/models/blender/mbb/tr-logo.png create mode 100644 advtrains/models/blender/mbb/weichenhebel1.blend create mode 100644 advtrains/models/blender/mbb/weichenhebel2.blend create mode 100644 advtrains/models/blender/newlocomotive.blend create mode 100644 advtrains/models/blender/newlocomotive.blend1 create mode 100644 advtrains/models/blender/newlocomotive_uvs.png create mode 100644 advtrains/models/blender/newwagon.blend create mode 100644 advtrains/models/blender/newwagon.blend1 create mode 100644 advtrains/models/blender/newwagon.png create mode 100644 advtrains/models/blender/subway-train.blend create mode 100644 advtrains/models/blender/subway-train.blend1 create mode 100644 advtrains/models/blender/subway-train.png create mode 100644 advtrains/models/blender/subway-train.xcf create mode 100644 advtrains/models/blender/trackplane.blend create mode 100644 advtrains/models/blender/trackvertical1.blend create mode 100644 advtrains/models/blender/trackvertical1.blend1 create mode 100644 advtrains/models/blender/trackvertical1.png create mode 100644 advtrains/models/blender/trackvertical2.blend create mode 100644 advtrains/models/blender/trackvertical2.png create mode 100644 advtrains/models/oldmodels/locomotive.b3d create mode 100644 advtrains/models/oldmodels/trackvertical1.b3d create mode 100644 advtrains/models/oldmodels/trackvertical2.b3d create mode 100644 advtrains/models/trackplane.b3d create mode 100644 advtrains/pseudoload.lua create mode 100644 advtrains/readme.txt create mode 100644 advtrains/signals.lua create mode 100644 advtrains/textures/advtrains_couple.png create mode 100644 advtrains/textures/advtrains_discouple.png create mode 100644 advtrains/textures/advtrains_dtrack_bumper_placer.png create mode 100644 advtrains/textures/advtrains_dtrack_detector_placer.png create mode 100644 advtrains/textures/advtrains_dtrack_placer.png create mode 100644 advtrains/textures/advtrains_dtrack_rail.png create mode 100644 advtrains/textures/advtrains_dtrack_rail_detector_on.png create mode 100644 advtrains/textures/advtrains_dtrack_slopeplacer.png create mode 100644 advtrains/textures/advtrains_newlocomotive.xcf create mode 100644 advtrains/textures/advtrains_platform.png create mode 100644 advtrains/textures/advtrains_retrosignal.png create mode 100644 advtrains/textures/advtrains_retrosignal_inv.png create mode 100644 advtrains/textures/advtrains_signal_inv.png create mode 100644 advtrains/textures/advtrains_signal_off.png create mode 100644 advtrains/textures/advtrains_signal_on.png create mode 100644 advtrains/textures/advtrains_track_cr.png create mode 100644 advtrains/textures/advtrains_track_cr_45.png create mode 100644 advtrains/textures/advtrains_track_placer.png create mode 100644 advtrains/textures/advtrains_track_st.png create mode 100644 advtrains/textures/advtrains_track_st_45.png create mode 100644 advtrains/textures/advtrains_track_swlcr.png create mode 100644 advtrains/textures/advtrains_track_swlcr_45.png create mode 100644 advtrains/textures/advtrains_track_swlst.png create mode 100644 advtrains/textures/advtrains_track_swlst_45.png create mode 100644 advtrains/textures/advtrains_track_swrcr.png create mode 100644 advtrains/textures/advtrains_track_swrcr_45.png create mode 100644 advtrains/textures/advtrains_track_swrst.png create mode 100644 advtrains/textures/advtrains_track_swrst_45.png create mode 100644 advtrains/textures/advtrains_trackworker.png create mode 100644 advtrains/textures/drwho_screwdriver.png create mode 100644 advtrains/textures/larger rails.xcf create mode 100644 advtrains/trackplacer.lua create mode 100644 advtrains/tracks.lua create mode 100644 advtrains/trainhud.lua create mode 100644 advtrains/trainlogic.lua create mode 100644 advtrains/wagons.lua create mode 100644 advtrains_train_industrial/depends.txt create mode 100644 advtrains_train_industrial/init.lua create mode 100644 advtrains_train_industrial/models/advtrains_engine_industrial.b3d create mode 100644 advtrains_train_industrial/models/advtrains_wagon_tank.b3d create mode 100644 advtrains_train_industrial/models/advtrains_wagon_wood.b3d create mode 100644 advtrains_train_industrial/textures/advtrains_engine_industrial.png create mode 100644 advtrains_train_industrial/textures/advtrains_engine_industrial_inv.png create mode 100644 advtrains_train_industrial/textures/advtrains_wagon_tank.png create mode 100644 advtrains_train_industrial/textures/advtrains_wagon_tank_inv.png create mode 100644 advtrains_train_industrial/textures/advtrains_wagon_wood.png create mode 100644 advtrains_train_industrial/textures/advtrains_wagon_wood_inv.png create mode 100644 advtrains_train_japan/depends.txt create mode 100644 advtrains_train_japan/init.lua create mode 100644 advtrains_train_japan/models/advtrains_engine_japan.b3d create mode 100644 advtrains_train_japan/models/advtrains_wagon_japan.b3d create mode 100644 advtrains_train_japan/textures/advtrains_engine_japan.png create mode 100644 advtrains_train_japan/textures/advtrains_engine_japan_inv.png create mode 100644 advtrains_train_japan/textures/advtrains_wagon_japan.png create mode 100644 advtrains_train_japan/textures/advtrains_wagon_japan_inv.png create mode 100644 advtrains_train_steam/depends.txt create mode 100644 advtrains_train_steam/init.lua create mode 100644 advtrains_train_steam/models/advtrains_engine_steam.b3d create mode 100644 advtrains_train_steam/models/advtrains_wagon.b3d create mode 100644 advtrains_train_steam/textures/advtrains_newlocomotive.png create mode 100644 advtrains_train_steam/textures/advtrains_newlocomotive_inv.png create mode 100644 advtrains_train_steam/textures/advtrains_wagon.png create mode 100644 advtrains_train_steam/textures/advtrains_wagon_box.png create mode 100644 advtrains_train_steam/textures/advtrains_wagon_box_inv.png create mode 100644 advtrains_train_steam/textures/advtrains_wagon_inv.png create mode 100644 advtrains_train_subway/depends.txt create mode 100644 advtrains_train_subway/init.lua create mode 100644 advtrains_train_subway/models/advtrains_subway_train.b3d create mode 100644 advtrains_train_subway/textures/advtrains_subway_train.png create mode 100644 advtrains_train_subway/textures/advtrains_subway_train_inv.png delete mode 100644 atc.lua delete mode 100644 couple.lua delete mode 100644 crafting.lua delete mode 100644 damage.lua delete mode 100644 debugitems.lua delete mode 100644 depends.txt delete mode 100644 description.txt delete mode 100644 helpers.lua delete mode 100644 init.lua delete mode 100644 misc_nodes.lua delete mode 100644 models/advtrains_dtrack_bumper_st.b3d delete mode 100644 models/advtrains_dtrack_bumper_st_30.b3d delete mode 100644 models/advtrains_dtrack_bumper_st_45.b3d delete mode 100644 models/advtrains_dtrack_bumper_st_60.b3d delete mode 100644 models/advtrains_dtrack_cr.b3d delete mode 100644 models/advtrains_dtrack_cr_30.b3d delete mode 100644 models/advtrains_dtrack_cr_45.b3d delete mode 100644 models/advtrains_dtrack_cr_60.b3d delete mode 100644 models/advtrains_dtrack_detector_st.b3d delete mode 100644 models/advtrains_dtrack_detector_st_30.b3d delete mode 100644 models/advtrains_dtrack_detector_st_45.b3d delete mode 100644 models/advtrains_dtrack_detector_st_60.b3d delete mode 100644 models/advtrains_dtrack_st.b3d delete mode 100644 models/advtrains_dtrack_st_30.b3d delete mode 100644 models/advtrains_dtrack_st_45.b3d delete mode 100644 models/advtrains_dtrack_st_60.b3d delete mode 100644 models/advtrains_dtrack_swlcr.b3d delete mode 100644 models/advtrains_dtrack_swlcr_30.b3d delete mode 100644 models/advtrains_dtrack_swlcr_45.b3d delete mode 100644 models/advtrains_dtrack_swlcr_60.b3d delete mode 100644 models/advtrains_dtrack_swlst.b3d delete mode 100644 models/advtrains_dtrack_swlst_30.b3d delete mode 100644 models/advtrains_dtrack_swlst_45.b3d delete mode 100644 models/advtrains_dtrack_swlst_60.b3d delete mode 100644 models/advtrains_dtrack_swrcr.b3d delete mode 100644 models/advtrains_dtrack_swrcr_30.b3d delete mode 100644 models/advtrains_dtrack_swrcr_45.b3d delete mode 100644 models/advtrains_dtrack_swrcr_60.b3d delete mode 100644 models/advtrains_dtrack_swrst.b3d delete mode 100644 models/advtrains_dtrack_swrst_30.b3d delete mode 100644 models/advtrains_dtrack_swrst_45.b3d delete mode 100644 models/advtrains_dtrack_swrst_60.b3d delete mode 100644 models/advtrains_dtrack_vst1.b3d delete mode 100644 models/advtrains_dtrack_vst1_45.b3d delete mode 100644 models/advtrains_dtrack_vst2.b3d delete mode 100644 models/advtrains_dtrack_vst2_45.b3d delete mode 100644 models/advtrains_dtrack_vst31.b3d delete mode 100644 models/advtrains_dtrack_vst32.b3d delete mode 100644 models/advtrains_dtrack_vst33.b3d delete mode 100644 models/advtrains_engine_industrial.b3d delete mode 100644 models/advtrains_engine_japan.b3d delete mode 100644 models/advtrains_engine_steam.b3d delete mode 100644 models/advtrains_modernwagon.b3d delete mode 100644 models/advtrains_retrosignal_off.b3d delete mode 100644 models/advtrains_retrosignal_off_30.b3d delete mode 100644 models/advtrains_retrosignal_off_45.b3d delete mode 100644 models/advtrains_retrosignal_off_60.b3d delete mode 100644 models/advtrains_retrosignal_on.b3d delete mode 100644 models/advtrains_retrosignal_on_30.b3d delete mode 100644 models/advtrains_retrosignal_on_45.b3d delete mode 100644 models/advtrains_retrosignal_on_60.b3d delete mode 100644 models/advtrains_signal.b3d delete mode 100644 models/advtrains_signal_30.b3d delete mode 100644 models/advtrains_signal_45.b3d delete mode 100644 models/advtrains_signal_60.b3d delete mode 100644 models/advtrains_subway_train.b3d delete mode 100644 models/advtrains_track_cr.b3d delete mode 100644 models/advtrains_track_st.b3d delete mode 100644 models/advtrains_track_st_45.b3d delete mode 100644 models/advtrains_wagon.b3d delete mode 100644 models/advtrains_wagon_japan.b3d delete mode 100644 models/advtrains_wagon_tank.b3d delete mode 100644 models/advtrains_wagon_wood.b3d delete mode 100644 models/blender/engine-with-animation.blend delete mode 100644 models/blender/gleis/infos/Grafik_weiche.png delete mode 100644 models/blender/gleis/infos/breite delete mode 100644 models/blender/gleis/licence.txt~ delete mode 100644 models/blender/gleis/rail_my.blend delete mode 100644 models/blender/gleis/rail_my.blend1 delete mode 100644 models/blender/gleis/rail_my_rt.blend delete mode 100644 models/blender/gleis/rail_my_rt.blend1 delete mode 100644 models/blender/gleis/rail_my_rt_final.blend delete mode 100644 models/blender/gleis/rail_my_rt_final.blend1 delete mode 100644 models/blender/gleis/rail_my_rt_switches.blend delete mode 100644 models/blender/gleis/rail_my_rt_switches.blend1 delete mode 100644 models/blender/gleis/rail_my_rt_switches2.blend delete mode 100644 models/blender/gleis/rail_my_rt_switches2.blend1 delete mode 100644 models/blender/gleis/rail_together.blend delete mode 100644 models/blender/gleis/rail_together.png delete mode 100644 models/blender/gleis/rail_together2.png delete mode 100644 models/blender/gleis/rail_together3.png delete mode 100644 models/blender/gleis/rail_verticals.blend delete mode 100644 models/blender/gleis/rail_verticals.blend1 delete mode 100644 models/blender/gleis/rail_verticals3.blend delete mode 100644 models/blender/gleis/rail_verticals3.blend1 delete mode 100644 models/blender/gleis/rail_verticals45.blend delete mode 100644 models/blender/gleis/rail_verticals45.blend1 delete mode 100644 models/blender/gleis/rail_verticals45.blend11 delete mode 100644 models/blender/gleis/texturen/rail.png delete mode 100644 models/blender/gleis/texturen/uv.png delete mode 100644 models/blender/industrial/industry_loc.blend delete mode 100644 models/blender/industrial/industry_loc.blend1 delete mode 100644 models/blender/industrial/industry_loc.blend11 delete mode 100644 models/blender/industrial/industry_oil_ wagong.blend delete mode 100644 models/blender/industrial/industry_oil_ wagong.blend1 delete mode 100644 models/blender/industrial/industry_tree_wagong.blend delete mode 100644 models/blender/industrial/industry_tree_wagong.blend1 delete mode 100644 models/blender/industrial/industry_tree_wagong.png delete mode 100644 models/blender/locomotive.blend delete mode 100644 models/blender/magnet_track.blend delete mode 100644 models/blender/mbb/advtrains_wagon_japan.xcf delete mode 100644 models/blender/mbb/modern_japanlocomotive.blend delete mode 100644 models/blender/mbb/modern_japanlocomotive.blend1 delete mode 100644 models/blender/mbb/modern_japanlocomotive.png delete mode 100644 models/blender/mbb/modern_japanlocomotive.xcf delete mode 100644 models/blender/mbb/modern_locomotive.blend delete mode 100644 models/blender/mbb/modern_wagong.blend delete mode 100644 models/blender/mbb/modern_wagong.blend1 delete mode 100644 models/blender/mbb/modern_wagong_uv.blend delete mode 100644 models/blender/mbb/modern_wagong_uv.blend1 delete mode 100644 models/blender/mbb/modern_wagong_uv.png delete mode 100644 models/blender/mbb/prellbock.blend delete mode 100644 models/blender/mbb/prellbock.blend1 delete mode 100644 models/blender/mbb/prellbock.uv.png delete mode 100644 models/blender/mbb/regio-lokomotive.blend delete mode 100644 models/blender/mbb/regio-waron.blend delete mode 100644 models/blender/mbb/retrosignal.blend delete mode 100644 models/blender/mbb/retrosignal.blend1 delete mode 100644 models/blender/mbb/signal(2)_hoch.blend delete mode 100644 models/blender/mbb/signal(2)_unten.blend delete mode 100644 models/blender/mbb/signal.blend delete mode 100644 models/blender/mbb/signal.blend1 delete mode 100644 models/blender/mbb/signal.png delete mode 100644 models/blender/mbb/signal.xcf delete mode 100644 models/blender/mbb/signal2.png delete mode 100644 models/blender/mbb/tr-logo.png delete mode 100644 models/blender/mbb/weichenhebel1.blend delete mode 100644 models/blender/mbb/weichenhebel2.blend delete mode 100644 models/blender/newlocomotive.blend delete mode 100644 models/blender/newlocomotive.blend1 delete mode 100644 models/blender/newlocomotive_uvs.png delete mode 100644 models/blender/newwagon.blend delete mode 100644 models/blender/newwagon.blend1 delete mode 100644 models/blender/newwagon.png delete mode 100644 models/blender/subway-train.blend delete mode 100644 models/blender/subway-train.blend1 delete mode 100644 models/blender/subway-train.png delete mode 100644 models/blender/subway-train.xcf delete mode 100644 models/blender/trackplane.blend delete mode 100644 models/blender/trackvertical1.blend delete mode 100644 models/blender/trackvertical1.blend1 delete mode 100644 models/blender/trackvertical1.png delete mode 100644 models/blender/trackvertical2.blend delete mode 100644 models/blender/trackvertical2.png delete mode 100644 models/oldmodels/locomotive.b3d delete mode 100644 models/oldmodels/trackvertical1.b3d delete mode 100644 models/oldmodels/trackvertical2.b3d delete mode 100644 models/trackplane.b3d create mode 100644 modpack.txt delete mode 100644 pseudoload.lua delete mode 100644 readme.txt delete mode 100644 signals.lua delete mode 100644 textures/advtrains_couple.png delete mode 100644 textures/advtrains_discouple.png delete mode 100644 textures/advtrains_dtrack_bumper_placer.png delete mode 100644 textures/advtrains_dtrack_detector_placer.png delete mode 100644 textures/advtrains_dtrack_placer.png delete mode 100644 textures/advtrains_dtrack_rail.png delete mode 100644 textures/advtrains_dtrack_rail_detector_on.png delete mode 100644 textures/advtrains_dtrack_slopeplacer.png delete mode 100644 textures/advtrains_engine_industrial.png delete mode 100644 textures/advtrains_engine_industrial_inv.png delete mode 100644 textures/advtrains_engine_japan.png delete mode 100644 textures/advtrains_engine_japan_inv.png delete mode 100644 textures/advtrains_newlocomotive.png delete mode 100644 textures/advtrains_newlocomotive.xcf delete mode 100755 textures/advtrains_newlocomotive_inv.png delete mode 100644 textures/advtrains_platform.png delete mode 100644 textures/advtrains_retrosignal.png delete mode 100644 textures/advtrains_retrosignal_inv.png delete mode 100644 textures/advtrains_signal_inv.png delete mode 100644 textures/advtrains_signal_off.png delete mode 100644 textures/advtrains_signal_on.png delete mode 100644 textures/advtrains_subway_train.png delete mode 100644 textures/advtrains_subway_train_inv.png delete mode 100644 textures/advtrains_track_cr.png delete mode 100644 textures/advtrains_track_cr_45.png delete mode 100644 textures/advtrains_track_placer.png delete mode 100644 textures/advtrains_track_st.png delete mode 100644 textures/advtrains_track_st_45.png delete mode 100644 textures/advtrains_track_swlcr.png delete mode 100644 textures/advtrains_track_swlcr_45.png delete mode 100644 textures/advtrains_track_swlst.png delete mode 100644 textures/advtrains_track_swlst_45.png delete mode 100644 textures/advtrains_track_swrcr.png delete mode 100644 textures/advtrains_track_swrcr_45.png delete mode 100644 textures/advtrains_track_swrst.png delete mode 100644 textures/advtrains_track_swrst_45.png delete mode 100644 textures/advtrains_trackworker.png delete mode 100644 textures/advtrains_wagon.png delete mode 100644 textures/advtrains_wagon_box.png delete mode 100644 textures/advtrains_wagon_box_inv.png delete mode 100755 textures/advtrains_wagon_inv.png delete mode 100644 textures/advtrains_wagon_japan.png delete mode 100644 textures/advtrains_wagon_japan_inv.png delete mode 100644 textures/advtrains_wagon_tank.png delete mode 100644 textures/advtrains_wagon_tank_inv.png delete mode 100644 textures/advtrains_wagon_wood.png delete mode 100644 textures/advtrains_wagon_wood_inv.png delete mode 100644 textures/drwho_screwdriver.png delete mode 100644 textures/larger rails.xcf delete mode 100644 trackplacer.lua delete mode 100644 tracks.lua delete mode 100644 trainhud.lua delete mode 100644 trainlogic.lua delete mode 100644 wagons.lua diff --git a/advtrains/atc.lua b/advtrains/atc.lua new file mode 100644 index 0000000..0afddb0 --- /dev/null +++ b/advtrains/atc.lua @@ -0,0 +1,4 @@ +--atc.lua +--registers and controls the ATC system + +--(simple)mesecon detector rails diff --git a/advtrains/couple.lua b/advtrains/couple.lua new file mode 100644 index 0000000..a846c8b --- /dev/null +++ b/advtrains/couple.lua @@ -0,0 +1,154 @@ +--couple.lua +--defines couple entities. + +--advtrains:discouple +--set into existing trains to split them when punched. +--they are attached to the wagons. +--[[fields +wagon + +wagons keep their couple entity minetest-internal id inside the field discouple_id. if it refers to nowhere, they will spawn a new one if player is near +]] +local print=function(t, ...) minetest.log("action", table.concat({t, ...}, " ")) minetest.chat_send_all(table.concat({t, ...}, " ")) end + + +minetest.register_entity("advtrains:discouple", { + visual="sprite", + textures = {"advtrains_discouple.png"}, + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + visual_size = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + + is_discouple=true, + on_activate=function(self, staticdata) + if staticdata=="DISCOUPLE" then + --couple entities have no right to exist further... + self.object:remove() + return + end + self.object:set_armor_groups({immortal=1}) + end, + get_staticdata=function() return "DISCOUPLE" end, + on_punch=function(self, player) + --only if player owns at least one wagon next to this + local own=player:get_player_name() + if self.wagon.owner and self.wagon.owner~=own then + local train=advtrains.trains[self.wagon.train_id] + local nextwgn_id=train.trainparts[self.wagon.pos_in_trainparts-1] + for aoi, le in pairs(minetest.luaentities) do + if le and le.is_wagon then + if le.unique_id==nextwgn_id then + if le.owner and le.owner~=own then + minetest.chat_send_player(own, "You need to own at least one neighboring wagon to destroy this couple.") + return + end + end + end + end + end + advtrains.split_train_at_wagon(self.wagon)--found in trainlogic.lua + end, + on_step=function(self, dtime) + local t=os.clock() + if not self.wagon then + self.object:remove() + return + end + --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. + if not self.wagon.object:getyaw() then + self.object:remove() + return + end + local velocityvec=self.wagon.object:getvelocity() + self.updatepct_timer=(self.updatepct_timer or 0)-dtime + if not self.old_velocity_vector or not vector.equals(velocityvec, self.old_velocity_vector) or self.updatepct_timer<=0 then--only send update packet if something changed + local flipsign=self.wagon.wagon_flipped and -1 or 1 + self.object:setpos(vector.add(self.wagon.object:getpos(), {y=0, x=-math.sin(self.wagon.object:getyaw())*self.wagon.wagon_span*flipsign, z=math.cos(self.wagon.object:getyaw())*self.wagon.wagon_span*flipsign})) + self.object:setvelocity(velocityvec) + self.updatepct_timer=2 + end + printbm("discouple_step", t) + end, +}) + +--advtrains:couple +--when two trains overlap with their end-positions, this entity will be spawned and both trains set its id into appropiate fields for them to know when to free them again. The entity will destroy automatically when it recognizes that any of the trains left the common position. +--[[fields +train_id_1 +train_id_2 +train1_is_backpos +train2_is_backpos +]] + + +minetest.register_entity("advtrains:couple", { + visual="sprite", + textures = {"advtrains_couple.png"}, + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + visual_size = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + + is_couple=true, + on_activate=function(self, staticdata) + if staticdata=="COUPLE" then + --couple entities have no right to exist further... + self.object:remove() + return + end + end, + get_staticdata=function(self) return "COUPLE" end, + on_rightclick=function(self) + if not self.train_id_1 or not self.train_id_2 then return end + + local id1, id2=self.train_id_1, self.train_id_2 + + if self.train1_is_backpos and not self.train2_is_backpos then + advtrains.do_connect_trains(id1, id2) + --case 2 (second train is front) + elseif self.train2_is_backpos and not self.train1_is_backpos then + advtrains.do_connect_trains(id2, id1) + --case 3 + elseif self.train1_is_backpos and self.train2_is_backpos then + advtrains.invert_train(id2) + advtrains.do_connect_trains(id1, id2) + --case 4 + elseif not self.train1_is_backpos and not self.train2_is_backpos then + advtrains.invert_train(id1) + advtrains.do_connect_trains(id1, id2) + end + self.object:remove() + end, + on_step=function(self, dtime) + local t=os.clock() + if not self.train_id_1 or not self.train_id_2 then print("wtf no train ids?")return end + local train1=advtrains.trains[self.train_id_1] + local train2=advtrains.trains[self.train_id_2] + if not train1 or not train2 or not train1.path or not train2.path or not train1.index or not train2.index then + self.object:remove() + return + end + + local tp1 + if not self.train1_is_backpos then + tp1=advtrains.get_real_index_position(train1.path, train1.index) + else + tp1=advtrains.get_real_index_position(train1.path, advtrains.get_train_end_index(train1)) + end + local tp2 + if not self.train2_is_backpos then + tp2=advtrains.get_real_index_position(train2.path, train2.index) + else + tp2=advtrains.get_real_index_position(train2.path, advtrains.get_train_end_index(train2)) + end + if not tp1 or not tp2 or not (vector.distance(tp1,tp2)<0.5) then + self.object:remove() + return + else + local pos_median=advtrains.pos_median(tp1, tp2) + if not vector.equals(pos_median, self.object:getpos()) then + self.object:setpos(pos_median) + end + end + printbm("couple step", t) + end, +}) diff --git a/advtrains/crafting.lua b/advtrains/crafting.lua new file mode 100644 index 0000000..5ba12ce --- /dev/null +++ b/advtrains/crafting.lua @@ -0,0 +1,71 @@ +--advtrains by orwell96, see readme.txt and license.txt +--crafting.lua +--registers crafting recipes + +--tracks +minetest.register_craft({ + output = 'advtrains:dtrack_placer 50', + recipe = { + {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, + {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, + {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, + }, +}) +minetest.register_craft({ + type = "shapeless", + output = 'advtrains:dtrack_slopeplacer 2', + recipe = { + "advtrains:dtrack_placer", + "advtrains:dtrack_placer", + "default:gravel", + }, +}) + +minetest.register_craft({ + output = 'advtrains:dtrack_bumper_placer 2', + recipe = { + {'default:wood', 'dye:red'}, + {'default:steel_ingot', 'default:steel_ingot'}, + {'advtrains:dtrack_placer', 'advtrains:dtrack_placer'}, + }, +}) +minetest.register_craft({ + type="shapeless", + output = 'advtrains:dtrack_detector_off_placer', + recipe = { + "advtrains:dtrack_placer", + "mesecons:wire_00000000_off" + }, +}) +--signals +minetest.register_craft({ + output = 'advtrains:retrosignal_off 2', + recipe = { + {'dye:red', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', 'default:steel_ingot'}, + {'', '', 'default:steel_ingot'}, + }, +}) +minetest.register_craft({ + output = 'advtrains:signal_off 2', + recipe = { + {'', 'dye:red', 'default:steel_ingot'}, + {'', 'dye:dark_green', 'default:steel_ingot'}, + {'', '', 'default:steel_ingot'}, + }, +}) + +--trackworker +minetest.register_craft({ + output = 'advtrains:trackworker', + recipe = { + {'default:diamond'}, + {'screwdriver:screwdriver'}, + {'default:steel_ingot'}, + }, +}) + + + +--misc_nodes +--crafts for platforms see misc_nodes.lua diff --git a/advtrains/damage.lua b/advtrains/damage.lua new file mode 100644 index 0000000..b39fe67 --- /dev/null +++ b/advtrains/damage.lua @@ -0,0 +1,26 @@ +--damage.lua +--a globalstep that damages players overrolled by trains. + +advtrains.player_to_train_mapping={} + +local tmr=0 +minetest.register_globalstep(function(dtime) + tmr=tmr-dtime + if tmr<=0 then + + for _, player in pairs(minetest.get_connected_players()) do + local pos=player:getpos() + for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local le=object:get_luaentity() + if le and le.is_wagon and le.initialized and le:train() then + if (not advtrains.player_to_train_mapping[player:get_player_name()] or le.train_id~=advtrains.player_to_train_mapping[player:get_player_name()]) and math.abs(le:train().velocity)>2 then + --player:punch(object, 1000, {damage={fleshy=3*math.abs(le:train().velocity)}}) + player:set_hp(player:get_hp()-math.abs(le:train().velocity)-3) + end + end + end + end + + tmr=0.5 + end +end) diff --git a/advtrains/debugitems.lua b/advtrains/debugitems.lua new file mode 100644 index 0000000..b3164ff --- /dev/null +++ b/advtrains/debugitems.lua @@ -0,0 +1,36 @@ +minetest.register_tool("advtrains:tunnelborer", +{ + description = "tunnelborer", + groups = {cracky=1}, -- key=name, value=rating; rating=1..3. + inventory_image = "drwho_screwdriver.png", + wield_image = "drwho_screwdriver.png", + stack_max = 1, + range = 7.0, + + on_place = function(itemstack, placer, pointed_thing) + + end, + --[[ + ^ Shall place item and return the leftover itemstack + ^ default: minetest.item_place ]] + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type=="node" then + for x=-1,1 do + for y=-1,1 do + for z=-1,1 do + minetest.remove_node(vector.add(pointed_thing.under, {x=x, y=y, z=z})) + end + end + end + end + end, +--[[ +^ default: nil +^ Function must return either nil if no item shall be removed from +inventory, or an itemstack to replace the original itemstack. +e.g. itemstack:take_item(); return itemstack +^ Otherwise, the function is free to do what it wants. +^ The default functions handle regular use cases. +]] +} +) diff --git a/advtrains/depends.txt b/advtrains/depends.txt new file mode 100644 index 0000000..20aa884 --- /dev/null +++ b/advtrains/depends.txt @@ -0,0 +1,2 @@ +default +mesecons? \ No newline at end of file diff --git a/advtrains/description.txt b/advtrains/description.txt new file mode 100644 index 0000000..ecc5d58 --- /dev/null +++ b/advtrains/description.txt @@ -0,0 +1,8 @@ +Advanced Trains v1.3.0, by orwell and contributors. Also see readme. +Good-looking, realistic trains for minetest. + +For crafting recipes, see manual.pdf + +Website: http://advtrains.bleipb.de/ +Manual: https://github.com/orwell96/advtrains/blob/master/manual.pdf +Forum : https://forum.minetest.net/viewtopic.php?f=11&t=14726 \ No newline at end of file diff --git a/advtrains/helpers.lua b/advtrains/helpers.lua new file mode 100644 index 0000000..6a8175f --- /dev/null +++ b/advtrains/helpers.lua @@ -0,0 +1,249 @@ +--advtrains by orwell96, see readme.txt +local print=function(t) minetest.log("action", t) minetest.chat_send_all(t) end + +advtrains.dir_trans_tbl={ + [0]={x=0, z=1}, + [1]={x=1, z=2}, + [2]={x=1, z=1}, + [3]={x=2, z=1}, + [4]={x=1, z=0}, + [5]={x=2, z=-1}, + [6]={x=1, z=-1}, + [7]={x=1, z=-2}, + [8]={x=0, z=-1}, + [9]={x=-1, z=-2}, + [10]={x=-1, z=-1}, + [11]={x=-2, z=-1}, + [12]={x=-1, z=0}, + [13]={x=-2, z=1}, + [14]={x=-1, z=1}, + [15]={x=-1, z=2}, +} + +function advtrains.dirCoordSet(coord, dir) + local x,z + if advtrains.dir_trans_tbl[dir] then + x,z=advtrains.dir_trans_tbl[dir].x, advtrains.dir_trans_tbl[dir].z + else + error("advtrains: in helpers.lua/dirCoordSet() given dir="..(dir or "nil")) + end + return {x=coord.x+x, y=coord.y, z=coord.z+z} +end +function advtrains.dirToCoord(dir) + return advtrains.dirCoordSet({x=0, y=0, z=0}, dir) +end + +function advtrains.maxN(list, expectstart) + local n=expectstart or 0 + while list[n] do + n=n+1 + end + return n-1 +end + +function advtrains.minN(list, expectstart) + local n=expectstart or 0 + while list[n] do + n=n-1 + end + return n+1 +end + +--vertical_transmit: +--[[ +rely1, rely2 tell to which height the connections are pointed to. 1 means it will go up the next node + +]] + +function advtrains.conway(midreal, prev, traintype)--in order prev,mid,return + local mid=advtrains.round_vector_floor_y(midreal) + local drives_on=advtrains.all_traintypes[traintype].drives_on + + if not advtrains.get_rail_info_at(advtrains.round_vector_floor_y(prev), traintype) then + return nil + end + + local midnode_ok, middir1, middir2, midrely1, midrely2=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(mid), traintype) + if not midnode_ok then + return nil + end + + local next, chkdir, chkrely, y_offset + y_offset=0 + --print("[advtrains] in order mid1,mid2",middir1,middir2) + --try if it is dir1 + local cor1=advtrains.dirCoordSet(mid, middir2)--<<<< + if math.floor(cor1.x+0.5)==math.floor(prev.x+0.5) and math.floor(cor1.z+0.5)==math.floor(prev.z+0.5) then--this was previous + next=advtrains.dirCoordSet(mid, middir1) + if midrely1>=1 then + next.y=next.y+1 + --print("[advtrains]found midrely1 to be >=1: next is now "..(next and minetest.pos_to_string(next) or "nil")) + y_offset=1 + end + chkdir=middir1 + chkrely=midrely1 + --print("[advtrains]dir2 applied next pos:",minetest.pos_to_string(next),"(chkdir is ",chkdir,")") + end + --dir2??? + local cor2=advtrains.dirCoordSet(mid, middir1)--<<<< + if math.floor(cor2.x+0.5)==math.floor(prev.x+0.5) and math.floor(cor2.z+0.5)==math.floor(prev.z+0.5) then + next=advtrains.dirCoordSet(mid, middir2)--dir2 wird überprüft, alles gut. + if midrely2>=1 then + next.y=next.y+1 + --print("[advtrains]found midrely2 to be >=1: next is now "..(next and minetest.pos_to_string(next) or "nil")) + y_offset=1 + end + chkdir=middir2 + chkrely=midrely2 + --print("[advtrains] dir2 applied next pos:",minetest.pos_to_string(next),"(chkdir is ",chkdir,")") + end + --print("[advtrains]dir applied next pos: "..(next and minetest.pos_to_string(next) or "nil").."(chkdir is "..(chkdir or "nil")..", y-offset "..y_offset..")") + --is there a next + if not next then + --print("[advtrains]in conway: no next rail(nil), returning!") + return nil + end + + local nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) + + --is it a rail? + if(not nextnode_ok) then + --print("[advtrains]in conway: next "..minetest.pos_to_string(next).." not a rail, trying one node below!") + next.y=next.y-1 + y_offset=y_offset-1 + + nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) + if(not nextnode_ok) then + --print("[advtrains]in conway: one below "..minetest.pos_to_string(next).." is not a rail either, returning!") + return nil + end + end + + --is this next rail connecting to the mid? + if not ( (((nextdir1+8)%16)==chkdir and nextrely1==chkrely-y_offset) or (((nextdir2+8)%16)==chkdir and nextrely2==chkrely-y_offset) ) then + --print("[advtrains]in conway: next "..minetest.pos_to_string(next).." not connecting, trying one node below!") + next.y=next.y-1 + y_offset=y_offset-1 + + nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) + if(not nextnode_ok) then + --print("[advtrains]in conway: (at connecting if check again) one below "..minetest.pos_to_string(next).." is not a rail either, returning!") + return nil + end + if not ( (((nextdir1+8)%16)==chkdir and nextrely1==chkrely) or (((nextdir2+8)%16)==chkdir and nextrely2==chkrely) ) then + --print("[advtrains]in conway: one below "..minetest.pos_to_string(next).." rail not connecting, returning!") + --print("[advtrains] in order mid1,2,next1,2,chkdir "..middir1.." "..middir2.." "..nextdir1.." "..nextdir2.." "..chkdir) + return nil + end + end + + --print("[advtrains]conway found rail.") + return vector.add(advtrains.round_vector_floor_y(next), {x=0, y=nextrailheight, z=0}), chkdir +end +--TODO use this +function advtrains.oppd(dir) + return ((dir+8)%16) +end + +function advtrains.round_vector_floor_y(vec) + return {x=math.floor(vec.x+0.5), y=math.floor(vec.y), z=math.floor(vec.z+0.5)} +end + +function advtrains.yawToDirection(yaw, conn1, conn2) + if not conn1 or not conn2 then + error("given nil to yawToDirection: conn1="..(conn1 or "nil").." conn2="..(conn1 or "nil")) + end + local yaw1=math.pi*(conn1/4) + local yaw2=math.pi*(conn2/4) + if advtrains.minAngleDiffRad(yaw, yaw1) if weird behavior + return conn2 + else + return conn1 + end +end + +function advtrains.minAngleDiffRad(r1, r2) + local try1=r2-r1 + local try2=(r2+2*math.pi)-r1 + local try3=r2-(r1+2*math.pi) + if math.min(math.abs(try1), math.abs(try2), math.abs(try3))==math.abs(try1) then + return try1 + end + if math.min(math.abs(try1), math.abs(try2), math.abs(try3))==math.abs(try2) then + return try2 + end + if math.min(math.abs(try1), math.abs(try2), math.abs(try3))==math.abs(try3) then + return try3 + end +end +function advtrains.dumppath(path) + if not path then print("dumppath: no path(nil)") return end + local min=advtrains.minN(path) + local max=advtrains.maxN(path) + for i=min, max do print("["..i.."] "..(path[i] and minetest.pos_to_string(path[i]) or "nil")) end +end + +function advtrains.merge_tables(a, ...) + local new={} + for _,t in ipairs({a,...}) do + for k,v in pairs(t) do new[k]=v end + end + return new +end +function advtrains.yaw_from_3_positions(prev, curr, next) + local pts=minetest.pos_to_string + --print("p3 "..pts(prev)..pts(curr)..pts(next)) + local prev2curr=math.atan2((curr.x-prev.x), (prev.z-curr.z)) + local curr2next=math.atan2((next.x-curr.x), (curr.z-next.z)) + --print("y3 "..(prev2curr*360/(2*math.pi)).." "..(curr2next*360/(2*math.pi))) + return prev2curr+(advtrains.minAngleDiffRad(prev2curr, curr2next)/2) +end +function advtrains.get_wagon_yaw(front, first, second, back, pct) + local pts=minetest.pos_to_string + --print("p "..pts(front)..pts(first)..pts(second)..pts(back)) + local y2=advtrains.yaw_from_3_positions(second, first, front) + local y1=advtrains.yaw_from_3_positions(back, second, first) + --print("y "..(y1*360/(2*math.pi)).." "..(y2*360/(2*math.pi))) + return y1+advtrains.minAngleDiffRad(y1, y2)*pct +end +function advtrains.get_real_index_position(path, index) + if not path or not index then return end + + local first_pos=path[math.floor(index)] + local second_pos=path[math.floor(index)+1] + + if not first_pos or not second_pos then return nil end + + local factor=index-math.floor(index) + local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,} + return actual_pos +end +function advtrains.pos_median(pos1, pos2) + return {x=pos1.x-(pos1.x-pos2.x)*0.5, y=pos1.y-(pos1.y-pos2.y)*0.5, z=pos1.z-(pos1.z-pos2.z)*0.5} +end +function advtrains.abs_ceil(i) + return math.ceil(math.abs(i))*math.sign(i) +end + +function advtrains.serialize_inventory(inv) + local ser={} + local liszts=inv:get_lists() + for lisztname, liszt in pairs(liszts) do + ser[lisztname]={} + for idx, item in ipairs(liszt) do + local istring=item:to_string() + if istring~="" then + ser[lisztname][idx]=istring + end + end + end + return minetest.serialize(ser) +end +function advtrains.deserialize_inventory(sers, inv) + local ser=minetest.deserialize(sers) + if ser then + inv:set_lists(ser) + return true + end + return false +end diff --git a/advtrains/init.lua b/advtrains/init.lua new file mode 100644 index 0000000..41b624e --- /dev/null +++ b/advtrains/init.lua @@ -0,0 +1,42 @@ +--advtrains + +advtrains={} + +advtrains.modpath = minetest.get_modpath("advtrains") + +--print=function(text) +-- minetest.log("action", tostring(text) or "") +--end +print = function(t) minetest.log("action", t) minetest.chat_send_all(t) end + +dofile(advtrains.modpath.."/helpers.lua"); +dofile(advtrains.modpath.."/debugitems.lua"); + +advtrains.meseconrules = +{{x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=1, y=1, z=0}, + {x=1, y=-1, z=0}, + {x=-1, y=1, z=0}, + {x=-1, y=-1, z=0}, + {x=0, y=1, z=1}, + {x=0, y=-1, z=1}, + {x=0, y=1, z=-1}, + {x=0, y=-1, z=-1}, + {x=0, y=-2, z=0}} +dofile(advtrains.modpath.."/trainlogic.lua") +dofile(advtrains.modpath.."/trainhud.lua") +dofile(advtrains.modpath.."/trackplacer.lua") +dofile(advtrains.modpath.."/tracks.lua") +dofile(advtrains.modpath.."/atc.lua") +dofile(advtrains.modpath.."/wagons.lua") + +dofile(advtrains.modpath.."/pseudoload.lua") +dofile(advtrains.modpath.."/couple.lua") +dofile(advtrains.modpath.."/damage.lua") + +dofile(advtrains.modpath.."/signals.lua") +dofile(advtrains.modpath.."/misc_nodes.lua") +dofile(advtrains.modpath.."/crafting.lua") diff --git a/advtrains/misc_nodes.lua b/advtrains/misc_nodes.lua new file mode 100644 index 0000000..93829f0 --- /dev/null +++ b/advtrains/misc_nodes.lua @@ -0,0 +1,67 @@ +--all nodes that do not fit in any other category + +function advtrains.register_platform(preset) + local ndef=minetest.registered_nodes[preset] + if not ndef then + minetest.log("warning", "[advtrains] register_platform couldn't find preset node "..preset) + return + end + local btex=ndef.tiles + if type(btex)=="table" then + btex=btex[1] + end + local desc=ndef.description or "" + local nodename=string.match(preset, ":(.+)$") + minetest.register_node("advtrains:platform_low_"..nodename, { + description = desc.." Platform (low)", + tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex}, + groups = {cracky = 1, not_blocking_trains = 1, platform=1}, + sounds = default.node_sound_stone_defaults(), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.1, -0.1, 0.5, 0 , 0.5}, + {-0.5, -0.5, 0 , 0.5, -0.1, 0.5} + }, + }, + paramtype2="facedir", + paramtype = "light", + sunlight_propagates = true, + }) + minetest.register_node("advtrains:platform_high_"..nodename, { + description = desc.." Platform (high)", + tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex}, + groups = {cracky = 1, not_blocking_trains = 1, platform=2}, + sounds = default.node_sound_stone_defaults(), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.3, -0.1, 0.5, 0.5, 0.5}, + {-0.5, -0.5, 0 , 0.5, 0.3, 0.5} + }, + }, + paramtype2="facedir", + paramtype = "light", + sunlight_propagates = true, + }) + minetest.register_craft({ + type="shapeless", + output = "advtrains:platform_high_"..nodename.." 4", + recipe = { + "dye:yellow", preset, preset + }, + }) + minetest.register_craft({ + type="shapeless", + output = "advtrains:platform_low_"..nodename.." 4", + recipe = { + "dye:yellow", preset + }, + }) +end + + +advtrains.register_platform("default:stonebrick") +advtrains.register_platform("default:sandstonebrick") diff --git a/advtrains/models/advtrains_dtrack_bumper_st.b3d b/advtrains/models/advtrains_dtrack_bumper_st.b3d new file mode 100644 index 0000000..a6d9745 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_bumper_st.b3d differ diff --git a/advtrains/models/advtrains_dtrack_bumper_st_30.b3d b/advtrains/models/advtrains_dtrack_bumper_st_30.b3d new file mode 100644 index 0000000..5f5b3f4 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_bumper_st_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_bumper_st_45.b3d b/advtrains/models/advtrains_dtrack_bumper_st_45.b3d new file mode 100644 index 0000000..f13ae75 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_bumper_st_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_bumper_st_60.b3d b/advtrains/models/advtrains_dtrack_bumper_st_60.b3d new file mode 100644 index 0000000..59a2285 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_bumper_st_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_cr.b3d b/advtrains/models/advtrains_dtrack_cr.b3d new file mode 100644 index 0000000..159717e Binary files /dev/null and b/advtrains/models/advtrains_dtrack_cr.b3d differ diff --git a/advtrains/models/advtrains_dtrack_cr_30.b3d b/advtrains/models/advtrains_dtrack_cr_30.b3d new file mode 100644 index 0000000..09cdb1f Binary files /dev/null and b/advtrains/models/advtrains_dtrack_cr_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_cr_45.b3d b/advtrains/models/advtrains_dtrack_cr_45.b3d new file mode 100644 index 0000000..176da81 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_cr_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_cr_60.b3d b/advtrains/models/advtrains_dtrack_cr_60.b3d new file mode 100644 index 0000000..00313c8 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_cr_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_detector_st.b3d b/advtrains/models/advtrains_dtrack_detector_st.b3d new file mode 100644 index 0000000..893c8cd Binary files /dev/null and b/advtrains/models/advtrains_dtrack_detector_st.b3d differ diff --git a/advtrains/models/advtrains_dtrack_detector_st_30.b3d b/advtrains/models/advtrains_dtrack_detector_st_30.b3d new file mode 100644 index 0000000..2e59e93 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_detector_st_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_detector_st_45.b3d b/advtrains/models/advtrains_dtrack_detector_st_45.b3d new file mode 100644 index 0000000..c73166f Binary files /dev/null and b/advtrains/models/advtrains_dtrack_detector_st_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_detector_st_60.b3d b/advtrains/models/advtrains_dtrack_detector_st_60.b3d new file mode 100644 index 0000000..b6bc9af Binary files /dev/null and b/advtrains/models/advtrains_dtrack_detector_st_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_st.b3d b/advtrains/models/advtrains_dtrack_st.b3d new file mode 100644 index 0000000..f3e2753 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_st.b3d differ diff --git a/advtrains/models/advtrains_dtrack_st_30.b3d b/advtrains/models/advtrains_dtrack_st_30.b3d new file mode 100644 index 0000000..7a35c8d Binary files /dev/null and b/advtrains/models/advtrains_dtrack_st_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_st_45.b3d b/advtrains/models/advtrains_dtrack_st_45.b3d new file mode 100644 index 0000000..b2a1702 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_st_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_st_60.b3d b/advtrains/models/advtrains_dtrack_st_60.b3d new file mode 100644 index 0000000..0a59f77 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_st_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlcr.b3d b/advtrains/models/advtrains_dtrack_swlcr.b3d new file mode 100644 index 0000000..1adc23f Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlcr.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlcr_30.b3d b/advtrains/models/advtrains_dtrack_swlcr_30.b3d new file mode 100644 index 0000000..7d8373b Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlcr_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlcr_45.b3d b/advtrains/models/advtrains_dtrack_swlcr_45.b3d new file mode 100644 index 0000000..9679b9e Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlcr_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlcr_60.b3d b/advtrains/models/advtrains_dtrack_swlcr_60.b3d new file mode 100644 index 0000000..3efc924 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlcr_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlst.b3d b/advtrains/models/advtrains_dtrack_swlst.b3d new file mode 100644 index 0000000..93841a4 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlst.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlst_30.b3d b/advtrains/models/advtrains_dtrack_swlst_30.b3d new file mode 100644 index 0000000..e9a90c7 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlst_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlst_45.b3d b/advtrains/models/advtrains_dtrack_swlst_45.b3d new file mode 100644 index 0000000..49c707c Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlst_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swlst_60.b3d b/advtrains/models/advtrains_dtrack_swlst_60.b3d new file mode 100644 index 0000000..c9a6ffe Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swlst_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrcr.b3d b/advtrains/models/advtrains_dtrack_swrcr.b3d new file mode 100644 index 0000000..ee29b62 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrcr.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrcr_30.b3d b/advtrains/models/advtrains_dtrack_swrcr_30.b3d new file mode 100644 index 0000000..ba065e1 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrcr_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrcr_45.b3d b/advtrains/models/advtrains_dtrack_swrcr_45.b3d new file mode 100644 index 0000000..7f9dc43 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrcr_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrcr_60.b3d b/advtrains/models/advtrains_dtrack_swrcr_60.b3d new file mode 100644 index 0000000..b8ffa61 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrcr_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrst.b3d b/advtrains/models/advtrains_dtrack_swrst.b3d new file mode 100644 index 0000000..0b3e7ad Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrst.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrst_30.b3d b/advtrains/models/advtrains_dtrack_swrst_30.b3d new file mode 100644 index 0000000..4aea19b Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrst_30.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrst_45.b3d b/advtrains/models/advtrains_dtrack_swrst_45.b3d new file mode 100644 index 0000000..4182fe5 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrst_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_swrst_60.b3d b/advtrains/models/advtrains_dtrack_swrst_60.b3d new file mode 100644 index 0000000..6d2c891 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_swrst_60.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst1.b3d b/advtrains/models/advtrains_dtrack_vst1.b3d new file mode 100644 index 0000000..c9d7427 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst1.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst1_45.b3d b/advtrains/models/advtrains_dtrack_vst1_45.b3d new file mode 100644 index 0000000..14d438c Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst1_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst2.b3d b/advtrains/models/advtrains_dtrack_vst2.b3d new file mode 100644 index 0000000..c128650 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst2.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst2_45.b3d b/advtrains/models/advtrains_dtrack_vst2_45.b3d new file mode 100644 index 0000000..263276d Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst2_45.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst31.b3d b/advtrains/models/advtrains_dtrack_vst31.b3d new file mode 100644 index 0000000..df0f383 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst31.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst32.b3d b/advtrains/models/advtrains_dtrack_vst32.b3d new file mode 100644 index 0000000..01d2978 Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst32.b3d differ diff --git a/advtrains/models/advtrains_dtrack_vst33.b3d b/advtrains/models/advtrains_dtrack_vst33.b3d new file mode 100644 index 0000000..7fe418d Binary files /dev/null and b/advtrains/models/advtrains_dtrack_vst33.b3d differ diff --git a/advtrains/models/advtrains_modernwagon.b3d b/advtrains/models/advtrains_modernwagon.b3d new file mode 100644 index 0000000..aacddca Binary files /dev/null and b/advtrains/models/advtrains_modernwagon.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_off.b3d b/advtrains/models/advtrains_retrosignal_off.b3d new file mode 100644 index 0000000..3d231dd Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_off.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_off_30.b3d b/advtrains/models/advtrains_retrosignal_off_30.b3d new file mode 100644 index 0000000..da258e1 Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_off_30.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_off_45.b3d b/advtrains/models/advtrains_retrosignal_off_45.b3d new file mode 100644 index 0000000..338224a Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_off_45.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_off_60.b3d b/advtrains/models/advtrains_retrosignal_off_60.b3d new file mode 100644 index 0000000..c560ca1 Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_off_60.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_on.b3d b/advtrains/models/advtrains_retrosignal_on.b3d new file mode 100644 index 0000000..3d19439 Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_on.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_on_30.b3d b/advtrains/models/advtrains_retrosignal_on_30.b3d new file mode 100644 index 0000000..98f8a92 Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_on_30.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_on_45.b3d b/advtrains/models/advtrains_retrosignal_on_45.b3d new file mode 100644 index 0000000..414e121 Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_on_45.b3d differ diff --git a/advtrains/models/advtrains_retrosignal_on_60.b3d b/advtrains/models/advtrains_retrosignal_on_60.b3d new file mode 100644 index 0000000..a51529a Binary files /dev/null and b/advtrains/models/advtrains_retrosignal_on_60.b3d differ diff --git a/advtrains/models/advtrains_signal.b3d b/advtrains/models/advtrains_signal.b3d new file mode 100644 index 0000000..7f69560 Binary files /dev/null and b/advtrains/models/advtrains_signal.b3d differ diff --git a/advtrains/models/advtrains_signal_30.b3d b/advtrains/models/advtrains_signal_30.b3d new file mode 100644 index 0000000..0b949a7 Binary files /dev/null and b/advtrains/models/advtrains_signal_30.b3d differ diff --git a/advtrains/models/advtrains_signal_45.b3d b/advtrains/models/advtrains_signal_45.b3d new file mode 100644 index 0000000..ccaebf4 Binary files /dev/null and b/advtrains/models/advtrains_signal_45.b3d differ diff --git a/advtrains/models/advtrains_signal_60.b3d b/advtrains/models/advtrains_signal_60.b3d new file mode 100644 index 0000000..cf41e6d Binary files /dev/null and b/advtrains/models/advtrains_signal_60.b3d differ diff --git a/advtrains/models/advtrains_track_cr.b3d b/advtrains/models/advtrains_track_cr.b3d new file mode 100644 index 0000000..b0f5e4b Binary files /dev/null and b/advtrains/models/advtrains_track_cr.b3d differ diff --git a/advtrains/models/advtrains_track_st.b3d b/advtrains/models/advtrains_track_st.b3d new file mode 100644 index 0000000..10b5d90 Binary files /dev/null and b/advtrains/models/advtrains_track_st.b3d differ diff --git a/advtrains/models/advtrains_track_st_45.b3d b/advtrains/models/advtrains_track_st_45.b3d new file mode 100644 index 0000000..32505a1 Binary files /dev/null and b/advtrains/models/advtrains_track_st_45.b3d differ diff --git a/advtrains/models/blender/engine-with-animation.blend b/advtrains/models/blender/engine-with-animation.blend new file mode 100644 index 0000000..2649587 Binary files /dev/null and b/advtrains/models/blender/engine-with-animation.blend differ diff --git a/advtrains/models/blender/gleis/infos/Grafik_weiche.png b/advtrains/models/blender/gleis/infos/Grafik_weiche.png new file mode 100644 index 0000000..6674eb3 Binary files /dev/null and b/advtrains/models/blender/gleis/infos/Grafik_weiche.png differ diff --git a/advtrains/models/blender/gleis/infos/breite b/advtrains/models/blender/gleis/infos/breite new file mode 100644 index 0000000..b2862c6 --- /dev/null +++ b/advtrains/models/blender/gleis/infos/breite @@ -0,0 +1 @@ +1435mm diff --git a/advtrains/models/blender/gleis/licence.txt~ b/advtrains/models/blender/gleis/licence.txt~ new file mode 100644 index 0000000..e69de29 diff --git a/advtrains/models/blender/gleis/rail_my.blend b/advtrains/models/blender/gleis/rail_my.blend new file mode 100644 index 0000000..3c741bc Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my.blend differ diff --git a/advtrains/models/blender/gleis/rail_my.blend1 b/advtrains/models/blender/gleis/rail_my.blend1 new file mode 100644 index 0000000..6322856 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_my_rt.blend b/advtrains/models/blender/gleis/rail_my_rt.blend new file mode 100644 index 0000000..8372a0c Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt.blend differ diff --git a/advtrains/models/blender/gleis/rail_my_rt.blend1 b/advtrains/models/blender/gleis/rail_my_rt.blend1 new file mode 100644 index 0000000..7d0978e Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_my_rt_final.blend b/advtrains/models/blender/gleis/rail_my_rt_final.blend new file mode 100644 index 0000000..6a9a088 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt_final.blend differ diff --git a/advtrains/models/blender/gleis/rail_my_rt_final.blend1 b/advtrains/models/blender/gleis/rail_my_rt_final.blend1 new file mode 100644 index 0000000..1f346ae Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt_final.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_my_rt_switches.blend b/advtrains/models/blender/gleis/rail_my_rt_switches.blend new file mode 100644 index 0000000..fdce427 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt_switches.blend differ diff --git a/advtrains/models/blender/gleis/rail_my_rt_switches.blend1 b/advtrains/models/blender/gleis/rail_my_rt_switches.blend1 new file mode 100644 index 0000000..04370ba Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt_switches.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_my_rt_switches2.blend b/advtrains/models/blender/gleis/rail_my_rt_switches2.blend new file mode 100644 index 0000000..9562e4d Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt_switches2.blend differ diff --git a/advtrains/models/blender/gleis/rail_my_rt_switches2.blend1 b/advtrains/models/blender/gleis/rail_my_rt_switches2.blend1 new file mode 100644 index 0000000..07a155f Binary files /dev/null and b/advtrains/models/blender/gleis/rail_my_rt_switches2.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_together.blend b/advtrains/models/blender/gleis/rail_together.blend new file mode 100644 index 0000000..cff51ea Binary files /dev/null and b/advtrains/models/blender/gleis/rail_together.blend differ diff --git a/advtrains/models/blender/gleis/rail_together.png b/advtrains/models/blender/gleis/rail_together.png new file mode 100644 index 0000000..386cd5c Binary files /dev/null and b/advtrains/models/blender/gleis/rail_together.png differ diff --git a/advtrains/models/blender/gleis/rail_together2.png b/advtrains/models/blender/gleis/rail_together2.png new file mode 100644 index 0000000..3effe34 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_together2.png differ diff --git a/advtrains/models/blender/gleis/rail_together3.png b/advtrains/models/blender/gleis/rail_together3.png new file mode 100644 index 0000000..4a183c1 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_together3.png differ diff --git a/advtrains/models/blender/gleis/rail_verticals.blend b/advtrains/models/blender/gleis/rail_verticals.blend new file mode 100644 index 0000000..45c37e1 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals.blend differ diff --git a/advtrains/models/blender/gleis/rail_verticals.blend1 b/advtrains/models/blender/gleis/rail_verticals.blend1 new file mode 100644 index 0000000..320f30b Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_verticals3.blend b/advtrains/models/blender/gleis/rail_verticals3.blend new file mode 100644 index 0000000..5d62959 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals3.blend differ diff --git a/advtrains/models/blender/gleis/rail_verticals3.blend1 b/advtrains/models/blender/gleis/rail_verticals3.blend1 new file mode 100644 index 0000000..893f2ea Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals3.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_verticals45.blend b/advtrains/models/blender/gleis/rail_verticals45.blend new file mode 100644 index 0000000..a1589e3 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals45.blend differ diff --git a/advtrains/models/blender/gleis/rail_verticals45.blend1 b/advtrains/models/blender/gleis/rail_verticals45.blend1 new file mode 100644 index 0000000..6b44d1c Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals45.blend1 differ diff --git a/advtrains/models/blender/gleis/rail_verticals45.blend11 b/advtrains/models/blender/gleis/rail_verticals45.blend11 new file mode 100644 index 0000000..48316e8 Binary files /dev/null and b/advtrains/models/blender/gleis/rail_verticals45.blend11 differ diff --git a/advtrains/models/blender/gleis/texturen/rail.png b/advtrains/models/blender/gleis/texturen/rail.png new file mode 100644 index 0000000..8478cf6 Binary files /dev/null and b/advtrains/models/blender/gleis/texturen/rail.png differ diff --git a/advtrains/models/blender/gleis/texturen/uv.png b/advtrains/models/blender/gleis/texturen/uv.png new file mode 100644 index 0000000..fb0af3e Binary files /dev/null and b/advtrains/models/blender/gleis/texturen/uv.png differ diff --git a/advtrains/models/blender/industrial/industry_loc.blend b/advtrains/models/blender/industrial/industry_loc.blend new file mode 100644 index 0000000..1a6cb2b Binary files /dev/null and b/advtrains/models/blender/industrial/industry_loc.blend differ diff --git a/advtrains/models/blender/industrial/industry_loc.blend1 b/advtrains/models/blender/industrial/industry_loc.blend1 new file mode 100644 index 0000000..af54c3f Binary files /dev/null and b/advtrains/models/blender/industrial/industry_loc.blend1 differ diff --git a/advtrains/models/blender/industrial/industry_loc.blend11 b/advtrains/models/blender/industrial/industry_loc.blend11 new file mode 100644 index 0000000..a089a65 Binary files /dev/null and b/advtrains/models/blender/industrial/industry_loc.blend11 differ diff --git a/advtrains/models/blender/industrial/industry_oil_ wagong.blend b/advtrains/models/blender/industrial/industry_oil_ wagong.blend new file mode 100644 index 0000000..30bde51 Binary files /dev/null and b/advtrains/models/blender/industrial/industry_oil_ wagong.blend differ diff --git a/advtrains/models/blender/industrial/industry_oil_ wagong.blend1 b/advtrains/models/blender/industrial/industry_oil_ wagong.blend1 new file mode 100644 index 0000000..849971d Binary files /dev/null and b/advtrains/models/blender/industrial/industry_oil_ wagong.blend1 differ diff --git a/advtrains/models/blender/industrial/industry_tree_wagong.blend b/advtrains/models/blender/industrial/industry_tree_wagong.blend new file mode 100644 index 0000000..23de208 Binary files /dev/null and b/advtrains/models/blender/industrial/industry_tree_wagong.blend differ diff --git a/advtrains/models/blender/industrial/industry_tree_wagong.blend1 b/advtrains/models/blender/industrial/industry_tree_wagong.blend1 new file mode 100644 index 0000000..bf2c9ed Binary files /dev/null and b/advtrains/models/blender/industrial/industry_tree_wagong.blend1 differ diff --git a/advtrains/models/blender/industrial/industry_tree_wagong.png b/advtrains/models/blender/industrial/industry_tree_wagong.png new file mode 100644 index 0000000..87109dd Binary files /dev/null and b/advtrains/models/blender/industrial/industry_tree_wagong.png differ diff --git a/advtrains/models/blender/locomotive.blend b/advtrains/models/blender/locomotive.blend new file mode 100644 index 0000000..8fd6059 Binary files /dev/null and b/advtrains/models/blender/locomotive.blend differ diff --git a/advtrains/models/blender/magnet_track.blend b/advtrains/models/blender/magnet_track.blend new file mode 100644 index 0000000..0ab14e7 Binary files /dev/null and b/advtrains/models/blender/magnet_track.blend differ diff --git a/advtrains/models/blender/mbb/advtrains_wagon_japan.xcf b/advtrains/models/blender/mbb/advtrains_wagon_japan.xcf new file mode 100644 index 0000000..4fc88c0 Binary files /dev/null and b/advtrains/models/blender/mbb/advtrains_wagon_japan.xcf differ diff --git a/advtrains/models/blender/mbb/modern_japanlocomotive.blend b/advtrains/models/blender/mbb/modern_japanlocomotive.blend new file mode 100644 index 0000000..6eb8f3d Binary files /dev/null and b/advtrains/models/blender/mbb/modern_japanlocomotive.blend differ diff --git a/advtrains/models/blender/mbb/modern_japanlocomotive.blend1 b/advtrains/models/blender/mbb/modern_japanlocomotive.blend1 new file mode 100644 index 0000000..a2e745d Binary files /dev/null and b/advtrains/models/blender/mbb/modern_japanlocomotive.blend1 differ diff --git a/advtrains/models/blender/mbb/modern_japanlocomotive.png b/advtrains/models/blender/mbb/modern_japanlocomotive.png new file mode 100644 index 0000000..b80d16f Binary files /dev/null and b/advtrains/models/blender/mbb/modern_japanlocomotive.png differ diff --git a/advtrains/models/blender/mbb/modern_japanlocomotive.xcf b/advtrains/models/blender/mbb/modern_japanlocomotive.xcf new file mode 100644 index 0000000..bb28534 Binary files /dev/null and b/advtrains/models/blender/mbb/modern_japanlocomotive.xcf differ diff --git a/advtrains/models/blender/mbb/modern_locomotive.blend b/advtrains/models/blender/mbb/modern_locomotive.blend new file mode 100644 index 0000000..8e72233 Binary files /dev/null and b/advtrains/models/blender/mbb/modern_locomotive.blend differ diff --git a/advtrains/models/blender/mbb/modern_wagong.blend b/advtrains/models/blender/mbb/modern_wagong.blend new file mode 100644 index 0000000..f32710a Binary files /dev/null and b/advtrains/models/blender/mbb/modern_wagong.blend differ diff --git a/advtrains/models/blender/mbb/modern_wagong.blend1 b/advtrains/models/blender/mbb/modern_wagong.blend1 new file mode 100644 index 0000000..376831c Binary files /dev/null and b/advtrains/models/blender/mbb/modern_wagong.blend1 differ diff --git a/advtrains/models/blender/mbb/modern_wagong_uv.blend b/advtrains/models/blender/mbb/modern_wagong_uv.blend new file mode 100644 index 0000000..4c10fb3 Binary files /dev/null and b/advtrains/models/blender/mbb/modern_wagong_uv.blend differ diff --git a/advtrains/models/blender/mbb/modern_wagong_uv.blend1 b/advtrains/models/blender/mbb/modern_wagong_uv.blend1 new file mode 100644 index 0000000..ce77416 Binary files /dev/null and b/advtrains/models/blender/mbb/modern_wagong_uv.blend1 differ diff --git a/advtrains/models/blender/mbb/modern_wagong_uv.png b/advtrains/models/blender/mbb/modern_wagong_uv.png new file mode 100644 index 0000000..68018ea Binary files /dev/null and b/advtrains/models/blender/mbb/modern_wagong_uv.png differ diff --git a/advtrains/models/blender/mbb/prellbock.blend b/advtrains/models/blender/mbb/prellbock.blend new file mode 100644 index 0000000..1c20ab2 Binary files /dev/null and b/advtrains/models/blender/mbb/prellbock.blend differ diff --git a/advtrains/models/blender/mbb/prellbock.blend1 b/advtrains/models/blender/mbb/prellbock.blend1 new file mode 100644 index 0000000..981538e Binary files /dev/null and b/advtrains/models/blender/mbb/prellbock.blend1 differ diff --git a/advtrains/models/blender/mbb/prellbock.uv.png b/advtrains/models/blender/mbb/prellbock.uv.png new file mode 100644 index 0000000..7730753 Binary files /dev/null and b/advtrains/models/blender/mbb/prellbock.uv.png differ diff --git a/advtrains/models/blender/mbb/regio-lokomotive.blend b/advtrains/models/blender/mbb/regio-lokomotive.blend new file mode 100644 index 0000000..210e60e Binary files /dev/null and b/advtrains/models/blender/mbb/regio-lokomotive.blend differ diff --git a/advtrains/models/blender/mbb/regio-waron.blend b/advtrains/models/blender/mbb/regio-waron.blend new file mode 100644 index 0000000..19b07ce Binary files /dev/null and b/advtrains/models/blender/mbb/regio-waron.blend differ diff --git a/advtrains/models/blender/mbb/retrosignal.blend b/advtrains/models/blender/mbb/retrosignal.blend new file mode 100644 index 0000000..b795215 Binary files /dev/null and b/advtrains/models/blender/mbb/retrosignal.blend differ diff --git a/advtrains/models/blender/mbb/retrosignal.blend1 b/advtrains/models/blender/mbb/retrosignal.blend1 new file mode 100644 index 0000000..94af470 Binary files /dev/null and b/advtrains/models/blender/mbb/retrosignal.blend1 differ diff --git a/advtrains/models/blender/mbb/signal(2)_hoch.blend b/advtrains/models/blender/mbb/signal(2)_hoch.blend new file mode 100644 index 0000000..70391f6 Binary files /dev/null and b/advtrains/models/blender/mbb/signal(2)_hoch.blend differ diff --git a/advtrains/models/blender/mbb/signal(2)_unten.blend b/advtrains/models/blender/mbb/signal(2)_unten.blend new file mode 100644 index 0000000..4e917bc Binary files /dev/null and b/advtrains/models/blender/mbb/signal(2)_unten.blend differ diff --git a/advtrains/models/blender/mbb/signal.blend b/advtrains/models/blender/mbb/signal.blend new file mode 100644 index 0000000..135c7b4 Binary files /dev/null and b/advtrains/models/blender/mbb/signal.blend differ diff --git a/advtrains/models/blender/mbb/signal.blend1 b/advtrains/models/blender/mbb/signal.blend1 new file mode 100644 index 0000000..63a8c99 Binary files /dev/null and b/advtrains/models/blender/mbb/signal.blend1 differ diff --git a/advtrains/models/blender/mbb/signal.png b/advtrains/models/blender/mbb/signal.png new file mode 100644 index 0000000..779cdda Binary files /dev/null and b/advtrains/models/blender/mbb/signal.png differ diff --git a/advtrains/models/blender/mbb/signal.xcf b/advtrains/models/blender/mbb/signal.xcf new file mode 100644 index 0000000..f667739 Binary files /dev/null and b/advtrains/models/blender/mbb/signal.xcf differ diff --git a/advtrains/models/blender/mbb/signal2.png b/advtrains/models/blender/mbb/signal2.png new file mode 100644 index 0000000..7af4e2d Binary files /dev/null and b/advtrains/models/blender/mbb/signal2.png differ diff --git a/advtrains/models/blender/mbb/tr-logo.png b/advtrains/models/blender/mbb/tr-logo.png new file mode 100644 index 0000000..9bc0f10 Binary files /dev/null and b/advtrains/models/blender/mbb/tr-logo.png differ diff --git a/advtrains/models/blender/mbb/weichenhebel1.blend b/advtrains/models/blender/mbb/weichenhebel1.blend new file mode 100644 index 0000000..70b997d Binary files /dev/null and b/advtrains/models/blender/mbb/weichenhebel1.blend differ diff --git a/advtrains/models/blender/mbb/weichenhebel2.blend b/advtrains/models/blender/mbb/weichenhebel2.blend new file mode 100644 index 0000000..c1c3aac Binary files /dev/null and b/advtrains/models/blender/mbb/weichenhebel2.blend differ diff --git a/advtrains/models/blender/newlocomotive.blend b/advtrains/models/blender/newlocomotive.blend new file mode 100644 index 0000000..858882b Binary files /dev/null and b/advtrains/models/blender/newlocomotive.blend differ diff --git a/advtrains/models/blender/newlocomotive.blend1 b/advtrains/models/blender/newlocomotive.blend1 new file mode 100644 index 0000000..4b8b24f Binary files /dev/null and b/advtrains/models/blender/newlocomotive.blend1 differ diff --git a/advtrains/models/blender/newlocomotive_uvs.png b/advtrains/models/blender/newlocomotive_uvs.png new file mode 100644 index 0000000..879be65 Binary files /dev/null and b/advtrains/models/blender/newlocomotive_uvs.png differ diff --git a/advtrains/models/blender/newwagon.blend b/advtrains/models/blender/newwagon.blend new file mode 100644 index 0000000..1cedc55 Binary files /dev/null and b/advtrains/models/blender/newwagon.blend differ diff --git a/advtrains/models/blender/newwagon.blend1 b/advtrains/models/blender/newwagon.blend1 new file mode 100644 index 0000000..eb30fde Binary files /dev/null and b/advtrains/models/blender/newwagon.blend1 differ diff --git a/advtrains/models/blender/newwagon.png b/advtrains/models/blender/newwagon.png new file mode 100644 index 0000000..812bc32 Binary files /dev/null and b/advtrains/models/blender/newwagon.png differ diff --git a/advtrains/models/blender/subway-train.blend b/advtrains/models/blender/subway-train.blend new file mode 100644 index 0000000..690d87b Binary files /dev/null and b/advtrains/models/blender/subway-train.blend differ diff --git a/advtrains/models/blender/subway-train.blend1 b/advtrains/models/blender/subway-train.blend1 new file mode 100644 index 0000000..86d1f92 Binary files /dev/null and b/advtrains/models/blender/subway-train.blend1 differ diff --git a/advtrains/models/blender/subway-train.png b/advtrains/models/blender/subway-train.png new file mode 100644 index 0000000..d0b9731 Binary files /dev/null and b/advtrains/models/blender/subway-train.png differ diff --git a/advtrains/models/blender/subway-train.xcf b/advtrains/models/blender/subway-train.xcf new file mode 100644 index 0000000..775b87c Binary files /dev/null and b/advtrains/models/blender/subway-train.xcf differ diff --git a/advtrains/models/blender/trackplane.blend b/advtrains/models/blender/trackplane.blend new file mode 100644 index 0000000..79365f7 Binary files /dev/null and b/advtrains/models/blender/trackplane.blend differ diff --git a/advtrains/models/blender/trackvertical1.blend b/advtrains/models/blender/trackvertical1.blend new file mode 100644 index 0000000..fca6742 Binary files /dev/null and b/advtrains/models/blender/trackvertical1.blend differ diff --git a/advtrains/models/blender/trackvertical1.blend1 b/advtrains/models/blender/trackvertical1.blend1 new file mode 100644 index 0000000..b146b56 Binary files /dev/null and b/advtrains/models/blender/trackvertical1.blend1 differ diff --git a/advtrains/models/blender/trackvertical1.png b/advtrains/models/blender/trackvertical1.png new file mode 100644 index 0000000..a998dcb Binary files /dev/null and b/advtrains/models/blender/trackvertical1.png differ diff --git a/advtrains/models/blender/trackvertical2.blend b/advtrains/models/blender/trackvertical2.blend new file mode 100644 index 0000000..a066b84 Binary files /dev/null and b/advtrains/models/blender/trackvertical2.blend differ diff --git a/advtrains/models/blender/trackvertical2.png b/advtrains/models/blender/trackvertical2.png new file mode 100644 index 0000000..43142f9 Binary files /dev/null and b/advtrains/models/blender/trackvertical2.png differ diff --git a/advtrains/models/oldmodels/locomotive.b3d b/advtrains/models/oldmodels/locomotive.b3d new file mode 100644 index 0000000..5e16be3 Binary files /dev/null and b/advtrains/models/oldmodels/locomotive.b3d differ diff --git a/advtrains/models/oldmodels/trackvertical1.b3d b/advtrains/models/oldmodels/trackvertical1.b3d new file mode 100644 index 0000000..5620f60 Binary files /dev/null and b/advtrains/models/oldmodels/trackvertical1.b3d differ diff --git a/advtrains/models/oldmodels/trackvertical2.b3d b/advtrains/models/oldmodels/trackvertical2.b3d new file mode 100644 index 0000000..22dbb20 Binary files /dev/null and b/advtrains/models/oldmodels/trackvertical2.b3d differ diff --git a/advtrains/models/trackplane.b3d b/advtrains/models/trackplane.b3d new file mode 100644 index 0000000..b4728c3 Binary files /dev/null and b/advtrains/models/trackplane.b3d differ diff --git a/advtrains/pseudoload.lua b/advtrains/pseudoload.lua new file mode 100644 index 0000000..8511811 --- /dev/null +++ b/advtrains/pseudoload.lua @@ -0,0 +1,180 @@ +local print=function(t) minetest.log("action", t) minetest.chat_send_all(t) end + +--pseudoload.lua +--responsible for keeping up a database of all rail nodes existant in the world, regardless of whether the mapchunk is loaded. + +advtrains.trackdb={} +--trackdb[tt][y][x][z]={conn1, conn2, rely1, rely2, railheight} +--serialization format: +--(2byte x)(2byte y)(2byte z)(4bits conn1, 4bits conn2)[(plain rely1)|(plain rely2)|(plain railheight)]\n +--[] may be missing if 0,0,0 + +--load initially + +--[[ TODO temporary outcomment + +--delayed since all traintypes need to be registered +minetest.after(0, function() + +for tt, _ in pairs(advtrains.all_traintypes) do + local pl_fpath=minetest.get_worldpath().."/advtrains_trackdb_"..tt + advtrains.trackdb[tt]={} + local file, err = io.open(pl_fpath, "r") + if not file then + local er=err or "Unknown Error" + print("[advtrains]Failed loading advtrains trackdb save file "..er) + else + --custom format to save memory + while true do + local xbytes=file:read(2) + if not xbytes or #xbytes<2 then + break --eof reached + end + print(xbytes) + local ybytes=file:read(2) + local zbytes=file:read(2) + local x=(string.byte(xbytes[1])-128)*256+(string.byte(xbytes[2])) + local y=(string.byte(ybytes[1])-128)*256+(string.byte(ybytes[2])) + local z=(string.byte(zbytes[1])-128)*256+(string.byte(zbytes[2])) + + local conn1=string.byte(file:read(1)) + local conn1=string.byte(file:read(1)) + + if not advtrains.trackdb[tt][y] then advtrains.trackdb[tt][y]={} end + if not advtrains.trackdb[tt][y][x] then advtrains.trackdb[tt][y][x]={} end + + local rest=file.read("*l") + if rest~="" then + local rely1, rely2, railheight=string.match(rest, "([^|]+)|([^|]+)|([^|]+)") + if rely1 and rely2 and railheight then + advtrains.trackdb[tt][y][x][z]={ + conn1=conn1, conn2=conn2, + rely1=rely1, rely2=rely2, + railheight=railheight + } + else + advtrains.trackdb[tt][y][x][z]={ + conn1=conn1, conn2=conn2 + } + end + else + advtrains.trackdb[tt][y][x][z]={ + conn1=conn1, conn2=conn2 + } + end + end + file:close() + end +end + +--end minetest.after +end) + +function advtrains.save_trackdb() + for tt, _ in pairs(advtrains.all_traintypes) do + local pl_fpath=minetest.get_worldpath().."/advtrains_trackdb_"..tt + local file, err = io.open(pl_fpath, "w") + if not file then + local er=err or "Unknown Error" + print("[advtrains]Failed saving advtrains trackdb save file "..er) + else + --custom format to save memory + for y,tyl in pairs(advtrains.trackdb[tt]) do + for x,txl in pairs(tyl) do + for z,rail in pairs(txl) do + print("write "..x.." "..y.." "..z.." "..minetest.serialize(rail)) + file:write(string.char(math.floor(x/256)+128)..string.char((x%256))) + file:write(string.char(math.floor(y/256)+128)..string.char((y%256))) + file:write(string.char(math.floor(z/256)+128)..string.char((z%256))) + file:write(string.char(rail.conn1)) + file:write(string.char(rail.conn2)) + if (rail.rely1 and rail.rely1~=0) or (rail.rely2 and rail.rely2~=0) or (rail.railheight and rail.railheight~=0) then + file:write(rail.rely1.."|"..rail.rely2.."|"..rail.railheight) + end + file:write("\n") + end + end + end + file:close() + end + end +end +]]--end temp outcomment +advtrains.trackdb={} +advtrains.fpath_tdb=minetest.get_worldpath().."/advtrains_trackdb" +local file, err = io.open(advtrains.fpath_tdb, "r") +if not file then + local er=err or "Unknown Error" + print("[advtrains]Failed loading advtrains save file "..er) +else + local tbl = minetest.deserialize(file:read("*a")) + if type(tbl) == "table" then + advtrains.trackdb=tbl + end + file:close() +end +function advtrains.save_trackdb() + local datastr = minetest.serialize(advtrains.trackdb) + if not datastr then + minetest.log("error", "[advtrains] Failed to serialize trackdb data!") + return + end + local file, err = io.open(advtrains.fpath_tdb, "w") + if err then + return err + end + file:write(datastr) + file:close() +end + +--get_node with pseudoload. +--returns: +--true, conn1, conn2, rely1, rely2, railheight in case everything's right. +--false if it's not a rail or the train does not drive on this rail, but it is loaded or +--nil if the node is neither loaded nor in trackdb +--the distraction between false and nil will be needed only in special cases.(train initpos) +function advtrains.get_rail_info_at(pos, traintype) + local node=minetest.get_node_or_nil(pos) + if not node then + --try raildb + local rdp=vector.round(pos) + local dbe=(advtrains.trackdb[traintype] and advtrains.trackdb[traintype][rdp.y] and advtrains.trackdb[traintype][rdp.y][rdp.x] and advtrains.trackdb[traintype][rdp.y][rdp.x][rdp.z]) + if dbe then + return true, dbe.conn1, dbe.conn2, dbe.rely1 or 0, dbe.rely2 or 0, dbe.railheight or 0 + else + return nil + end + end + local nodename=node.name + if(not advtrains.is_track_and_drives_on(nodename, advtrains.all_traintypes[traintype].drives_on)) then + return false + end + local conn1, conn2, rely1, rely2, railheight=advtrains.get_track_connections(node.name, node.param2) + + --already in trackdb? + local rdp=vector.round(pos) + if not (advtrains.trackdb[traintype] and advtrains.trackdb[traintype][rdp.y] and advtrains.trackdb[traintype][rdp.y][rdp.x] and advtrains.trackdb[traintype][rdp.y][rdp.x][rdp.z]) then--TODO is this necessary? + if not advtrains.trackdb[traintype] then advtrains.trackdb[traintype]={} end + if not advtrains.trackdb[traintype][rdp.y] then advtrains.trackdb[traintype][rdp.y]={} end + if not advtrains.trackdb[traintype][rdp.y][rdp.x] then advtrains.trackdb[traintype][rdp.y][rdp.x]={} end + advtrains.trackdb[traintype][rdp.y][rdp.x][rdp.z]={ + conn1=conn1, conn2=conn2, + rely1=rely1, rely2=rely2, + railheight=railheight + } + end + + return true, conn1, conn2, rely1, rely2, railheight +end +function advtrains.reset_trackdb_position(pos) + local rdp=vector.round(pos) + for tt, _ in pairs(advtrains.all_traintypes) do + if not advtrains.trackdb[tt] then advtrains.trackdb[tt]={} end + if not advtrains.trackdb[tt][rdp.y] then advtrains.trackdb[tt][rdp.y]={} end + if not advtrains.trackdb[tt][rdp.y][rdp.x] then advtrains.trackdb[tt][rdp.y][rdp.x]={} end + advtrains.trackdb[tt][rdp.y][rdp.x][rdp.z]=nil + advtrains.get_rail_info_at(pos, tt)--to restore it. + end +end + + diff --git a/advtrains/readme.txt b/advtrains/readme.txt new file mode 100644 index 0000000..ad093bd --- /dev/null +++ b/advtrains/readme.txt @@ -0,0 +1,23 @@ + +## ADVTRAINS ## realistic trains in Minetest! +by orwell96 and contributors(see below) + +For up-to-date information, visit https://forum.minetest.net/viewtopic.php?f=9&t=14726 + + +Manual: +If manual.pdf is not present (which is the case when you downloaded the zip file), see https://github.com/orwell96/advtrains/blob/master/manual.pdf + +License of code: LGPL 2.1 +License of media: CC-BY-NC-SA 3.0 + +Contributions: + +Gravel Texture : from Minetest Game +Initial rail model/texture : DS-minetest +Models for signals/bumpers : mbb +Steam engine / wagon texture: mbb +Industrial engine/wagons : mbb +Inventory images : mbb +Small code contributions : NaruTrey / gpcf +Mod Description : hajo \ No newline at end of file diff --git a/advtrains/signals.lua b/advtrains/signals.lua new file mode 100644 index 0000000..8be65e0 --- /dev/null +++ b/advtrains/signals.lua @@ -0,0 +1,76 @@ +--advtrains by orwell96 +--signals.lua +for r,f in pairs({on="off", off="on"}) do + + advtrains.trackplacer.register_tracktype("advtrains:retrosignal", "") + advtrains.trackplacer.register_tracktype("advtrains:signal", "") + + for rotid, rotation in ipairs({"", "_30", "_45", "_60"}) do + local crea=1 + if rotid==1 and r=="off" then crea=0 end + + minetest.register_node("advtrains:retrosignal_"..r..rotation, { + drawtype = "mesh", + paramtype="light", + paramtype2="facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4}, + }, + mesh = "advtrains_retrosignal_"..r..rotation..".b3d", + tiles = {"advtrains_retrosignal.png"}, + inventory_image="advtrains_retrosignal_inv.png", + drop="advtrains:retrosignal_off", + description="Lampless Signal ("..r..rotation..")", + on_rightclick=switchfunc, + sunlight_propagates=true, + groups = { + choppy=3, + not_blocking_trains=1, + not_in_creative_inventory=crea, + }, + mesecons = {effector = { + ["action_"..f] = function (pos, node) + minetest.swap_node(pos, {name = "advtrains:retrosignal_"..f..rotation, param2 = node.param2}) + end + }}, + on_rightclick=function(pos, node, clicker) + minetest.swap_node(pos, {name = "advtrains:retrosignal_"..f..rotation, param2 = node.param2}) + end, + }) + advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil) + minetest.register_node("advtrains:signal_"..r..rotation, { + drawtype = "mesh", + paramtype="light", + paramtype2="facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4}, + }, + mesh = "advtrains_signal"..rotation..".b3d", + tiles = {"advtrains_signal_"..r..".png"}, + inventory_image="advtrains_signal_inv.png", + drop="advtrains:signal_off", + description="Signal ("..r..rotation..")", + on_rightclick=switchfunc, + groups = { + choppy=3, + not_blocking_trains=1, + not_in_creative_inventory=crea, + }, + light_source = 1, + sunlight_propagates=true, + mesecons = {effector = { + ["action_"..f] = function (pos, node) + minetest.swap_node(pos, {name = "advtrains:signal_"..f..rotation, param2 = node.param2}) + end + }}, + on_rightclick=function(pos, node, clicker) + minetest.swap_node(pos, {name = "advtrains:signal_"..f..rotation, param2 = node.param2}) + end, + }) + advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil) + end +end diff --git a/advtrains/textures/advtrains_couple.png b/advtrains/textures/advtrains_couple.png new file mode 100644 index 0000000..9e997e4 Binary files /dev/null and b/advtrains/textures/advtrains_couple.png differ diff --git a/advtrains/textures/advtrains_discouple.png b/advtrains/textures/advtrains_discouple.png new file mode 100644 index 0000000..b27c4fb Binary files /dev/null and b/advtrains/textures/advtrains_discouple.png differ diff --git a/advtrains/textures/advtrains_dtrack_bumper_placer.png b/advtrains/textures/advtrains_dtrack_bumper_placer.png new file mode 100644 index 0000000..27191fe Binary files /dev/null and b/advtrains/textures/advtrains_dtrack_bumper_placer.png differ diff --git a/advtrains/textures/advtrains_dtrack_detector_placer.png b/advtrains/textures/advtrains_dtrack_detector_placer.png new file mode 100644 index 0000000..e6c6ad6 Binary files /dev/null and b/advtrains/textures/advtrains_dtrack_detector_placer.png differ diff --git a/advtrains/textures/advtrains_dtrack_placer.png b/advtrains/textures/advtrains_dtrack_placer.png new file mode 100644 index 0000000..c49777c Binary files /dev/null and b/advtrains/textures/advtrains_dtrack_placer.png differ diff --git a/advtrains/textures/advtrains_dtrack_rail.png b/advtrains/textures/advtrains_dtrack_rail.png new file mode 100644 index 0000000..568e533 Binary files /dev/null and b/advtrains/textures/advtrains_dtrack_rail.png differ diff --git a/advtrains/textures/advtrains_dtrack_rail_detector_on.png b/advtrains/textures/advtrains_dtrack_rail_detector_on.png new file mode 100644 index 0000000..3ae0dac Binary files /dev/null and b/advtrains/textures/advtrains_dtrack_rail_detector_on.png differ diff --git a/advtrains/textures/advtrains_dtrack_slopeplacer.png b/advtrains/textures/advtrains_dtrack_slopeplacer.png new file mode 100644 index 0000000..1d456b0 Binary files /dev/null and b/advtrains/textures/advtrains_dtrack_slopeplacer.png differ diff --git a/advtrains/textures/advtrains_newlocomotive.xcf b/advtrains/textures/advtrains_newlocomotive.xcf new file mode 100644 index 0000000..9ad5187 Binary files /dev/null and b/advtrains/textures/advtrains_newlocomotive.xcf differ diff --git a/advtrains/textures/advtrains_platform.png b/advtrains/textures/advtrains_platform.png new file mode 100644 index 0000000..5ba9663 Binary files /dev/null and b/advtrains/textures/advtrains_platform.png differ diff --git a/advtrains/textures/advtrains_retrosignal.png b/advtrains/textures/advtrains_retrosignal.png new file mode 100644 index 0000000..141198d Binary files /dev/null and b/advtrains/textures/advtrains_retrosignal.png differ diff --git a/advtrains/textures/advtrains_retrosignal_inv.png b/advtrains/textures/advtrains_retrosignal_inv.png new file mode 100644 index 0000000..1036594 Binary files /dev/null and b/advtrains/textures/advtrains_retrosignal_inv.png differ diff --git a/advtrains/textures/advtrains_signal_inv.png b/advtrains/textures/advtrains_signal_inv.png new file mode 100644 index 0000000..ed64ed9 Binary files /dev/null and b/advtrains/textures/advtrains_signal_inv.png differ diff --git a/advtrains/textures/advtrains_signal_off.png b/advtrains/textures/advtrains_signal_off.png new file mode 100644 index 0000000..8046e52 Binary files /dev/null and b/advtrains/textures/advtrains_signal_off.png differ diff --git a/advtrains/textures/advtrains_signal_on.png b/advtrains/textures/advtrains_signal_on.png new file mode 100644 index 0000000..5228bb3 Binary files /dev/null and b/advtrains/textures/advtrains_signal_on.png differ diff --git a/advtrains/textures/advtrains_track_cr.png b/advtrains/textures/advtrains_track_cr.png new file mode 100644 index 0000000..40f0cc5 Binary files /dev/null and b/advtrains/textures/advtrains_track_cr.png differ diff --git a/advtrains/textures/advtrains_track_cr_45.png b/advtrains/textures/advtrains_track_cr_45.png new file mode 100644 index 0000000..54966b3 Binary files /dev/null and b/advtrains/textures/advtrains_track_cr_45.png differ diff --git a/advtrains/textures/advtrains_track_placer.png b/advtrains/textures/advtrains_track_placer.png new file mode 100644 index 0000000..03e17ed Binary files /dev/null and b/advtrains/textures/advtrains_track_placer.png differ diff --git a/advtrains/textures/advtrains_track_st.png b/advtrains/textures/advtrains_track_st.png new file mode 100644 index 0000000..5ad7e4f Binary files /dev/null and b/advtrains/textures/advtrains_track_st.png differ diff --git a/advtrains/textures/advtrains_track_st_45.png b/advtrains/textures/advtrains_track_st_45.png new file mode 100644 index 0000000..63b4c96 Binary files /dev/null and b/advtrains/textures/advtrains_track_st_45.png differ diff --git a/advtrains/textures/advtrains_track_swlcr.png b/advtrains/textures/advtrains_track_swlcr.png new file mode 100644 index 0000000..d9b5c0b Binary files /dev/null and b/advtrains/textures/advtrains_track_swlcr.png differ diff --git a/advtrains/textures/advtrains_track_swlcr_45.png b/advtrains/textures/advtrains_track_swlcr_45.png new file mode 100644 index 0000000..f098fc9 Binary files /dev/null and b/advtrains/textures/advtrains_track_swlcr_45.png differ diff --git a/advtrains/textures/advtrains_track_swlst.png b/advtrains/textures/advtrains_track_swlst.png new file mode 100644 index 0000000..314bd2d Binary files /dev/null and b/advtrains/textures/advtrains_track_swlst.png differ diff --git a/advtrains/textures/advtrains_track_swlst_45.png b/advtrains/textures/advtrains_track_swlst_45.png new file mode 100644 index 0000000..765d0ec Binary files /dev/null and b/advtrains/textures/advtrains_track_swlst_45.png differ diff --git a/advtrains/textures/advtrains_track_swrcr.png b/advtrains/textures/advtrains_track_swrcr.png new file mode 100644 index 0000000..f74e1bc Binary files /dev/null and b/advtrains/textures/advtrains_track_swrcr.png differ diff --git a/advtrains/textures/advtrains_track_swrcr_45.png b/advtrains/textures/advtrains_track_swrcr_45.png new file mode 100644 index 0000000..fa432aa Binary files /dev/null and b/advtrains/textures/advtrains_track_swrcr_45.png differ diff --git a/advtrains/textures/advtrains_track_swrst.png b/advtrains/textures/advtrains_track_swrst.png new file mode 100644 index 0000000..06ea29e Binary files /dev/null and b/advtrains/textures/advtrains_track_swrst.png differ diff --git a/advtrains/textures/advtrains_track_swrst_45.png b/advtrains/textures/advtrains_track_swrst_45.png new file mode 100644 index 0000000..be477b7 Binary files /dev/null and b/advtrains/textures/advtrains_track_swrst_45.png differ diff --git a/advtrains/textures/advtrains_trackworker.png b/advtrains/textures/advtrains_trackworker.png new file mode 100644 index 0000000..b50bcae Binary files /dev/null and b/advtrains/textures/advtrains_trackworker.png differ diff --git a/advtrains/textures/drwho_screwdriver.png b/advtrains/textures/drwho_screwdriver.png new file mode 100644 index 0000000..b50bcae Binary files /dev/null and b/advtrains/textures/drwho_screwdriver.png differ diff --git a/advtrains/textures/larger rails.xcf b/advtrains/textures/larger rails.xcf new file mode 100644 index 0000000..42ae592 Binary files /dev/null and b/advtrains/textures/larger rails.xcf differ diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua new file mode 100644 index 0000000..eebf2ae --- /dev/null +++ b/advtrains/trackplacer.lua @@ -0,0 +1,282 @@ +--trackplacer.lua +--holds code for the track-placing system. the default 'track' item will be a craftitem that places rails as needed. this will neither place or change switches nor place vertical rails. + +--all new trackplacer code +local tp={ + tracks={} +} + +function tp.register_tracktype(nnprefix, n_suffix) + tp.tracks[nnprefix]={ + default=n_suffix, + single_conn={}, + double_conn={}, + --keys:conn1_conn2 (example:1_4) + --values:{name=x, param2=x} + twcycle={}, + twrotate={},--indexed by suffix, list, tells order of rotations + modify={} + } +end +function tp.add_double_conn(nnprefix, suffix, rotation, conns) + local nodename=nnprefix.."_"..suffix..rotation + for i=0,3 do + tp.tracks[nnprefix].double_conn[((conns.conn1+4*i)%16).."_"..((conns.conn2+4*i)%16)]={name=nodename, param2=i} + tp.tracks[nnprefix].double_conn[((conns.conn2+4*i)%16).."_"..((conns.conn1+4*i)%16)]={name=nodename, param2=i} + end + tp.tracks[nnprefix].modify[nodename]=true +end +function tp.add_single_conn(nnprefix, suffix, rotation, conns) + local nodename=nnprefix.."_"..suffix..rotation + for i=0,3 do + tp.tracks[nnprefix].single_conn[((conns.conn1+4*i)%16)]={name=nodename, param2=i} + tp.tracks[nnprefix].single_conn[((conns.conn2+4*i)%16)]={name=nodename, param2=i} + end + tp.tracks[nnprefix].modify[nodename]=true +end + +function tp.add_worked(nnprefix, suffix, rotation, cycle_follows) + tp.tracks[nnprefix].twcycle[suffix]=cycle_follows + if not tp.tracks[nnprefix].twrotate[suffix] then tp.tracks[nnprefix].twrotate[suffix]={} end + table.insert(tp.tracks[nnprefix].twrotate[suffix], rotation) +end + + +--[[ + rewrite algorithm. + selection criteria: these will never be changed or even selected: + - tracks being already connected on both sides + - tracks that are already connected on one side but are not bendable to the desired position + the following situations can occur: + 1. there are two more than two rails around + 1.1 there is one or more subset(s) that can be directly connected + -> choose the first possibility + 2.2 not + -> choose the first one and orient straight + 2. there's exactly 1 rail around + -> choose and orient straight + 3. there's no rail around + -> set straight +]] +function tp.find_already_connected(pos)--TODO vertical calculations(check node below) + local function istrackandbc(pos, conn) + local cnode=minetest.get_node(advtrains.dirCoordSet(pos, conn)) + local bconn=(conn+8)%16 + if advtrains.is_track_and_drives_on(cnode.name, advtrains.all_tracktypes) then + local cconn1, cconn2=advtrains.get_track_connections(cnode.name, cnode.param2) + return cconn1==bconn or cconn2==bconn + end + return false + end + local dnode=minetest.get_node(pos) + local dconn1, dconn2=advtrains.get_track_connections(dnode.name, dnode.param2) + local t={[true]="true", [false]="false"} + if istrackandbc(pos, dconn1) and istrackandbc(pos, dconn2) then return dconn1, dconn2 + elseif istrackandbc(pos, dconn1) then return dconn1 + elseif istrackandbc(pos, dconn2) then return dconn2 + end + return nil +end +function tp.rail_and_can_be_bent(originpos, conn, nnpref) + local pos=advtrains.dirCoordSet(originpos, conn) + local newdir=(conn+8)%16 + local node=minetest.get_node(pos) + local tr=tp.tracks[nnpref] + if not advtrains.is_track_and_drives_on(node.name, advtrains.all_tracktypes) then + return false + end + --rail at other end? + local adj1, adj2=tp.find_already_connected(pos) + if adj1 and adj2 then + return false--dont destroy existing track + elseif adj1 and not adj2 then + if tr.double_conn[adj1.."_"..newdir] then + return true--if exists, connect new rail and old end + end + return false + else + if tr.single_conn[newdir] then--just rotate old rail to right orientation + return true + end + return false + end +end +function tp.bend_rail(originpos, conn, nnpref) + local pos=advtrains.dirCoordSet(originpos, conn) + local newdir=(conn+8)%16 + local node=minetest.get_node(pos) + local tr=tp.tracks[nnpref] + --is rail already connected? no need to bend. + local conn1, conn2=advtrains.get_track_connections(node.name, node.param2) + if newdir==conn1 or newdir==conn2 then + return + end + --rail at other end? + local adj1, adj2=tp.find_already_connected(pos) + if adj1 and adj2 then + return false--dont destroy existing track + elseif adj1 and not adj2 then + if tr.double_conn[adj1.."_"..newdir] then + minetest.set_node(pos, tr.double_conn[adj1.."_"..newdir]) + return true--if exists, connect new rail and old end + end + return false + else + if tr.single_conn[newdir] then--just rotate old rail to right orientation + minetest.set_node(pos, tr.single_conn[newdir]) + return true + end + return false + end +end +function tp.placetrack(pos, nnpref) + --1. find all rails that are likely to be connected + local tr=tp.tracks[nnpref] + local p_rails={} + for i=0,15 do + if tp.rail_and_can_be_bent(pos, i, nnpref) then + p_rails[#p_rails+1]=i + end + end + if #p_rails==0 then + minetest.set_node(pos, {name=nnpref.."_"..tr.default}) + elseif #p_rails==1 then + tp.bend_rail(pos, p_rails[1], nnpref) + minetest.set_node(pos, tr.single_conn[p_rails[1]]) + else + --iterate subsets + for k1, conn1 in ipairs(p_rails) do + for k2, conn2 in ipairs(p_rails) do + if k1~=k2 then + if (tr.double_conn[conn1.."_"..conn2]) then + tp.bend_rail(pos, conn1, nnpref) + tp.bend_rail(pos, conn2, nnpref) + minetest.set_node(pos, tr.double_conn[conn1.."_"..conn2]) + return + end + end + end + end + --not found + tp.bend_rail(pos, p_rails[1], nnpref) + minetest.set_node(pos, tr.single_conn[p_rails[1]]) + end +end + + +function tp.register_track_placer(nnprefix, imgprefix, dispname) + minetest.register_craftitem(nnprefix.."_placer",{ + description = dispname, + inventory_image = imgprefix.."_placer.png", + wield_image = imgprefix.."_placer.png", + groups={}, + on_place = function(itemstack, placer, pointed_thing) + local name = placer:get_player_name() + if not name then + return itemstack + end + if pointed_thing.type=="node" then + local pos=pointed_thing.above + local upos=pointed_thing.under + if minetest.is_protected(pos,name) and minetest.is_protected(upos,name) then + return itemstack + end + if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to + and minetest.registered_nodes[minetest.get_node(upos).name] and minetest.registered_nodes[minetest.get_node(upos).name].walkable then + tp.placetrack(pos, nnprefix) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + end + end + return itemstack + end, + }) +end + + + +minetest.register_craftitem("advtrains:trackworker",{ + description = "Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate rail/bumper/signal/etc.", + groups = {cracky=1}, -- key=name, value=rating; rating=1..3. + inventory_image = "advtrains_trackworker.png", + wield_image = "advtrains_trackworker.png", + stack_max = 1, + on_place = function(itemstack, placer, pointed_thing) + local name = placer:get_player_name() + if not name then + return + end + if pointed_thing.type=="node" then + local pos=pointed_thing.under + if minetest.is_protected(pos, name) then + return + end + local node=minetest.get_node(pos) + + --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end + if advtrains.is_train_at_pos(pos) then return end + + local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$") + --print(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) + if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then + nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") + rotation = "" + if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then + minetest.chat_send_player(placer:get_player_name(), "This node can't be rotated using the trackworker!") + return + end + end + local modext=tp.tracks[nnprefix].twrotate[suffix] + + if rotation==modext[#modext] then --increase param2 + minetest.set_node(pos, {name=nnprefix.."_"..suffix..modext[1], param2=(node.param2+1)%4}) + return + else + local modpos + for k,v in pairs(modext) do if v==rotation then modpos=k end end + if not modpos then + minetest.chat_send_player(placer:get_player_name(), "This node can't be rotated using the trackworker!") + return + end + minetest.set_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2}) + end + advtrains.invalidate_all_paths() + end + end, + on_use=function(itemstack, user, pointed_thing) + local name = user:get_player_name() + if not name then + return + end + if pointed_thing.type=="node" then + local pos=pointed_thing.under + local node=minetest.get_node(pos) + if minetest.is_protected(pos, name) then + return + end + + --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end + if advtrains.is_train_at_pos(pos) then return end + local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$") + --print(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) + if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then + nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") + rotation = "" + if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then + minetest.chat_send_player(user:get_player_name(), "This node can't be changed using the trackworker!") + return + end + end + local nextsuffix=tp.tracks[nnprefix].twcycle[suffix] + minetest.set_node(pos, {name=nnprefix.."_"..nextsuffix..rotation, param2=node.param2}) + --invalidate trains + advtrains.invalidate_all_paths() + else + print(name, dump(tp.tracks)) + end + end, +}) + +--putting into right place +advtrains.trackplacer=tp diff --git a/advtrains/tracks.lua b/advtrains/tracks.lua new file mode 100644 index 0000000..99dbb27 --- /dev/null +++ b/advtrains/tracks.lua @@ -0,0 +1,693 @@ +--advtrains by orwell96, see readme.txt + +--dev-time settings: +--EDIT HERE +--If the old non-model rails on straight tracks should be replaced by the new... +--false: no +--true: yes +advtrains.register_replacement_lbms=false + +--[[TracksDefinition +nodename_prefix +texture_prefix +description +common={} +straight={} +straight45={} +curve={} +curve45={} +lswitchst={} +lswitchst45={} +rswitchst={} +rswitchst45={} +lswitchcr={} +lswitchcr45={} +rswitchcr={} +rswitchcr45={} +vert1={ + --you'll probably want to override mesh here +} +vert2={ + --you'll probably want to override mesh here +} +]]-- +advtrains.all_tracktypes={} + +--definition preparation +local function conns(c1, c2, r1, r2, rh, rots) return {conn1=c1, conn2=c2, rely1=r1, rely2=r2, railheight=rh} end + +local t_30deg={ + regstep=1, + variant={ + st=conns(0,8), + cr=conns(0,7), + swlst=conns(0,8), + swlcr=conns(0,7), + swrst=conns(0,8), + swrcr=conns(0,9), + vst1=conns(8,0,0,0.5,0.25), + vst2=conns(8,0,0.5,1,0.75), + vst31=conns(8,0,0,0.33,0.16), + vst32=conns(8,0,0.33,0.66,0.5), + vst33=conns(8,0,0.66,1,0.83), + }, + description={ + st="straight", + cr="curve", + swlst="left switch (straight)", + swlcr="left switch (curve)", + swrst="right switch (straight)", + swrcr="right switch (curve)", + vst1="steep uphill 1/2", + vst2="steep uphill 2/2", + vst31="uphill 1/3", + vst32="uphill 2/3", + vst33="uphill 3/3", + }, + switch={ + swlst="swlcr", + swlcr="swlst", + swrst="swrcr", + swrcr="swrst", + }, + switchmc={ + swlst="on", + swlcr="off", + swrst="on", + swrcr="off", + }, + regtp=true, + trackplacer={ + st=true, + cr=true, + }, + tpsingle={ + st=true, + }, + tpdefault="st", + trackworker={ + ["swrcr"]="st", + ["swrst"]="st", + ["st"]="cr", + ["cr"]="swlst", + ["swlcr"]="swrcr", + ["swlst"]="swrst", + }, + regsp=true, + slopenodes={ + vst1=true, vst2=true, + vst31=true, vst32=true, vst33=true, + }, + slopeplacer={ + [2]={"vst1", "vst2"}, + [3]={"vst31", "vst32", "vst33"}, + max=3,--highest entry + }, + slopeplacer_45={ + [2]={"vst1_45", "vst2_45"}, + max=2, + }, + rotation={"", "_30", "_45", "_60"}, + increativeinv={}, +} +local t_30deg_straightonly={ + regstep=1, + variant={ + st=conns(0,8), + }, + description={ + st="straight", + }, + switch={ + }, + switchmc={ + }, + regtp=true, + trackplacer={ + }, + tpsingle={ + }, + tpdefault="st", + trackworker={ + ["st"]="st", + }, + slopenodes={}, + rotation={"", "_30", "_45", "_60"}, + increativeinv={st}, +} +local t_30deg_straightonly_noplacer={ + regstep=1, + variant={ + st=conns(0,8), + }, + description={ + st="straight", + }, + switch={ + }, + switchmc={ + }, + regtp=false, + trackplacer={ + }, + tpsingle={ + }, + tpdefault="st", + trackworker={ + ["st"]="st", + }, + slopenodes={}, + rotation={"", "_30", "_45", "_60"}, + increativeinv={st}, +} +local t_45deg={ + regstep=2, + variant={ + st=conns(0,8), + cr=conns(0,6), + swlst=conns(0,8), + swlcr=conns(0,6), + swrst=conns(0,8), + swrcr=conns(0,10), + vst1=conns(8,0,0,0.5,0.25), + vst2=conns(8,0,0.5,1,0.75), + }, + description={ + st="straight", + cr="curve", + swlst="left switch (straight)", + swlcr="left switch (curve)", + swrst="right switch (straight)", + swrcr="right switch (curve)", + vst1="vertical lower node", + vst2="vertical upper node", + }, + switch={ + swlst="swlcr", + swlcr="swlst", + swrst="swrcr", + swrcr="swrst", + }, + switchmc={ + swlst="on", + swlcr="off", + swrst="on", + swrcr="off", + }, + regtp=true, + trackplacer={ + st=true, + cr=true, + }, + tpsingle={ + st=true, + }, + tpdefault="st", + trackworker={ + ["swrcr"]="st", + ["swrst"]="st", + ["st"]="cr", + ["cr"]="swlst", + ["swlcr"]="swrcr", + ["swlst"]="swrst", + }, + slopenodes={}, + rotation={"", "_45"}, + increativeinv={vst1=true, vst2=true} +} + +--definition format: ([] optional) +--[[{ + nodename_prefix + texture_prefix + [shared_texture] + models_prefix + models_suffix (with dot) + [shared_model] + formats={ + st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2 + (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all) + } + common={} change something on common rail appearance +}]] +function advtrains.register_tracks(tracktype, def, preset) + local function make_switchfunc(suffix_target, mesecon_state) + local switchfunc=function(pos, node) + if advtrains.is_train_at_pos(pos) then return end + minetest.set_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2}) + advtrains.invalidate_all_paths() + advtrains.reset_trackdb_position(pos) + end + return switchfunc, {effector = { + ["action_"..mesecon_state] = switchfunc, + rules=advtrains.meseconrules + }} + end + local function make_overdef(suffix, rotation, conns, switchfunc, mesecontbl, in_creative_inv, drop_slope) + local img_suffix=suffix..rotation + return { + mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix), + tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png")}, + --inventory_image = def.texture_prefix.."_"..img_suffix..".png", + --wield_image = def.texture_prefix.."_"..img_suffix..".png", + description=def.description.."("..preset.description[suffix]..rotation..")", + connect1=conns.conn1, + connect2=conns.conn2, + rely1=conns.rely1 or 0, + rely2=conns.rely2 or 0, + railheight=conns.railheight or 0, + on_rightclick=switchfunc, + groups = { + attached_node=1, + ["advtrains_track_"..tracktype]=1, + dig_immediate=2, + not_in_creative_inventory=(not in_creative_inv and 1 or nil), + not_blocking_trains=1, + }, + mesecons=mesecontbl, + drop = increativeinv and def.nodename_prefix.."_"..suffix..rotation or (drop_slope and def.nodename_prefix.."_slopeplacer" or def.nodename_prefix.."_placer"), + } + end + local function cycle_conns(conns, rotid) + local add=(rotid-1)*preset.regstep + return { + conn1=(conns.conn1+add)%16, + conn2=(conns.conn2+add)%16, + rely1=conns.rely1 or 0, + rely2=conns.rely2 or 0, + railheight=conns.railheight or 0, + } + end + local common_def=advtrains.merge_tables({ + description = def.description, + drawtype = "mesh", + paramtype="light", + paramtype2="facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + rely1=0, + rely2=0, + railheight=0, + drop=def.nodename_prefix.."_placer", + can_dig=function(pos) + return not advtrains.is_train_at_pos(pos) + end, + after_dig_node=function(pos) + advtrains.invalidate_all_paths() + advtrains.reset_trackdb_position(pos) + end, + after_place_node=function(pos) + advtrains.reset_trackdb_position(pos) + end, + }, def.common or {}) + --make trackplacer base def + advtrains.trackplacer.register_tracktype(def.nodename_prefix, preset.tpdefault) + if preset.regtp then + advtrains.trackplacer.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description) + end + if preset.regsp then + advtrains.slope.register_placer(def, preset) + end + for suffix, conns in pairs(preset.variant) do + for rotid, rotation in ipairs(preset.rotation) do + if not def.formats[suffix] or def.formats[suffix][rotid] then + local switchfunc, mesecontbl + if preset.switch[suffix] then + switchfunc, mesecontbl=make_switchfunc(preset.switch[suffix]..rotation, preset.switchmc[suffix]) + end + local adef={} + if def.get_additional_definiton then + adef=def.get_additional_definiton(def, preset, suffix, rotation) + end + + minetest.register_node(def.nodename_prefix.."_"..suffix..rotation, advtrains.merge_tables( + common_def, + make_overdef( + suffix, rotation, + cycle_conns(conns, rotid), + switchfunc, mesecontbl, preset.increativeinv[suffix], preset.slopenodes[suffix] + ), + adef + ) + ) + --trackplacer + if preset.regtp then + if preset.trackplacer[suffix] then + advtrains.trackplacer.add_double_conn(def.nodename_prefix, suffix, rotation, cycle_conns(conns, rotid)) + end + if preset.tpsingle[suffix] then + advtrains.trackplacer.add_single_conn(def.nodename_prefix, suffix, rotation, cycle_conns(conns, rotid)) + end + end + advtrains.trackplacer.add_worked(def.nodename_prefix, suffix, rotation, preset.trackworker[suffix]) + end + end + end + table.insert(advtrains.all_tracktypes, tracktype) +end + + +function advtrains.is_track_and_drives_on(nodename, drives_on) + if not minetest.registered_nodes[nodename] then + return false + end + local nodedef=minetest.registered_nodes[nodename] + for k,v in ipairs(drives_on) do + if nodedef.groups["advtrains_track_"..v] then + return true + end + end + return false +end + +function advtrains.get_track_connections(name, param2) + local nodedef=minetest.registered_nodes[name] + if not nodedef then print("[advtrains] get_track_connections couldn't find nodedef for nodename "..(name or "nil")) return 0, 8, 0, 0, 0 end + local noderot=param2 + if not param2 then noderot=0 end + if noderot > 3 then print("[advtrains] get_track_connections: rail has invaild param2 of "..noderot) noderot=0 end + + return (nodedef.connect1 + 4 * noderot)%16, (nodedef.connect2 + 4 * noderot)%16, nodedef.rely1 or 0, nodedef.rely2 or 0, nodedef.railheight or 0 +end + +--detector code +--holds a table with nodes on which trains are on. + +advtrains.detector = {} +advtrains.detector.on_node = {} +advtrains.detector.on_node_restore = {} +--set if paths were invalidated before. tells trainlogic.lua to call advtrains.detector.finalize_restore() +advtrains.detector.clean_step_before = false + +--when train enters a node, call this +--The entry already being contained in advtrains.detector.on_node_restore will not trigger an on_train_enter event on the node. (when path is reset, this is saved). +function advtrains.detector.enter_node(pos, train_id) + local pts = minetest.pos_to_string(advtrains.round_vector_floor_y(pos)) + --print("enterNode "..pts.." "..train_id) + if not advtrains.detector.on_node[pts] then + advtrains.detector.on_node[pts]=train_id + if advtrains.detector.on_node_restore[pts] then + advtrains.detector.on_node_restore[pts]=nil + else + advtrains.detector.call_enter_callback(advtrains.round_vector_floor_y(pos), train_id) + end + end +end +function advtrains.detector.leave_node(pos, train_id) + local pts = minetest.pos_to_string(advtrains.round_vector_floor_y(pos)) + --print("leaveNode "..pts.." "..train_id) + if advtrains.detector.on_node[pts] then + advtrains.detector.call_leave_callback(advtrains.round_vector_floor_y(pos), train_id) + advtrains.detector.on_node[pts]=nil + end +end +--called immediately before invalidating paths +function advtrains.detector.setup_restore() + --print("setup_restore") + advtrains.detector.on_node_restore = advtrains.detector.on_node + advtrains.detector.on_node = {} +end +--called one step after invalidating paths, when all trains have restored their path and called enter_node for their contents. +function advtrains.detector.finalize_restore() + --print("finalize_restore") + for pts, train_id in pairs(advtrains.detector.on_node_restore) do + --print("called leave callback "..pts.." "..train_id) + advtrains.detector.call_leave_callback(minetest.string_to_pos(pts), train_id) + end + advtrains.detector.on_node_restore = {} +end +function advtrains.detector.call_enter_callback(pos, train_id) + --print("instructed to call enter calback") + + local node = minetest.get_node(pos) --this spares the check if node is nil, it has a name in any case + local mregnode=minetest.registered_nodes[node.name] + if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_enter then + mregnode.advtrains.on_train_enter(pos, train_id) + end +end +function advtrains.detector.call_leave_callback(pos, train_id) + --print("instructed to call leave calback") + + local node = minetest.get_node(pos) --this spares the check if node is nil, it has a name in any case + local mregnode=minetest.registered_nodes[node.name] + if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_leave then + mregnode.advtrains.on_train_leave(pos, train_id) + end +end + +-- slope placer. Defined in register_tracks. +--crafted with rail and gravel +local sl={} +function sl.register_placer(def, preset) + minetest.register_craftitem(def.nodename_prefix.."_slopeplacer",{ + description = def.description.." Slope", + inventory_image = def.texture_prefix.."_slopeplacer.png", + wield_image = def.texture_prefix.."_slopeplacer.png", + groups={}, + on_place = sl.create_slopeplacer_on_place(def, preset) + }) +end +--(itemstack, placer, pointed_thing) +function sl.create_slopeplacer_on_place(def, preset) + return function(istack, player, pt) + if not pt.type=="node" then + minetest.chat_send_player(player:get_player_name(), "Can't place: not pointing at node") + return istack + end + local pos=pt.above + if not pos then + minetest.chat_send_player(player:get_player_name(), "Can't place: not pointing at node") + return istack + end + local node=minetest.get_node(pos) + if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then + minetest.chat_send_player(player:get_player_name(), "Can't place: space occupied!") + return istack + end + if minetest.is_protected(pos, player:get_player_name()) then + minetest.chat_send_player(player:get_player_name(), "Can't place: protected position!") + return istack + end + --determine player orientation (only horizontal component) + --get_look_horizontal may not be available + local yaw=player.get_look_horizontal and player:get_look_horizontal() or (player:get_look_yaw() - math.pi/2) + + --rounding unit vectors is a nice way for selecting 1 of 8 directions since sin(30°) is 0.5. + dirvec={x=math.floor(math.sin(-yaw)+0.5), y=0, z=math.floor(math.cos(-yaw)+0.5)} + --translate to direction to look up inside the preset table + local param2, rot45=({ + [-1]={ + [-1]=2, + [0]=3, + [1]=3, + }, + [0]={ + [-1]=2, + [1]=0, + }, + [1]={ + [-1]=1, + [0]=1, + [1]=0, + }, + })[dirvec.x][dirvec.z], dirvec.x~=0 and dirvec.z~=0 + local lookup=preset.slopeplacer + if rot45 then lookup=preset.slopeplacer_45 end + + --go unitvector forward and look how far the next node is + local step=1 + while step<=lookup.max do + local node=minetest.get_node(vector.add(pos, dirvec)) + --next node solid? + if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to or minetest.is_protected(pos, player:get_player_name()) then + --do slopes of this distance exist? + if lookup[step] then + if minetest.setting_getbool("creative_mode") or istack:get_count()>=step then + --start placing + local placenodes=lookup[step] + while step>0 do + minetest.set_node(pos, {name=def.nodename_prefix.."_"..placenodes[step], param2=param2}) + if not minetest.setting_getbool("creative_mode") then + istack:take_item() + end + step=step-1 + pos=vector.subtract(pos, dirvec) + end + else + minetest.chat_send_player(player:get_player_name(), "Can't place: Not enough slope items left ("..step.." required)") + end + else + minetest.chat_send_player(player:get_player_name(), "Can't place: There's no slope of length "..step) + end + return istack + end + step=step+1 + pos=vector.add(pos, dirvec) + end + minetest.chat_send_player(player:get_player_name(), "Can't place: no supporting node at upper end.") + return itemstack + end +end + +advtrains.slope=sl + +--END code, BEGIN definition +--definition format: ([] optional) +--[[{ + nodename_prefix + texture_prefix + [shared_texture] + models_prefix + models_suffix (with dot) + [shared_model] + formats={ + st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2 + (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all) + } + common={} change something on common rail appearance +}]] + +advtrains.register_tracks("regular", { + nodename_prefix="advtrains:track", + texture_prefix="advtrains_track", + shared_model="trackplane.b3d", + description="Deprecated Track", + formats={vst1={}, vst2={}}, +}, t_45deg) + + +advtrains.register_tracks("default", { + nodename_prefix="advtrains:dtrack", + texture_prefix="advtrains_dtrack", + models_prefix="advtrains_dtrack", + models_suffix=".b3d", + shared_texture="advtrains_dtrack_rail.png", + description="Track", + formats={vst1={true, false, true}, vst2={true, false, true}, vst31={true}, vst32={true}, vst33={true}}, +}, t_30deg) + +--bumpers +advtrains.register_tracks("default", { + nodename_prefix="advtrains:dtrack_bumper", + texture_prefix="advtrains_dtrack_bumper", + models_prefix="advtrains_dtrack_bumper", + models_suffix=".b3d", + shared_texture="advtrains_dtrack_rail.png", + description="Bumper", + formats={}, +}, t_30deg_straightonly) +--legacy bumpers +for _,rot in ipairs({"", "_30", "_45", "_60"}) do + minetest.register_alias("advtrains:dtrack_bumper"..rot, "advtrains:dtrack_bumper_st"..rot) +end + +if mesecon then + advtrains.register_tracks("default", { + nodename_prefix="advtrains:dtrack_detector_off", + texture_prefix="advtrains_dtrack_detector", + models_prefix="advtrains_dtrack_detector", + models_suffix=".b3d", + shared_texture="advtrains_dtrack_rail.png", + description="Detector Rail", + formats={}, + get_additional_definiton = function(def, preset, suffix, rotation) + return { + mesecons = { + receptor = { + state = mesecon.state.off, + rules = advtrains.meseconrules + } + }, + advtrains = { + on_train_enter=function(pos, train_id) + minetest.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) + mesecon.receptor_on(pos, advtrains.meseconrules) + end + } + } + end + }, t_30deg_straightonly) + advtrains.register_tracks("default", { + nodename_prefix="advtrains:dtrack_detector_on", + texture_prefix="advtrains_dtrack_detector", + models_prefix="advtrains_dtrack_detector", + models_suffix=".b3d", + shared_texture="advtrains_dtrack_rail_detector_on.png", + description="Detector(on)(you hacker you)", + formats={}, + get_additional_definiton = function(def, preset, suffix, rotation) + return { + mesecons = { + receptor = { + state = mesecon.state.on, + rules = advtrains.meseconrules + } + }, + advtrains = { + on_train_leave=function(pos, train_id) + minetest.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) + mesecon.receptor_off(pos, advtrains.meseconrules) + end + } + } + end + }, t_30deg_straightonly_noplacer) +end +--TODO legacy +--I know lbms are better for this purpose +for name,rep in pairs({swl_st="swlst", swr_st="swrst", swl_cr="swlcr", swr_cr="swrcr", }) do + minetest.register_abm({ + -- In the following two fields, also group:groupname will work. + nodenames = {"advtrains:track_"..name}, + interval = 1.0, -- Operation interval in seconds + chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this + action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep, param2=node.param2}) end, + }) + minetest.register_abm({ + -- In the following two fields, also group:groupname will work. + nodenames = {"advtrains:track_"..name.."_45"}, + interval = 1.0, -- Operation interval in seconds + chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this + action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep.."_45", param2=node.param2}) end, + }) +end + +if advtrains.register_replacement_lbms then +minetest.register_lbm({ + name = "advtrains:ramp_replacement_1", +-- In the following two fields, also group:groupname will work. + nodenames = {"advtrains:track_vert1"}, + action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst1", param2=(node.param2+2)%4}) end, +}) +minetest.register_lbm({ + name = "advtrains:ramp_replacement_1", +-- -- In the following two fields, also group:groupname will work. + nodenames = {"advtrains:track_vert2"}, + action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst2", param2=(node.param2+2)%4}) end, +}) + minetest.register_abm({ + name = "advtrains:st_rep_1", + -- In the following two fields, also group:groupname will work. + nodenames = {"advtrains:track_st"}, + interval=1, + chance=1, + action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st", param2=node.param2}) end, + }) + minetest.register_lbm({ + name = "advtrains:st_rep_1", + -- -- In the following two fields, also group:groupname will work. + nodenames = {"advtrains:track_st_45"}, + action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st_45", param2=node.param2}) end, + }) +end + + + + + + + + diff --git a/advtrains/trainhud.lua b/advtrains/trainhud.lua new file mode 100644 index 0000000..aead246 --- /dev/null +++ b/advtrains/trainhud.lua @@ -0,0 +1,109 @@ +--trainhud.lua: holds all the code for train controlling + +advtrains.hud = {} + +minetest.register_on_leaveplayer(function(player) +advtrains.hud[player:get_player_name()] = nil +end) + +local mletter={[1]="F", [-1]="R", [0]="N"} + +function advtrains.on_control_change(pc, train, flip) + if pc.sneak then + if pc.up then + train.tarvelocity = advtrains.all_traintypes[train.traintype].max_speed or 10 + end + if pc.down then + train.tarvelocity = 0 + end + if pc.left then + train.tarvelocity = 4 + end + if pc.right then + train.tarvelocity = 8 + end + if pc.jump then + train.brake = true + --0: released, 1: brake and pressed, 2: released and brake, 3: pressed and brake + if not train.brake_hold_state or train.brake_hold_state==0 then + train.brake_hold_state = 1 + elseif train.brake_hold_state==2 then + train.brake_hold_state = 3 + end + elseif train.brake_hold_state==1 then + train.brake_hold_state = 2 + elseif train.brake_hold_state==3 then + train.brake = false + train.brake_hold_state = 0 + end + --shift+use:see wagons.lua + else + if pc.up then + train.tarvelocity = train.tarvelocity + 1 + end + if pc.down then + if train.velocity>0 then + train.tarvelocity = math.max(train.tarvelocity - 1, 0) + else + train.movedir = -train.movedir + end + end + if train.brake_hold_state~=2 then + train.brake = false + end + if pc.jump then + train.brake = true + end + if pc.aux1 then + --horn + end + end +end +function advtrains.update_driver_hud(pname, train, flip) + advtrains.set_trainhud(pname, advtrains.hud_train_format(train, flip)) +end +function advtrains.clear_driver_hud(pname) + advtrains.set_trainhud(pname, "") +end + +function advtrains.set_trainhud(name, text) + local hud = advtrains.hud[name] + local player=minetest.get_player_by_name(name) + if not player then + return + end + if not hud then + hud = {} + advtrains.hud[name] = hud + hud.id = player:hud_add({ + hud_elem_type = "text", + name = "ADVTRAINS", + number = 0xFFFFFF, + position = {x=0.5, y=0.7}, + offset = {x=0, y=0}, + text = text, + scale = {x=200, y=60}, + alignment = {x=0, y=0}, + }) + hud.oldText=text + return + elseif hud.oldText ~= text then + player:hud_change(hud.id, "text", text) + hud.oldText=text + end +end +function advtrains.hud_train_format(train, flip) + local fct=flip and -1 or 1 + if not train or not train.traintype then return "" end + + local max=advtrains.all_traintypes[train.traintype].max_speed or 10 + local vel=advtrains.abs_ceil(train.velocity) + local tvel=advtrains.abs_ceil(train.tarvelocity) + local topLine, firstLine, secondLine + + topLine=train.traintype.." ["..mletter[fct*train.movedir].."] "..(train.brake and "="..( train.brake_hold_state==2 and "^" or "" ).."B=" or "") + firstLine="Speed: |"..string.rep("+", vel)..string.rep("_", max-vel)..">" + secondLine="Target: |"..string.rep("+", tvel)..string.rep("_", max-tvel)..">" + + return topLine.."\n"..firstLine.."\n"..secondLine +end diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua new file mode 100644 index 0000000..5e3936f --- /dev/null +++ b/advtrains/trainlogic.lua @@ -0,0 +1,895 @@ +--trainlogic.lua +--controls train entities stuff about connecting/disconnecting/colliding trains and other things + +--local print=function(t, ...) minetest.log("action", table.concat({t, ...}, " ")) minetest.chat_send_all(table.concat({t, ...}, " ")) end +local print=function() end + +local benchmark=false +--printbm=function(str, t) print("[advtrains]"..str.." "..((os.clock()-t)*1000).."ms") end +local bm={} +local bmlt=0 +local bmsteps=0 +local bmstepint=200 +printbm=function(action, ta) + if not benchmark then return end + local t=(os.clock()-ta)*1000 + if not bm[action] then + bm[action]=t + else + bm[action]=bm[action]+t + end + bmlt=bmlt+t +end +function endstep() + if not benchmark then return end + bmsteps=bmsteps-1 + if bmsteps<=0 then + bmsteps=bmstepint + for key, value in pairs(bm) do + minetest.chat_send_all(key.." "..(value/bmstepint).." ms avg.") + end + minetest.chat_send_all("Total time consumed by all advtrains actions per step: "..(bmlt/bmstepint).." ms avg.") + bm={} + bmlt=0 + end +end + +--TODO: these values need to be integrated when i remove traintypes. +advtrains.train_accel_force=2--per second and divided by number of wagons +advtrains.train_brake_force=3--per second, not divided by number of wagons +advtrains.train_roll_force=0.5--per second, not divided by number of wagons, acceleration when rolling without brake +advtrains.train_emerg_force=10--for emergency brakes(when going off track) + +advtrains.audit_interval=30 + +advtrains.all_traintypes={} +function advtrains.register_train_type(name, drives_on, max_speed) + advtrains.all_traintypes[name]={} + advtrains.all_traintypes[name].drives_on=drives_on + advtrains.all_traintypes[name].max_speed=max_speed or 10 +end + + +advtrains.trains={} +advtrains.wagon_save={} + +--load initially +advtrains.fpath=minetest.get_worldpath().."/advtrains" +local file, err = io.open(advtrains.fpath, "r") +if not file then + local er=err or "Unknown Error" + print("[advtrains]Failed loading advtrains save file "..er) +else + local tbl = minetest.deserialize(file:read("*a")) + if type(tbl) == "table" then + advtrains.trains=tbl + end + file:close() +end +advtrains.fpath_ws=minetest.get_worldpath().."/advtrains_wagon_save" +local file, err = io.open(advtrains.fpath_ws, "r") +if not file then + local er=err or "Unknown Error" + print("[advtrains]Failed loading advtrains save file "..er) +else + local tbl = minetest.deserialize(file:read("*a")) + if type(tbl) == "table" then + advtrains.wagon_save=tbl + end + file:close() +end + + +advtrains.save = function() + --print("[advtrains]saving") + advtrains.invalidate_all_paths() + local datastr = minetest.serialize(advtrains.trains) + if not datastr then + minetest.log("error", "[advtrains] Failed to serialize train data!") + return + end + local file, err = io.open(advtrains.fpath, "w") + if err then + return err + end + file:write(datastr) + file:close() + + -- update wagon saves + for _,wagon in pairs(minetest.luaentities) do + if wagon.is_wagon and wagon.initialized then + wagon:get_staticdata() + end + end + --cross out userdata + for w_id, data in pairs(advtrains.wagon_save) do + data.name=nil + data.object=nil + if data.driver then + data.driver_name=data.driver:get_player_name() + data.driver=nil + else + data.driver_name=nil + end + if data.discouple then + data.discouple.object:remove() + data.discouple=nil + end + end + --print(dump(advtrains.wagon_save)) + datastr = minetest.serialize(advtrains.wagon_save) + if not datastr then + minetest.log("error", "[advtrains] Failed to serialize train data!") + return + end + file, err = io.open(advtrains.fpath_ws, "w") + if err then + return err + end + file:write(datastr) + file:close() + + advtrains.save_trackdb() +end +minetest.register_on_shutdown(advtrains.save) + +advtrains.save_and_audit_timer=advtrains.audit_interval +minetest.register_globalstep(function(dtime) + advtrains.save_and_audit_timer=advtrains.save_and_audit_timer-dtime + if advtrains.save_and_audit_timer<=0 then + local t=os.clock() + --print("[advtrains] audit step") + --clean up orphaned trains + for k,v in pairs(advtrains.trains) do + --advtrains.update_trainpart_properties(k) + if #v.trainparts==0 then + print("[advtrains][train "..k.."] has empty trainparts, removing.") + advtrains.trains[k]=nil + end + end + --save + advtrains.save() + advtrains.save_and_audit_timer=advtrains.audit_interval + printbm("saving", t) + end + --regular train step + local t=os.clock() + for k,v in pairs(advtrains.trains) do + advtrains.train_step(k, v, dtime) + end + + --see tracks.lua + if advtrains.detector.clean_step_before then + advtrains.detector.finalize_restore() + end + + printbm("trainsteps", t) + endstep() +end) + +function advtrains.train_step(id, train, dtime) + + --TODO check for all vars to be present + if not train.velocity then + train.velocity=0 + end + if not train.movedir or (train.movedir~=1 and train.movedir~=-1) then + train.movedir=1 + end + --very unimportant thing: check if couple is here + if train.couple_eid_front and (not minetest.luaentities[train.couple_eid_front] or not minetest.luaentities[train.couple_eid_front].is_couple) then train.couple_eid_front=nil end + if train.couple_eid_back and (not minetest.luaentities[train.couple_eid_back] or not minetest.luaentities[train.couple_eid_back].is_couple) then train.couple_eid_back=nil end + + --skip certain things (esp. collision) when not moving + local train_moves=(train.velocity~=0) + + --if not train.last_pos then advtrains.trains[id]=nil return end + + if not advtrains.pathpredict(id, train) then + print("pathpredict failed(returned false)") + train.velocity=0 + train.tarvelocity=0 + return + end + + local path=advtrains.get_or_create_path(id, train) + if not path then + train.velocity=0 + train.tarvelocity=0 + print("train has no path for whatever reason") + return + end + + local train_end_index=advtrains.get_train_end_index(train) + --apply off-track handling: + local front_off_track=train.max_index_on_track and train.index>train.max_index_on_track + local back_off_track=train.min_index_on_track and train_end_index1 then train.tarvelocity=1 end + elseif front_off_track then--allow movement only backward + if train.movedir==1 and train.tarvelocity>0 then train.tarvelocity=0 end + if train.movedir==-1 and train.tarvelocity>1 then train.tarvelocity=1 end + elseif back_off_track then--allow movement only forward + if train.movedir==-1 and train.tarvelocity>0 then train.tarvelocity=0 end + if train.movedir==1 and train.tarvelocity>1 then train.tarvelocity=1 end + end + + --update advtrains.detector + if not train.detector_old_index then + train.detector_old_index = math.floor(train_end_index) + train.detector_old_end_index = math.floor(train_end_index) + end + local ifo, ifn, ibo, ibn = train.detector_old_index, math.floor(train.index), train.detector_old_end_index, math.floor(train_end_index) + if ifn>ifo then + for i=ifo, ifn do + if path[i] then + advtrains.detector.enter_node(path[i], id) + end + end + elseif ifnibo then + for i=ibo, ibn do + if path[i] then + advtrains.detector.leave_node(path[i], id) + end + end + end + train.detector_old_index = math.floor(train.index) + train.detector_old_end_index = math.floor(train_end_index) + + if train_moves then + --check for collisions by finding objects + --front + local search_radius=4 + + --coupling + local couple_outward=1 + local posfront=advtrains.get_real_index_position(path, train.index+couple_outward) + local posback=advtrains.get_real_index_position(path, train_end_index-couple_outward) + for _,pos in ipairs({posfront, posback}) do + if pos then + local objrefs=minetest.get_objects_inside_radius(pos, search_radius) + for _,v in pairs(objrefs) do + local le=v:get_luaentity() + if le and le.is_wagon and le.initialized and le.train_id~=id then + advtrains.try_connect_trains(id, le.train_id) + end + end + end + end + --heh, new collision again. + --this time, based on NODES and the advtrains.detector.on_node table. + local collpos + local coll_grace=1 + if train.movedir==1 then + collpos=advtrains.get_real_index_position(path, train.index-coll_grace) + else + collpos=advtrains.get_real_index_position(path, train_end_index+coll_grace) + end + if collpos then + local rcollpos=advtrains.round_vector_floor_y(collpos) + for x=-1,1 do + for z=-1,1 do + local testpts=minetest.pos_to_string(vector.add(rcollpos, {x=x, y=0, z=z})) + if advtrains.detector.on_node[testpts] and advtrains.detector.on_node[testpts]~=id then + --collides + train.recently_collided_with_env=true + train.velocity=0.5*train.velocity + train.movedir=train.movedir*-1 + train.tarvelocity=0 + end + end + end + end + end + --check for any trainpart entities if they have been unloaded. do this only if train is near a player, to not spawn entities into unloaded areas + train.check_trainpartload=(train.check_trainpartload or 0)-dtime + local node_range=(math.max((minetest.setting_get("active_block_range") or 0),1)*16) + if train.check_trainpartload<=0 then + local ori_pos=advtrains.get_real_index_position(path, train.index) --not much to calculate + print("[advtrains][train "..id.."] at "..minetest.pos_to_string(vector.round(ori_pos))) + + local should_check=false + for _,p in ipairs(minetest.get_connected_players()) do + should_check=should_check or ((vector.distance(ori_pos, p:getpos())0 then--accelerating, force will be brought on only by locomotives. + --print("accelerating with default force") + applydiff=(math.min((advtrains.train_accel_force*train.locomotives_in_train*dtime)/mass, math.abs(diff))) + else--decelerating + if front_off_track or back_off_track or train.recently_collided_with_env then --every wagon has a brake, so not divided by mass. + --print("braking with emergency force") + applydiff= -(math.min((advtrains.train_emerg_force*dtime), math.abs(diff))) + elseif train.brake then + --print("braking with default force") + --no math.min, because it can grow beyond tarvelocity, see up there + --dont worry, it will never fall below zero. + applydiff= -((advtrains.train_brake_force*dtime)) + else + --print("roll") + applydiff= -(math.min((advtrains.train_roll_force*dtime), math.abs(diff))) + end + end + train.last_accel=(applydiff*train.movedir) + train.velocity=math.min(math.max( train.velocity+applydiff , 0), advtrains.all_traintypes[train.traintype].max_speed) + else + train.last_accel=0 + end + + --move + --TODO 3,5 + 0.7 + train.index=train.index and train.index+(((train.velocity*train.movedir)/(train.path_dist[math.floor(train.index)] or 1))*dtime) or 0 + +end + + +--structure of train table: +--[[ +trains={ + [train_id]={ + trainparts={ + [n]=wagon_id + } + path={path} + velocity + tarvelocity + index + trainlen + path_inv_level + last_pos | + last_dir | for pathpredicting. + } +} +--a wagon itself has the following properties: +wagon={ + unique_id + train_id + pos_in_train (is index difference, including train_span stuff) + pos_in_trainparts (is index in trainparts tabel of trains) +} +inherited by metatable: +wagon_proto={ + wagon_span +} +]] + +--returns new id +function advtrains.create_new_train_at(pos, pos_prev, traintype) + local newtrain_id=os.time()..os.clock() + while advtrains.trains[newtrain_id] do newtrain_id=os.time()..os.clock() end--ensure uniqueness(will be unneccessary) + + advtrains.trains[newtrain_id]={} + advtrains.trains[newtrain_id].last_pos=pos + advtrains.trains[newtrain_id].last_pos_prev=pos_prev + advtrains.trains[newtrain_id].traintype=traintype + advtrains.trains[newtrain_id].tarvelocity=0 + advtrains.trains[newtrain_id].velocity=0 + advtrains.trains[newtrain_id].trainparts={} + return newtrain_id +end + +--returns false on failure. handle this case! +function advtrains.pathpredict(id, train) + + --print("pos ",x,y,z) + --::rerun:: + if not train.index then train.index=0 end + if not train.path or #train.path<2 then + if not train.last_pos then + --no chance to recover + print("[advtrains]train hasn't saved last-pos, removing train.") + advtrains.train[id]=nil + return false + end + + local node_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(train.last_pos), train.traintype) + + if node_ok==nil then + --block not loaded, do nothing + return nil + elseif node_ok==false then + print("[advtrains]no track here, (fail) removing train.") + advtrains.trains[id]=nil + return false + end + + if not train.last_pos_prev then + --no chance to recover + print("[advtrains]train hasn't saved last-pos_prev, removing train.") + advtrains.trains[id]=nil + return false + end + + local prevnode_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(train.last_pos_prev), train.traintype) + + if prevnode_ok==nil then + --block not loaded, do nothing + return nil + elseif prevnode_ok==false then + print("[advtrains]no track at prev, (fail) removing train.") + advtrains.trains[id]=nil + return false + end + + train.index=(train.restore_add_index or 0)+(train.savedpos_off_track_index_offset or 0) + --restore_add_index is set by save() to prevent trains hopping to next round index. should be between -0.5 and 0.5 + --savedpos_off_track_index_offset is set if train went off track. see below. + train.path={} + train.path_dist={} + train.path[0]=train.last_pos + train.path[-1]=train.last_pos_prev + train.path_dist[-1]=vector.distance(train.last_pos, train.last_pos_prev) + end + + local pregen_front=2 + local pregen_back=2 + if train.velocity>0 then + if train.movedir>0 then + pregen_front=2+math.ceil(train.velocity*0.15) --assumes server step of 0.1 seconds, +50% tolerance + else + pregen_back=2+math.ceil(train.velocity*0.15) + end + end + + + local maxn=advtrains.maxN(train.path) + while (maxn-train.index) < pregen_front do--pregenerate + --print("[advtrains]maxn conway for ",maxn,minetest.pos_to_string(path[maxn]),maxn-1,minetest.pos_to_string(path[maxn-1])) + local conway=advtrains.conway(train.path[maxn], train.path[maxn-1], train.traintype) + if conway then + train.path[maxn+1]=conway + train.max_index_on_track=maxn + else + --do as if nothing has happened and preceed with path + --but do not update max_index_on_track + --print("over-generating path max to index "..maxn+1) + train.path[maxn+1]=vector.add(train.path[maxn], vector.subtract(train.path[maxn], train.path[maxn-1])) + end + train.path_dist[maxn]=vector.distance(train.path[maxn+1], train.path[maxn]) + maxn=advtrains.maxN(train.path) + end + + local minn=advtrains.minN(train.path) + while (train.index-minn) < (train.trainlen or 0) + pregen_back do --post_generate. has to be at least trainlen. (we let go of the exact calculation here since this would be unuseful here) + --print("[advtrains]minn conway for ",minn,minetest.pos_to_string(path[minn]),minn+1,minetest.pos_to_string(path[minn+1])) + local conway=advtrains.conway(train.path[minn], train.path[minn+1], train.traintype) + if conway then + train.path[minn-1]=conway + train.min_index_on_track=minn + else + --do as if nothing has happened and preceed with path + --but do not update min_index_on_track + --print("over-generating path min to index "..minn-1) + train.path[minn-1]=vector.add(train.path[minn], vector.subtract(train.path[minn], train.path[minn+1])) + end + train.path_dist[minn-1]=vector.distance(train.path[minn], train.path[minn-1]) + minn=advtrains.minN(train.path) + end + if not train.min_index_on_track then train.min_index_on_track=0 end + if not train.max_index_on_track then train.max_index_on_track=0 end + + --make pos/yaw available for possible recover calls + if train.max_index_on_tracktrain.index then --whoops, train went even more far. same behavior + train.savedpos_off_track_index_offset=train.index-train.min_index_on_track + train.last_pos=train.path[train.min_index_on_track+1] + train.last_pos_prev=train.path[train.min_index_on_track] + --print("train is off-track (back), last positions kept at "..minetest.pos_to_string(train.last_pos).." / "..minetest.pos_to_string(train.last_pos_prev)) + else --regular case + train.savedpos_off_track_index_offset=nil + train.last_pos=train.path[math.floor(train.index+0.5)] + train.last_pos_prev=train.path[math.floor(train.index-0.5)] + end + return train.path +end +function advtrains.get_train_end_index(train) + return advtrains.get_real_path_index(train, train.trainlen or 2)--this function can be found inside wagons.lua since it's more related to wagons. we just set trainlen as pos_in_train +end + +function advtrains.get_or_create_path(id, train) + if not train.path then return advtrains.pathpredict(id, train) end + return train.path +end + +function advtrains.add_wagon_to_train(wagon, train_id, index) + local train=advtrains.trains[train_id] + if index then + table.insert(train.trainparts, index, wagon.unique_id) + else + table.insert(train.trainparts, wagon.unique_id) + end + --this is not the usual case!!! + --we may set initialized because the wagon has no chance to step() + wagon.initialized=true + --TODO is this art or can we throw it away? + advtrains.update_trainpart_properties(train_id) +end +function advtrains.update_trainpart_properties(train_id, invert_flipstate) + local train=advtrains.trains[train_id] + local rel_pos=0 + local count_l=0 + for i, w_id in ipairs(train.trainparts) do + local any_loaded=false + for _,wagon in pairs(minetest.luaentities) do + if wagon.is_wagon and wagon.initialized and wagon.unique_id==w_id then + rel_pos=rel_pos+wagon.wagon_span + wagon.train_id=train_id + wagon.pos_in_train=rel_pos + wagon.pos_in_trainparts=i + wagon.old_velocity_vector=nil + if wagon.is_locomotive then + count_l=count_l+1 + end + if invert_flipstate then + wagon.wagon_flipped = not wagon.wagon_flipped + end + rel_pos=rel_pos+wagon.wagon_span + any_loaded=true + end + end + if not any_loaded then + print("update_trainpart_properties wagon "..w_id.." not loaded, ignoring it.") + end + end + train.trainlen=rel_pos + train.locomotives_in_train=count_l +end + +function advtrains.split_train_at_wagon(wagon) + --get train + local train=advtrains.trains[wagon.train_id] + local real_pos_in_train=advtrains.get_real_path_index(train, wagon.pos_in_train) + local pos_for_new_train=advtrains.get_or_create_path(wagon.train_id, train)[math.floor(real_pos_in_train+wagon.wagon_span)] + local pos_for_new_train_prev=advtrains.get_or_create_path(wagon.train_id, train)[math.floor(real_pos_in_train-1+wagon.wagon_span)] + + --before doing anything, check if both are rails. else do not allow + if not pos_for_new_train then + print("split_train: pos_for_new_train not set") + return false + end + local node_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(pos_for_new_train), train.traintype) + if not node_ok then + print("split_train: pos_for_new_train "..minetest.pos_to_string(advtrains.round_vector_floor_y(pos_for_new_train_prev)).." not loaded or is not a rail") + return false + end + + if not train.last_pos_prev then + print("split_train: pos_for_new_train_prev not set") + return false + end + + local prevnode_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(pos_for_new_train), train.traintype) + if not prevnode_ok then + print("split_train: pos_for_new_train_prev "..minetest.pos_to_string(advtrains.round_vector_floor_y(pos_for_new_train_prev)).." not loaded or is not a rail") + return false + end + + --create subtrain + local newtrain_id=advtrains.create_new_train_at(pos_for_new_train, pos_for_new_train_prev, train.traintype) + local newtrain=advtrains.trains[newtrain_id] + --insert all wagons to new train + for k,v in ipairs(train.trainparts) do + if k>=wagon.pos_in_trainparts then + table.insert(newtrain.trainparts, v) + train.trainparts[k]=nil + end + end + --update train parts + advtrains.update_trainpart_properties(wagon.train_id)--atm it still is the desierd id. + advtrains.update_trainpart_properties(newtrain_id) + train.tarvelocity=0 + newtrain.velocity=train.velocity + newtrain.tarvelocity=0 +end + +--there are 4 cases: +--1/2. F<->R F<->R regular, put second train behind first +--->frontpos of first train will match backpos of second +--3. F<->R R<->F flip one of these trains, take the other as new train +--->backpos's will match +--4. R<->F F<->R flip one of these trains and take it as new parent +--->frontpos's will match +function advtrains.try_connect_trains(id1, id2) + local train1=advtrains.trains[id1] + local train2=advtrains.trains[id2] + if not train1 or not train2 then return end + if not train1.path or not train2.path then return end + if #train1.trainparts==0 or #train2.trainparts==0 then return end + + local frontpos1=advtrains.get_real_index_position(train1.path, train1.index) + local backpos1=advtrains.get_real_index_position(train1.path, advtrains.get_train_end_index(train1)) + --couple logic + if train1.traintype==train2.traintype then + local frontpos2=advtrains.get_real_index_position(train2.path, train2.index) + local backpos2=advtrains.get_real_index_position(train2.path, advtrains.get_train_end_index(train2)) + + if not frontpos1 or not frontpos2 or not backpos1 or not backpos2 then return end + + local couple_spawnradius=0.7 + --case 1 (first train is front) + if vector.distance(frontpos2, backpos1)1 then + if gp.velocity==0 then + if not self.discouple or not self.discouple.object:getyaw() then + local object=minetest.add_entity(pos, "advtrains:discouple") + if object then + local le=object:get_luaentity() + le.wagon=self + --box is hidden when attached, so unuseful. + --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) + self.discouple=le + else + print("Couldn't spawn DisCouple") + end + end + else + if self.discouple and self.discouple.object:getyaw() then + self.discouple.object:remove() + end + end + end + --for path to be available. if not, skip step + if not advtrains.get_or_create_path(self.train_id, gp) then + self.object:setvelocity({x=0, y=0, z=0}) + return + end + if not self.pos_in_train then + --why ever. but better continue next step... + advtrains.update_trainpart_properties(self.train_id) + return + end + + local index=advtrains.get_real_path_index(self:train(), self.pos_in_train) + --print("trainindex "..gp.index.." wagonindex "..index) + + --position recalculation + local first_pos=gp.path[math.floor(index)] + local second_pos=gp.path[math.floor(index)+1] + if not first_pos or not second_pos then + --print("[advtrains] object "..self.unique_id.." path end reached!") + self.object:setvelocity({x=0,y=0,z=0}) + return + end + + --checking for environment collisions(a 3x3 cube around the center) + if not gp.recently_collided_with_env then + local collides=false + for x=-1,1 do + for y=0,2 do + for z=-1,1 do + local node=minetest.get_node_or_nil(vector.add(first_pos, {x=x, y=y, z=z})) + if (advtrains.train_collides(node)) then + collides=true + end + end + end + end + if collides then + gp.recently_collided_with_env=true + gp.velocity=-0.5*gp.velocity + gp.tarvelocity=0 + end + end + + --FIX: use index of the wagon, not of the train. + local velocity=(gp.velocity*gp.movedir)/(gp.path_dist[math.floor(index)] or 1) + local acceleration=(gp.last_accel or 0)/(gp.path_dist[math.floor(index)] or 1) + local factor=index-math.floor(index) + local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,} + local velocityvec={x=(first_pos.x-second_pos.x)*velocity*-1, z=(first_pos.z-second_pos.z)*velocity*-1, y=(first_pos.y-second_pos.y)*velocity*-1} + local accelerationvec={x=(first_pos.x-second_pos.x)*acceleration*-1, z=(first_pos.z-second_pos.z)*acceleration*-1, y=(first_pos.y-second_pos.y)*acceleration*-1} + + --some additional positions to determine orientation + local aposfwd=gp.path[math.floor(index+2)] + local aposbwd=gp.path[math.floor(index-1)] + + local yaw + if aposfwd and aposbwd then + yaw=advtrains.get_wagon_yaw(aposfwd, second_pos, first_pos, aposbwd, factor)+math.pi--TODO remove when cleaning up + else + yaw=math.atan2((first_pos.x-second_pos.x), (second_pos.z-first_pos.z)) + end + if self.wagon_flipped then + yaw=yaw+math.pi + end + + self.updatepct_timer=(self.updatepct_timer or 0)-dtime + if not self.old_velocity_vector + or not vector.equals(velocityvec, self.old_velocity_vector) + or not self.old_acceleration_vector + or not vector.equals(accelerationvec, self.old_acceleration_vector) + or self.old_yaw~=yaw + or self.updatepct_timer<=0 then--only send update packet if something changed + self.object:setpos(actual_pos) + self.object:setvelocity(velocityvec) + self.object:setacceleration(accelerationvec) + self.object:setyaw(yaw) + self.updatepct_timer=2 + if self.update_animation then + self:update_animation(gp.velocity) + end + end + + + self.old_velocity_vector=velocityvec + self.old_acceleration_vector=accelerationvec + self.old_yaw=yaw + printbm("wagon step", t) +end + +function advtrains.get_real_path_index(train, pit) + local pos_in_train_left=pit + local index=train.index + if pos_in_train_left>(index-math.floor(index))*(train.path_dist[math.floor(index)] or 1) then + pos_in_train_left=pos_in_train_left - (index-math.floor(index))*(train.path_dist[math.floor(index)] or 1) + index=math.floor(index) + while pos_in_train_left>(train.path_dist[index-1] or 1) do + pos_in_train_left=pos_in_train_left - (train.path_dist[index-1] or 1) + index=index-1 + end + index=index-(pos_in_train_left/(train.path_dist[index-1] or 1)) + else + index=index-(pos_in_train_left/(train.path_dist[math.floor(index-1)] or 1)) + end + return index +end + +function wagon:get_on(clicker, seatno) + if not self.seatp then + self.seatp={} + end + if not self.seats[seatno] then return end + if self.seatp[seatno] and self.seatp[seatno]~=clicker:get_player_name() then + self:get_off(seatno) + end + self.seatp[seatno] = clicker:get_player_name() + advtrains.player_to_train_mapping[clicker:get_player_name()]=self.train_id + clicker:set_attach(self.object, "", self.seats[seatno].attach_offset, {x=0,y=0,z=0}) + clicker:set_eye_offset(self.seats[seatno].view_offset, self.seats[seatno].view_offset) +end +function wagon:get_off_plr(pname) + local no=self:get_seatno(pname) + if no then + self:get_off(no) + end +end +function wagon:get_seatno(pname) + for no, cont in pairs(self.seatp) do + if cont==pname then + return no + end + end + return nil +end +function wagon:get_off(seatno) + if not self.seatp[seatno] then return end + local pname = self.seatp[seatno] + local clicker = minetest.get_player_by_name(pname) + advtrains.player_to_train_mapping[pname]=nil + advtrains.clear_driver_hud(pname) + if clicker then + clicker:set_detach() + clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + local objpos=advtrains.round_vector_floor_y(self.object:getpos()) + local yaw=self.object:getyaw() + local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4) + --abuse helper function + for _,r in ipairs({-1, 1}) do + local p=vector.add({x=isx and r or 0, y=0, z=not isx and r or 0}, objpos) + if minetest.get_item_group(minetest.get_node(p).name, "platform")>0 then + minetest.after(0.2, function() clicker:setpos({x=p.x, y=p.y+1, z=p.z}) end) + end + end + end + self.seatp[seatno]=nil +end +function wagon:show_get_on_form(pname) + if not self.initialized then return end + if #self.seats==0 then + if self.has_inventory and self.get_inventory_formspec then + minetest.show_formspec(pname, "advtrains_inv_"..self.unique_id, self:get_inventory_formspec()) + end + return + end + local form, comma="size[5,8]label[0.5,0.5;Select seat:]textlist[0.5,1;4,6;seat;", "" + for seatno, seattbl in ipairs(self.seats) do + local addtext, colorcode="", "" + if self.seatp and self.seatp[seatno] then + colorcode="#FF0000" + addtext=" ("..self.seatp[seatno]..")" + end + form=form..comma..colorcode..seattbl.name..addtext + comma="," + end + form=form..";0,false]" + if self.has_inventory and self.get_inventory_formspec then + form=form.."button_exit[1,7;3,1;inv;Show Inventory]" + end + minetest.show_formspec(pname, "advtrains_geton_"..self.unique_id, form) +end +minetest.register_on_player_receive_fields(function(player, formname, fields) + local uid=string.match(formname, "^advtrains_geton_(.+)$") + if uid then + for _,wagon in pairs(minetest.luaentities) do + if wagon.is_wagon and wagon.initialized and wagon.unique_id==uid then + if fields.inv then + if wagon.has_inventory and wagon.get_inventory_formspec then + minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec()) + end + elseif fields.seat then + local val=minetest.explode_textlist_event(fields.seat) + if val and val.type~="INV" and not self.seatp[player:get_player_name()] then + --get on + wagon:get_on(player, val.index) + --will work with the new close_formspec functionality. close exactly this formspec. + minetest.show_formspec(player:get_player_name(), formname, "") + end + end + end + end + end +end) +function wagon:reattach_all() + if not self.seatp then self.seatp={} end + for seatno, pname in pairs(self.seatp) do + local p=minetest.get_player_by_name(pname) + if p then + self:get_on(p ,seatno) + end + end +end +minetest.register_on_joinplayer(function(player) + for _,wagon in pairs(minetest.luaentities) do + if wagon.is_wagon and wagon.initialized then + wagon:reattach_all() + end + end +end) + +function advtrains.register_wagon(sysname, traintype, prototype, desc, inv_img) + setmetatable(prototype, {__index=wagon}) + minetest.register_entity(":advtrains:"..sysname,prototype) + + minetest.register_craftitem(":advtrains:"..sysname, { + description = desc, + inventory_image = inv_img, + wield_image = inv_img, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + + local node=minetest.env:get_node_or_nil(pointed_thing.under) + if not node then print("[advtrains]Ignore at placer position") return itemstack end + local nodename=node.name + if(not advtrains.is_track_and_drives_on(nodename, advtrains.all_traintypes[traintype].drives_on)) then + print("[advtrains]no track here, not placing.") + return itemstack + end + local conn1=advtrains.get_track_connections(node.name, node.param2) + local id=advtrains.create_new_train_at(pointed_thing.under, advtrains.dirCoordSet(pointed_thing.under, conn1), traintype) + + local ob=minetest.env:add_entity(pointed_thing.under, "advtrains:"..sysname) + if not ob then + print("[advtrains]couldn't add_entity, aborting") + end + local le=ob:get_luaentity() + + le.owner=placer:get_player_name() + le.infotext=desc..", owned by "..placer:get_player_name() + + local wagon_uid=le:init_new_instance(id, {}) + + advtrains.add_wagon_to_train(le, id) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + + end, + }) +end +advtrains.register_train_type("steam", {"regular", "default"}) + +--[[advtrains.register_wagon("blackwagon", "steam",{textures = {"black.png"}}) +advtrains.register_wagon("bluewagon", "steam",{textures = {"blue.png"}}) +advtrains.register_wagon("greenwagon", "steam",{textures = {"green.png"}}) +advtrains.register_wagon("redwagon", "steam",{textures = {"red.png"}}) +advtrains.register_wagon("yellowwagon", "steam",{textures = {"yellow.png"}}) +]] + +--[[ + wagons can define update_animation(self, velocity) if they have a speed-dependent animation + this function will be called when the velocity vector changes or every 2 seconds. +]] + + +advtrains.register_train_type("electric", {"regular", "default"}, 20) + + + +advtrains.register_train_type("subway", {"default"}, 15) + +advtrains.register_wagon("subway_wagon", "subway",{ + mesh="advtrains_subway_train.b3d", + textures = {"advtrains_subway_train.png"}, + seats = { + { + name="Default Seat (driver stand)", + attach_offset={x=0, y=10, z=0}, + view_offset={x=0, y=6, z=0}, + driving_ctrl_access=true, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=1.8, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + is_locomotive=true, + drops={"default:steelblock 4"}, +}, "Subway Passenger Wagon", "advtrains_subway_train_inv.png") + + + diff --git a/advtrains_train_industrial/depends.txt b/advtrains_train_industrial/depends.txt new file mode 100644 index 0000000..6f00bf6 --- /dev/null +++ b/advtrains_train_industrial/depends.txt @@ -0,0 +1 @@ +advtrains \ No newline at end of file diff --git a/advtrains_train_industrial/init.lua b/advtrains_train_industrial/init.lua new file mode 100644 index 0000000..93c75af --- /dev/null +++ b/advtrains_train_industrial/init.lua @@ -0,0 +1,61 @@ +advtrains.register_wagon("engine_industrial", "electric",{ + mesh="advtrains_engine_industrial.b3d", + textures = {"advtrains_engine_industrial.png"}, + seats = { + { + name="Driver Stand (left)", + attach_offset={x=-5, y=10, z=-10}, + view_offset={x=0, y=10, z=0}, + driving_ctrl_access=true, + }, + { + name="Driver Stand (right)", + attach_offset={x=5, y=10, z=-10}, + view_offset={x=0, y=10, z=0}, + driving_ctrl_access=true, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=2.6, + is_locomotive=true, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, +}, "Industrial Train Engine", "advtrains_engine_industrial_inv.png") +advtrains.register_wagon("wagon_tank", "electric",{ + mesh="advtrains_wagon_tank.b3d", + textures = {"advtrains_wagon_tank.png"}, + seats = {}, + visual_size = {x=1, y=1}, + wagon_span=2.2, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, + has_inventory = true, + get_inventory_formspec = function(self) + return "size[8,11]".. + "list[detached:advtrains_wgn_"..self.unique_id..";box;0,0;8,6;]".. + "list[current_player;main;0,7;8,4;]".. + "listring[]" + end, + inventory_list_sizes = { + box=8*6, + }, +}, "Industrial tank wagon", "advtrains_wagon_tank_inv.png") +advtrains.register_wagon("wagon_wood", "electric",{ + mesh="advtrains_wagon_wood.b3d", + textures = {"advtrains_wagon_wood.png"}, + seats = {}, + visual_size = {x=1, y=1}, + wagon_span=1.8, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, + has_inventory = true, + get_inventory_formspec = function(self) + return "size[8,11]".. + "list[detached:advtrains_wgn_"..self.unique_id..";box;0,0;8,6;]".. + "list[current_player;main;0,7;8,4;]".. + "listring[]" + end, + inventory_list_sizes = { + box=8*6, + }, +}, "Industrial wood wagon", "advtrains_wagon_wood_inv.png") diff --git a/advtrains_train_industrial/models/advtrains_engine_industrial.b3d b/advtrains_train_industrial/models/advtrains_engine_industrial.b3d new file mode 100644 index 0000000..f1ea485 Binary files /dev/null and b/advtrains_train_industrial/models/advtrains_engine_industrial.b3d differ diff --git a/advtrains_train_industrial/models/advtrains_wagon_tank.b3d b/advtrains_train_industrial/models/advtrains_wagon_tank.b3d new file mode 100644 index 0000000..af2604b Binary files /dev/null and b/advtrains_train_industrial/models/advtrains_wagon_tank.b3d differ diff --git a/advtrains_train_industrial/models/advtrains_wagon_wood.b3d b/advtrains_train_industrial/models/advtrains_wagon_wood.b3d new file mode 100644 index 0000000..0e7fb4b Binary files /dev/null and b/advtrains_train_industrial/models/advtrains_wagon_wood.b3d differ diff --git a/advtrains_train_industrial/textures/advtrains_engine_industrial.png b/advtrains_train_industrial/textures/advtrains_engine_industrial.png new file mode 100644 index 0000000..38a872f Binary files /dev/null and b/advtrains_train_industrial/textures/advtrains_engine_industrial.png differ diff --git a/advtrains_train_industrial/textures/advtrains_engine_industrial_inv.png b/advtrains_train_industrial/textures/advtrains_engine_industrial_inv.png new file mode 100644 index 0000000..be4e80f Binary files /dev/null and b/advtrains_train_industrial/textures/advtrains_engine_industrial_inv.png differ diff --git a/advtrains_train_industrial/textures/advtrains_wagon_tank.png b/advtrains_train_industrial/textures/advtrains_wagon_tank.png new file mode 100644 index 0000000..79b1316 Binary files /dev/null and b/advtrains_train_industrial/textures/advtrains_wagon_tank.png differ diff --git a/advtrains_train_industrial/textures/advtrains_wagon_tank_inv.png b/advtrains_train_industrial/textures/advtrains_wagon_tank_inv.png new file mode 100644 index 0000000..03401be Binary files /dev/null and b/advtrains_train_industrial/textures/advtrains_wagon_tank_inv.png differ diff --git a/advtrains_train_industrial/textures/advtrains_wagon_wood.png b/advtrains_train_industrial/textures/advtrains_wagon_wood.png new file mode 100644 index 0000000..acc6f72 Binary files /dev/null and b/advtrains_train_industrial/textures/advtrains_wagon_wood.png differ diff --git a/advtrains_train_industrial/textures/advtrains_wagon_wood_inv.png b/advtrains_train_industrial/textures/advtrains_wagon_wood_inv.png new file mode 100644 index 0000000..87109dd Binary files /dev/null and b/advtrains_train_industrial/textures/advtrains_wagon_wood_inv.png differ diff --git a/advtrains_train_japan/depends.txt b/advtrains_train_japan/depends.txt new file mode 100644 index 0000000..6f00bf6 --- /dev/null +++ b/advtrains_train_japan/depends.txt @@ -0,0 +1 @@ +advtrains \ No newline at end of file diff --git a/advtrains_train_japan/init.lua b/advtrains_train_japan/init.lua new file mode 100644 index 0000000..7cef69c --- /dev/null +++ b/advtrains_train_japan/init.lua @@ -0,0 +1,34 @@ +advtrains.register_wagon("engine_japan", "electric",{ + mesh="advtrains_engine_japan.b3d", + textures = {"advtrains_engine_japan.png"}, + seats = { + { + name="Default Seat (driver stand)", + attach_offset={x=0, y=10, z=0}, + view_offset={x=0, y=6, z=0}, + driving_ctrl_access=true, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=2.5, + is_locomotive=true, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, +}, "Japanese Train Engine", "advtrains_engine_japan_inv.png") + +advtrains.register_wagon("wagon_japan", "electric",{ + mesh="advtrains_wagon_japan.b3d", + textures = {"advtrains_wagon_japan.png"}, + seats = { + { + name="Default Seat", + attach_offset={x=0, y=10, z=0}, + view_offset={x=0, y=6, z=0}, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=2.3, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, +}, "Japanese Train Wagon", "advtrains_wagon_japan_inv.png") + diff --git a/advtrains_train_japan/models/advtrains_engine_japan.b3d b/advtrains_train_japan/models/advtrains_engine_japan.b3d new file mode 100644 index 0000000..f82c33e Binary files /dev/null and b/advtrains_train_japan/models/advtrains_engine_japan.b3d differ diff --git a/advtrains_train_japan/models/advtrains_wagon_japan.b3d b/advtrains_train_japan/models/advtrains_wagon_japan.b3d new file mode 100644 index 0000000..7970438 Binary files /dev/null and b/advtrains_train_japan/models/advtrains_wagon_japan.b3d differ diff --git a/advtrains_train_japan/textures/advtrains_engine_japan.png b/advtrains_train_japan/textures/advtrains_engine_japan.png new file mode 100644 index 0000000..b286b38 Binary files /dev/null and b/advtrains_train_japan/textures/advtrains_engine_japan.png differ diff --git a/advtrains_train_japan/textures/advtrains_engine_japan_inv.png b/advtrains_train_japan/textures/advtrains_engine_japan_inv.png new file mode 100644 index 0000000..6af0636 Binary files /dev/null and b/advtrains_train_japan/textures/advtrains_engine_japan_inv.png differ diff --git a/advtrains_train_japan/textures/advtrains_wagon_japan.png b/advtrains_train_japan/textures/advtrains_wagon_japan.png new file mode 100644 index 0000000..bee565e Binary files /dev/null and b/advtrains_train_japan/textures/advtrains_wagon_japan.png differ diff --git a/advtrains_train_japan/textures/advtrains_wagon_japan_inv.png b/advtrains_train_japan/textures/advtrains_wagon_japan_inv.png new file mode 100644 index 0000000..3e6357c Binary files /dev/null and b/advtrains_train_japan/textures/advtrains_wagon_japan_inv.png differ diff --git a/advtrains_train_steam/depends.txt b/advtrains_train_steam/depends.txt new file mode 100644 index 0000000..6f00bf6 --- /dev/null +++ b/advtrains_train_steam/depends.txt @@ -0,0 +1 @@ +advtrains \ No newline at end of file diff --git a/advtrains_train_steam/init.lua b/advtrains_train_steam/init.lua new file mode 100644 index 0000000..7b66a51 --- /dev/null +++ b/advtrains_train_steam/init.lua @@ -0,0 +1,115 @@ +advtrains.register_wagon("newlocomotive", "steam",{ + mesh="advtrains_engine_steam.b3d", + textures = {"advtrains_newlocomotive.png"}, + is_locomotive=true, + seats = { + { + name="Driver Stand (left)", + attach_offset={x=-5, y=10, z=-10}, + view_offset={x=0, y=6, z=0}, + driving_ctrl_access=true, + }, + { + name="Driver Stand (right)", + attach_offset={x=5, y=10, z=-10}, + view_offset={x=0, y=6, z=0}, + driving_ctrl_access=true, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=1.85, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + update_animation=function(self, velocity) + --if self.old_anim_velocity~=advtrains.abs_ceil(velocity) then + self.object:set_animation({x=1,y=60}, 100)--math.floor(velocity)) + --self.old_anim_velocity=advtrains.abs_ceil(velocity) + --end + end, + custom_on_activate = function(self, staticdata_table, dtime_s) + minetest.add_particlespawner({ + amount = 10, + time = 0, + -- ^ If time is 0 has infinite lifespan and spawns the amount on a per-second base + minpos = {x=0, y=2, z=1.2}, + maxpos = {x=0, y=2, z=1.2}, + minvel = {x=-0.2, y=1.8, z=-0.2}, + maxvel = {x=0.2, y=2, z=0.2}, + minacc = {x=0, y=-0.1, z=0}, + maxacc = {x=0, y=-0.3, z=0}, + minexptime = 2, + maxexptime = 4, + minsize = 1, + maxsize = 5, + -- ^ The particle's properties are random values in between the bounds: + -- ^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration), + -- ^ minsize/maxsize, minexptime/maxexptime (expirationtime) + collisiondetection = true, + -- ^ collisiondetection: if true uses collision detection + vertical = false, + -- ^ vertical: if true faces player using y axis only + texture = "smoke_puff.png", + -- ^ Uses texture (string) + attached = self.object, + }) + end, + drops={"default:steelblock 4"}, +}, "Steam Engine", "advtrains_newlocomotive_inv.png") +advtrains.register_wagon("wagon_default", "steam",{ + mesh="advtrains_wagon.b3d", + textures = {"advtrains_wagon.png"}, + seats = { + { + name="Default Seat", + attach_offset={x=0, y=10, z=0}, + view_offset={x=0, y=6, z=0}, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=1.8, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, +}, "Passenger Wagon", "advtrains_wagon_inv.png") +advtrains.register_wagon("wagon_box", "steam",{ + mesh="advtrains_wagon.b3d", + textures = {"advtrains_wagon_box.png"}, + seats = {}, + visual_size = {x=1, y=1}, + wagon_span=1.8, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + drops={"default:steelblock 4"}, + has_inventory = true, + get_inventory_formspec = function(self) + return "size[8,11]".. + "list[detached:advtrains_wgn_"..self.unique_id..";box;0,0;8,6;]".. + "list[current_player;main;0,7;8,4;]".. + "listring[]" + end, + inventory_list_sizes = { + box=8*6, + }, +}, "Box Wagon", "advtrains_wagon_box_inv.png") + +minetest.register_craft({ + output = 'advtrains:newlocomotive', + recipe = { + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + {'default:steelblock', 'dye:black', 'default:steelblock'}, + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + }, +}) +minetest.register_craft({ + output = 'advtrains:wagon_default', + recipe = { + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + {'default:steelblock', 'dye:dark_green', 'default:steelblock'}, + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + }, +}) +minetest.register_craft({ + output = 'advtrains:wagon_box', + recipe = { + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + {'default:steelblock', 'default:chest', 'default:steelblock'}, + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + }, +}) diff --git a/advtrains_train_steam/models/advtrains_engine_steam.b3d b/advtrains_train_steam/models/advtrains_engine_steam.b3d new file mode 100644 index 0000000..36bdd15 Binary files /dev/null and b/advtrains_train_steam/models/advtrains_engine_steam.b3d differ diff --git a/advtrains_train_steam/models/advtrains_wagon.b3d b/advtrains_train_steam/models/advtrains_wagon.b3d new file mode 100644 index 0000000..5c8214c Binary files /dev/null and b/advtrains_train_steam/models/advtrains_wagon.b3d differ diff --git a/advtrains_train_steam/textures/advtrains_newlocomotive.png b/advtrains_train_steam/textures/advtrains_newlocomotive.png new file mode 100644 index 0000000..e461bc7 Binary files /dev/null and b/advtrains_train_steam/textures/advtrains_newlocomotive.png differ diff --git a/advtrains_train_steam/textures/advtrains_newlocomotive_inv.png b/advtrains_train_steam/textures/advtrains_newlocomotive_inv.png new file mode 100644 index 0000000..8d3fafb Binary files /dev/null and b/advtrains_train_steam/textures/advtrains_newlocomotive_inv.png differ diff --git a/advtrains_train_steam/textures/advtrains_wagon.png b/advtrains_train_steam/textures/advtrains_wagon.png new file mode 100644 index 0000000..c37c979 Binary files /dev/null and b/advtrains_train_steam/textures/advtrains_wagon.png differ diff --git a/advtrains_train_steam/textures/advtrains_wagon_box.png b/advtrains_train_steam/textures/advtrains_wagon_box.png new file mode 100644 index 0000000..8bfbe06 Binary files /dev/null and b/advtrains_train_steam/textures/advtrains_wagon_box.png differ diff --git a/advtrains_train_steam/textures/advtrains_wagon_box_inv.png b/advtrains_train_steam/textures/advtrains_wagon_box_inv.png new file mode 100644 index 0000000..480f245 Binary files /dev/null and b/advtrains_train_steam/textures/advtrains_wagon_box_inv.png differ diff --git a/advtrains_train_steam/textures/advtrains_wagon_inv.png b/advtrains_train_steam/textures/advtrains_wagon_inv.png new file mode 100644 index 0000000..0b72ac3 Binary files /dev/null and b/advtrains_train_steam/textures/advtrains_wagon_inv.png differ diff --git a/advtrains_train_subway/depends.txt b/advtrains_train_subway/depends.txt new file mode 100644 index 0000000..6f00bf6 --- /dev/null +++ b/advtrains_train_subway/depends.txt @@ -0,0 +1 @@ +advtrains \ No newline at end of file diff --git a/advtrains_train_subway/init.lua b/advtrains_train_subway/init.lua new file mode 100644 index 0000000..c933fff --- /dev/null +++ b/advtrains_train_subway/init.lua @@ -0,0 +1,28 @@ + +advtrains.register_wagon("subway_wagon", "subway",{ + mesh="advtrains_subway_train.b3d", + textures = {"advtrains_subway_train.png"}, + seats = { + { + name="Default Seat (driver stand)", + attach_offset={x=0, y=10, z=0}, + view_offset={x=0, y=6, z=0}, + driving_ctrl_access=true, + }, + }, + visual_size = {x=1, y=1}, + wagon_span=1.8, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + is_locomotive=true, + drops={"default:steelblock 4"}, +}, "Subway Passenger Wagon", "advtrains_subway_train_inv.png") + +--wagons +minetest.register_craft({ + output = 'advtrains:subway_wagon', + recipe = { + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + {'default:steelblock', 'dye:yellow', 'default:steelblock'}, + {'default:steelblock', 'default:steelblock', 'default:steelblock'}, + }, +}) diff --git a/advtrains_train_subway/models/advtrains_subway_train.b3d b/advtrains_train_subway/models/advtrains_subway_train.b3d new file mode 100644 index 0000000..a824d33 Binary files /dev/null and b/advtrains_train_subway/models/advtrains_subway_train.b3d differ diff --git a/advtrains_train_subway/textures/advtrains_subway_train.png b/advtrains_train_subway/textures/advtrains_subway_train.png new file mode 100644 index 0000000..1d569f3 Binary files /dev/null and b/advtrains_train_subway/textures/advtrains_subway_train.png differ diff --git a/advtrains_train_subway/textures/advtrains_subway_train_inv.png b/advtrains_train_subway/textures/advtrains_subway_train_inv.png new file mode 100644 index 0000000..1d0e809 Binary files /dev/null and b/advtrains_train_subway/textures/advtrains_subway_train_inv.png differ diff --git a/atc.lua b/atc.lua deleted file mode 100644 index 0afddb0..0000000 --- a/atc.lua +++ /dev/null @@ -1,4 +0,0 @@ ---atc.lua ---registers and controls the ATC system - ---(simple)mesecon detector rails diff --git a/couple.lua b/couple.lua deleted file mode 100644 index a846c8b..0000000 --- a/couple.lua +++ /dev/null @@ -1,154 +0,0 @@ ---couple.lua ---defines couple entities. - ---advtrains:discouple ---set into existing trains to split them when punched. ---they are attached to the wagons. ---[[fields -wagon - -wagons keep their couple entity minetest-internal id inside the field discouple_id. if it refers to nowhere, they will spawn a new one if player is near -]] -local print=function(t, ...) minetest.log("action", table.concat({t, ...}, " ")) minetest.chat_send_all(table.concat({t, ...}, " ")) end - - -minetest.register_entity("advtrains:discouple", { - visual="sprite", - textures = {"advtrains_discouple.png"}, - collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual_size = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - - is_discouple=true, - on_activate=function(self, staticdata) - if staticdata=="DISCOUPLE" then - --couple entities have no right to exist further... - self.object:remove() - return - end - self.object:set_armor_groups({immortal=1}) - end, - get_staticdata=function() return "DISCOUPLE" end, - on_punch=function(self, player) - --only if player owns at least one wagon next to this - local own=player:get_player_name() - if self.wagon.owner and self.wagon.owner~=own then - local train=advtrains.trains[self.wagon.train_id] - local nextwgn_id=train.trainparts[self.wagon.pos_in_trainparts-1] - for aoi, le in pairs(minetest.luaentities) do - if le and le.is_wagon then - if le.unique_id==nextwgn_id then - if le.owner and le.owner~=own then - minetest.chat_send_player(own, "You need to own at least one neighboring wagon to destroy this couple.") - return - end - end - end - end - end - advtrains.split_train_at_wagon(self.wagon)--found in trainlogic.lua - end, - on_step=function(self, dtime) - local t=os.clock() - if not self.wagon then - self.object:remove() - return - end - --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not. - if not self.wagon.object:getyaw() then - self.object:remove() - return - end - local velocityvec=self.wagon.object:getvelocity() - self.updatepct_timer=(self.updatepct_timer or 0)-dtime - if not self.old_velocity_vector or not vector.equals(velocityvec, self.old_velocity_vector) or self.updatepct_timer<=0 then--only send update packet if something changed - local flipsign=self.wagon.wagon_flipped and -1 or 1 - self.object:setpos(vector.add(self.wagon.object:getpos(), {y=0, x=-math.sin(self.wagon.object:getyaw())*self.wagon.wagon_span*flipsign, z=math.cos(self.wagon.object:getyaw())*self.wagon.wagon_span*flipsign})) - self.object:setvelocity(velocityvec) - self.updatepct_timer=2 - end - printbm("discouple_step", t) - end, -}) - ---advtrains:couple ---when two trains overlap with their end-positions, this entity will be spawned and both trains set its id into appropiate fields for them to know when to free them again. The entity will destroy automatically when it recognizes that any of the trains left the common position. ---[[fields -train_id_1 -train_id_2 -train1_is_backpos -train2_is_backpos -]] - - -minetest.register_entity("advtrains:couple", { - visual="sprite", - textures = {"advtrains_couple.png"}, - collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual_size = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - - is_couple=true, - on_activate=function(self, staticdata) - if staticdata=="COUPLE" then - --couple entities have no right to exist further... - self.object:remove() - return - end - end, - get_staticdata=function(self) return "COUPLE" end, - on_rightclick=function(self) - if not self.train_id_1 or not self.train_id_2 then return end - - local id1, id2=self.train_id_1, self.train_id_2 - - if self.train1_is_backpos and not self.train2_is_backpos then - advtrains.do_connect_trains(id1, id2) - --case 2 (second train is front) - elseif self.train2_is_backpos and not self.train1_is_backpos then - advtrains.do_connect_trains(id2, id1) - --case 3 - elseif self.train1_is_backpos and self.train2_is_backpos then - advtrains.invert_train(id2) - advtrains.do_connect_trains(id1, id2) - --case 4 - elseif not self.train1_is_backpos and not self.train2_is_backpos then - advtrains.invert_train(id1) - advtrains.do_connect_trains(id1, id2) - end - self.object:remove() - end, - on_step=function(self, dtime) - local t=os.clock() - if not self.train_id_1 or not self.train_id_2 then print("wtf no train ids?")return end - local train1=advtrains.trains[self.train_id_1] - local train2=advtrains.trains[self.train_id_2] - if not train1 or not train2 or not train1.path or not train2.path or not train1.index or not train2.index then - self.object:remove() - return - end - - local tp1 - if not self.train1_is_backpos then - tp1=advtrains.get_real_index_position(train1.path, train1.index) - else - tp1=advtrains.get_real_index_position(train1.path, advtrains.get_train_end_index(train1)) - end - local tp2 - if not self.train2_is_backpos then - tp2=advtrains.get_real_index_position(train2.path, train2.index) - else - tp2=advtrains.get_real_index_position(train2.path, advtrains.get_train_end_index(train2)) - end - if not tp1 or not tp2 or not (vector.distance(tp1,tp2)<0.5) then - self.object:remove() - return - else - local pos_median=advtrains.pos_median(tp1, tp2) - if not vector.equals(pos_median, self.object:getpos()) then - self.object:setpos(pos_median) - end - end - printbm("couple step", t) - end, -}) diff --git a/crafting.lua b/crafting.lua deleted file mode 100644 index dd43512..0000000 --- a/crafting.lua +++ /dev/null @@ -1,103 +0,0 @@ ---advtrains by orwell96, see readme.txt and license.txt ---crafting.lua ---registers crafting recipes - ---tracks -minetest.register_craft({ - output = 'advtrains:dtrack_placer 50', - recipe = { - {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, - {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, - {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, - }, -}) -minetest.register_craft({ - type = "shapeless", - output = 'advtrains:dtrack_slopeplacer 2', - recipe = { - "advtrains:dtrack_placer", - "advtrains:dtrack_placer", - "default:gravel", - }, -}) - -minetest.register_craft({ - output = 'advtrains:dtrack_bumper_placer 2', - recipe = { - {'default:wood', 'dye:red'}, - {'default:steel_ingot', 'default:steel_ingot'}, - {'advtrains:dtrack_placer', 'advtrains:dtrack_placer'}, - }, -}) -minetest.register_craft({ - type="shapeless", - output = 'advtrains:dtrack_detector_off_placer', - recipe = { - "advtrains:dtrack_placer", - "mesecons:wire_00000000_off" - }, -}) ---signals -minetest.register_craft({ - output = 'advtrains:retrosignal_off 2', - recipe = { - {'dye:red', 'default:steel_ingot', 'default:steel_ingot'}, - {'', '', 'default:steel_ingot'}, - {'', '', 'default:steel_ingot'}, - }, -}) -minetest.register_craft({ - output = 'advtrains:signal_off 2', - recipe = { - {'', 'dye:red', 'default:steel_ingot'}, - {'', 'dye:dark_green', 'default:steel_ingot'}, - {'', '', 'default:steel_ingot'}, - }, -}) - ---trackworker -minetest.register_craft({ - output = 'advtrains:trackworker', - recipe = { - {'default:diamond'}, - {'screwdriver:screwdriver'}, - {'default:steel_ingot'}, - }, -}) - ---wagons -minetest.register_craft({ - output = 'advtrains:newlocomotive', - recipe = { - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - {'default:steelblock', 'dye:black', 'default:steelblock'}, - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - }, -}) -minetest.register_craft({ - output = 'advtrains:wagon_default', - recipe = { - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - {'default:steelblock', 'dye:dark_green', 'default:steelblock'}, - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - }, -}) -minetest.register_craft({ - output = 'advtrains:wagon_box', - recipe = { - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - {'default:steelblock', 'default:junglewood', 'default:steelblock'}, - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - }, -}) -minetest.register_craft({ - output = 'advtrains:subway_wagon', - recipe = { - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - {'default:steelblock', 'dye:yellow', 'default:steelblock'}, - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - }, -}) - ---misc_nodes ---crafts for platforms see misc_nodes.lua diff --git a/damage.lua b/damage.lua deleted file mode 100644 index b39fe67..0000000 --- a/damage.lua +++ /dev/null @@ -1,26 +0,0 @@ ---damage.lua ---a globalstep that damages players overrolled by trains. - -advtrains.player_to_train_mapping={} - -local tmr=0 -minetest.register_globalstep(function(dtime) - tmr=tmr-dtime - if tmr<=0 then - - for _, player in pairs(minetest.get_connected_players()) do - local pos=player:getpos() - for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do - local le=object:get_luaentity() - if le and le.is_wagon and le.initialized and le:train() then - if (not advtrains.player_to_train_mapping[player:get_player_name()] or le.train_id~=advtrains.player_to_train_mapping[player:get_player_name()]) and math.abs(le:train().velocity)>2 then - --player:punch(object, 1000, {damage={fleshy=3*math.abs(le:train().velocity)}}) - player:set_hp(player:get_hp()-math.abs(le:train().velocity)-3) - end - end - end - end - - tmr=0.5 - end -end) diff --git a/debugitems.lua b/debugitems.lua deleted file mode 100644 index b3164ff..0000000 --- a/debugitems.lua +++ /dev/null @@ -1,36 +0,0 @@ -minetest.register_tool("advtrains:tunnelborer", -{ - description = "tunnelborer", - groups = {cracky=1}, -- key=name, value=rating; rating=1..3. - inventory_image = "drwho_screwdriver.png", - wield_image = "drwho_screwdriver.png", - stack_max = 1, - range = 7.0, - - on_place = function(itemstack, placer, pointed_thing) - - end, - --[[ - ^ Shall place item and return the leftover itemstack - ^ default: minetest.item_place ]] - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type=="node" then - for x=-1,1 do - for y=-1,1 do - for z=-1,1 do - minetest.remove_node(vector.add(pointed_thing.under, {x=x, y=y, z=z})) - end - end - end - end - end, ---[[ -^ default: nil -^ Function must return either nil if no item shall be removed from -inventory, or an itemstack to replace the original itemstack. -e.g. itemstack:take_item(); return itemstack -^ Otherwise, the function is free to do what it wants. -^ The default functions handle regular use cases. -]] -} -) diff --git a/depends.txt b/depends.txt deleted file mode 100644 index 20aa884..0000000 --- a/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -mesecons? \ No newline at end of file diff --git a/description.txt b/description.txt deleted file mode 100644 index ecc5d58..0000000 --- a/description.txt +++ /dev/null @@ -1,8 +0,0 @@ -Advanced Trains v1.3.0, by orwell and contributors. Also see readme. -Good-looking, realistic trains for minetest. - -For crafting recipes, see manual.pdf - -Website: http://advtrains.bleipb.de/ -Manual: https://github.com/orwell96/advtrains/blob/master/manual.pdf -Forum : https://forum.minetest.net/viewtopic.php?f=11&t=14726 \ No newline at end of file diff --git a/helpers.lua b/helpers.lua deleted file mode 100644 index 6a8175f..0000000 --- a/helpers.lua +++ /dev/null @@ -1,249 +0,0 @@ ---advtrains by orwell96, see readme.txt -local print=function(t) minetest.log("action", t) minetest.chat_send_all(t) end - -advtrains.dir_trans_tbl={ - [0]={x=0, z=1}, - [1]={x=1, z=2}, - [2]={x=1, z=1}, - [3]={x=2, z=1}, - [4]={x=1, z=0}, - [5]={x=2, z=-1}, - [6]={x=1, z=-1}, - [7]={x=1, z=-2}, - [8]={x=0, z=-1}, - [9]={x=-1, z=-2}, - [10]={x=-1, z=-1}, - [11]={x=-2, z=-1}, - [12]={x=-1, z=0}, - [13]={x=-2, z=1}, - [14]={x=-1, z=1}, - [15]={x=-1, z=2}, -} - -function advtrains.dirCoordSet(coord, dir) - local x,z - if advtrains.dir_trans_tbl[dir] then - x,z=advtrains.dir_trans_tbl[dir].x, advtrains.dir_trans_tbl[dir].z - else - error("advtrains: in helpers.lua/dirCoordSet() given dir="..(dir or "nil")) - end - return {x=coord.x+x, y=coord.y, z=coord.z+z} -end -function advtrains.dirToCoord(dir) - return advtrains.dirCoordSet({x=0, y=0, z=0}, dir) -end - -function advtrains.maxN(list, expectstart) - local n=expectstart or 0 - while list[n] do - n=n+1 - end - return n-1 -end - -function advtrains.minN(list, expectstart) - local n=expectstart or 0 - while list[n] do - n=n-1 - end - return n+1 -end - ---vertical_transmit: ---[[ -rely1, rely2 tell to which height the connections are pointed to. 1 means it will go up the next node - -]] - -function advtrains.conway(midreal, prev, traintype)--in order prev,mid,return - local mid=advtrains.round_vector_floor_y(midreal) - local drives_on=advtrains.all_traintypes[traintype].drives_on - - if not advtrains.get_rail_info_at(advtrains.round_vector_floor_y(prev), traintype) then - return nil - end - - local midnode_ok, middir1, middir2, midrely1, midrely2=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(mid), traintype) - if not midnode_ok then - return nil - end - - local next, chkdir, chkrely, y_offset - y_offset=0 - --print("[advtrains] in order mid1,mid2",middir1,middir2) - --try if it is dir1 - local cor1=advtrains.dirCoordSet(mid, middir2)--<<<< - if math.floor(cor1.x+0.5)==math.floor(prev.x+0.5) and math.floor(cor1.z+0.5)==math.floor(prev.z+0.5) then--this was previous - next=advtrains.dirCoordSet(mid, middir1) - if midrely1>=1 then - next.y=next.y+1 - --print("[advtrains]found midrely1 to be >=1: next is now "..(next and minetest.pos_to_string(next) or "nil")) - y_offset=1 - end - chkdir=middir1 - chkrely=midrely1 - --print("[advtrains]dir2 applied next pos:",minetest.pos_to_string(next),"(chkdir is ",chkdir,")") - end - --dir2??? - local cor2=advtrains.dirCoordSet(mid, middir1)--<<<< - if math.floor(cor2.x+0.5)==math.floor(prev.x+0.5) and math.floor(cor2.z+0.5)==math.floor(prev.z+0.5) then - next=advtrains.dirCoordSet(mid, middir2)--dir2 wird überprüft, alles gut. - if midrely2>=1 then - next.y=next.y+1 - --print("[advtrains]found midrely2 to be >=1: next is now "..(next and minetest.pos_to_string(next) or "nil")) - y_offset=1 - end - chkdir=middir2 - chkrely=midrely2 - --print("[advtrains] dir2 applied next pos:",minetest.pos_to_string(next),"(chkdir is ",chkdir,")") - end - --print("[advtrains]dir applied next pos: "..(next and minetest.pos_to_string(next) or "nil").."(chkdir is "..(chkdir or "nil")..", y-offset "..y_offset..")") - --is there a next - if not next then - --print("[advtrains]in conway: no next rail(nil), returning!") - return nil - end - - local nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) - - --is it a rail? - if(not nextnode_ok) then - --print("[advtrains]in conway: next "..minetest.pos_to_string(next).." not a rail, trying one node below!") - next.y=next.y-1 - y_offset=y_offset-1 - - nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) - if(not nextnode_ok) then - --print("[advtrains]in conway: one below "..minetest.pos_to_string(next).." is not a rail either, returning!") - return nil - end - end - - --is this next rail connecting to the mid? - if not ( (((nextdir1+8)%16)==chkdir and nextrely1==chkrely-y_offset) or (((nextdir2+8)%16)==chkdir and nextrely2==chkrely-y_offset) ) then - --print("[advtrains]in conway: next "..minetest.pos_to_string(next).." not connecting, trying one node below!") - next.y=next.y-1 - y_offset=y_offset-1 - - nextnode_ok, nextdir1, nextdir2, nextrely1, nextrely2, nextrailheight=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(next), traintype) - if(not nextnode_ok) then - --print("[advtrains]in conway: (at connecting if check again) one below "..minetest.pos_to_string(next).." is not a rail either, returning!") - return nil - end - if not ( (((nextdir1+8)%16)==chkdir and nextrely1==chkrely) or (((nextdir2+8)%16)==chkdir and nextrely2==chkrely) ) then - --print("[advtrains]in conway: one below "..minetest.pos_to_string(next).." rail not connecting, returning!") - --print("[advtrains] in order mid1,2,next1,2,chkdir "..middir1.." "..middir2.." "..nextdir1.." "..nextdir2.." "..chkdir) - return nil - end - end - - --print("[advtrains]conway found rail.") - return vector.add(advtrains.round_vector_floor_y(next), {x=0, y=nextrailheight, z=0}), chkdir -end ---TODO use this -function advtrains.oppd(dir) - return ((dir+8)%16) -end - -function advtrains.round_vector_floor_y(vec) - return {x=math.floor(vec.x+0.5), y=math.floor(vec.y), z=math.floor(vec.z+0.5)} -end - -function advtrains.yawToDirection(yaw, conn1, conn2) - if not conn1 or not conn2 then - error("given nil to yawToDirection: conn1="..(conn1 or "nil").." conn2="..(conn1 or "nil")) - end - local yaw1=math.pi*(conn1/4) - local yaw2=math.pi*(conn2/4) - if advtrains.minAngleDiffRad(yaw, yaw1) if weird behavior - return conn2 - else - return conn1 - end -end - -function advtrains.minAngleDiffRad(r1, r2) - local try1=r2-r1 - local try2=(r2+2*math.pi)-r1 - local try3=r2-(r1+2*math.pi) - if math.min(math.abs(try1), math.abs(try2), math.abs(try3))==math.abs(try1) then - return try1 - end - if math.min(math.abs(try1), math.abs(try2), math.abs(try3))==math.abs(try2) then - return try2 - end - if math.min(math.abs(try1), math.abs(try2), math.abs(try3))==math.abs(try3) then - return try3 - end -end -function advtrains.dumppath(path) - if not path then print("dumppath: no path(nil)") return end - local min=advtrains.minN(path) - local max=advtrains.maxN(path) - for i=min, max do print("["..i.."] "..(path[i] and minetest.pos_to_string(path[i]) or "nil")) end -end - -function advtrains.merge_tables(a, ...) - local new={} - for _,t in ipairs({a,...}) do - for k,v in pairs(t) do new[k]=v end - end - return new -end -function advtrains.yaw_from_3_positions(prev, curr, next) - local pts=minetest.pos_to_string - --print("p3 "..pts(prev)..pts(curr)..pts(next)) - local prev2curr=math.atan2((curr.x-prev.x), (prev.z-curr.z)) - local curr2next=math.atan2((next.x-curr.x), (curr.z-next.z)) - --print("y3 "..(prev2curr*360/(2*math.pi)).." "..(curr2next*360/(2*math.pi))) - return prev2curr+(advtrains.minAngleDiffRad(prev2curr, curr2next)/2) -end -function advtrains.get_wagon_yaw(front, first, second, back, pct) - local pts=minetest.pos_to_string - --print("p "..pts(front)..pts(first)..pts(second)..pts(back)) - local y2=advtrains.yaw_from_3_positions(second, first, front) - local y1=advtrains.yaw_from_3_positions(back, second, first) - --print("y "..(y1*360/(2*math.pi)).." "..(y2*360/(2*math.pi))) - return y1+advtrains.minAngleDiffRad(y1, y2)*pct -end -function advtrains.get_real_index_position(path, index) - if not path or not index then return end - - local first_pos=path[math.floor(index)] - local second_pos=path[math.floor(index)+1] - - if not first_pos or not second_pos then return nil end - - local factor=index-math.floor(index) - local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,} - return actual_pos -end -function advtrains.pos_median(pos1, pos2) - return {x=pos1.x-(pos1.x-pos2.x)*0.5, y=pos1.y-(pos1.y-pos2.y)*0.5, z=pos1.z-(pos1.z-pos2.z)*0.5} -end -function advtrains.abs_ceil(i) - return math.ceil(math.abs(i))*math.sign(i) -end - -function advtrains.serialize_inventory(inv) - local ser={} - local liszts=inv:get_lists() - for lisztname, liszt in pairs(liszts) do - ser[lisztname]={} - for idx, item in ipairs(liszt) do - local istring=item:to_string() - if istring~="" then - ser[lisztname][idx]=istring - end - end - end - return minetest.serialize(ser) -end -function advtrains.deserialize_inventory(sers, inv) - local ser=minetest.deserialize(sers) - if ser then - inv:set_lists(ser) - return true - end - return false -end diff --git a/init.lua b/init.lua deleted file mode 100644 index 41b624e..0000000 --- a/init.lua +++ /dev/null @@ -1,42 +0,0 @@ ---advtrains - -advtrains={} - -advtrains.modpath = minetest.get_modpath("advtrains") - ---print=function(text) --- minetest.log("action", tostring(text) or "") ---end -print = function(t) minetest.log("action", t) minetest.chat_send_all(t) end - -dofile(advtrains.modpath.."/helpers.lua"); -dofile(advtrains.modpath.."/debugitems.lua"); - -advtrains.meseconrules = -{{x=0, y=0, z=-1}, - {x=1, y=0, z=0}, - {x=-1, y=0, z=0}, - {x=0, y=0, z=1}, - {x=1, y=1, z=0}, - {x=1, y=-1, z=0}, - {x=-1, y=1, z=0}, - {x=-1, y=-1, z=0}, - {x=0, y=1, z=1}, - {x=0, y=-1, z=1}, - {x=0, y=1, z=-1}, - {x=0, y=-1, z=-1}, - {x=0, y=-2, z=0}} -dofile(advtrains.modpath.."/trainlogic.lua") -dofile(advtrains.modpath.."/trainhud.lua") -dofile(advtrains.modpath.."/trackplacer.lua") -dofile(advtrains.modpath.."/tracks.lua") -dofile(advtrains.modpath.."/atc.lua") -dofile(advtrains.modpath.."/wagons.lua") - -dofile(advtrains.modpath.."/pseudoload.lua") -dofile(advtrains.modpath.."/couple.lua") -dofile(advtrains.modpath.."/damage.lua") - -dofile(advtrains.modpath.."/signals.lua") -dofile(advtrains.modpath.."/misc_nodes.lua") -dofile(advtrains.modpath.."/crafting.lua") diff --git a/misc_nodes.lua b/misc_nodes.lua deleted file mode 100644 index 93829f0..0000000 --- a/misc_nodes.lua +++ /dev/null @@ -1,67 +0,0 @@ ---all nodes that do not fit in any other category - -function advtrains.register_platform(preset) - local ndef=minetest.registered_nodes[preset] - if not ndef then - minetest.log("warning", "[advtrains] register_platform couldn't find preset node "..preset) - return - end - local btex=ndef.tiles - if type(btex)=="table" then - btex=btex[1] - end - local desc=ndef.description or "" - local nodename=string.match(preset, ":(.+)$") - minetest.register_node("advtrains:platform_low_"..nodename, { - description = desc.." Platform (low)", - tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex}, - groups = {cracky = 1, not_blocking_trains = 1, platform=1}, - sounds = default.node_sound_stone_defaults(), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.1, -0.1, 0.5, 0 , 0.5}, - {-0.5, -0.5, 0 , 0.5, -0.1, 0.5} - }, - }, - paramtype2="facedir", - paramtype = "light", - sunlight_propagates = true, - }) - minetest.register_node("advtrains:platform_high_"..nodename, { - description = desc.." Platform (high)", - tiles = {btex.."^advtrains_platform.png", btex, btex, btex, btex, btex}, - groups = {cracky = 1, not_blocking_trains = 1, platform=2}, - sounds = default.node_sound_stone_defaults(), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, 0.3, -0.1, 0.5, 0.5, 0.5}, - {-0.5, -0.5, 0 , 0.5, 0.3, 0.5} - }, - }, - paramtype2="facedir", - paramtype = "light", - sunlight_propagates = true, - }) - minetest.register_craft({ - type="shapeless", - output = "advtrains:platform_high_"..nodename.." 4", - recipe = { - "dye:yellow", preset, preset - }, - }) - minetest.register_craft({ - type="shapeless", - output = "advtrains:platform_low_"..nodename.." 4", - recipe = { - "dye:yellow", preset - }, - }) -end - - -advtrains.register_platform("default:stonebrick") -advtrains.register_platform("default:sandstonebrick") diff --git a/models/advtrains_dtrack_bumper_st.b3d b/models/advtrains_dtrack_bumper_st.b3d deleted file mode 100644 index a6d9745..0000000 Binary files a/models/advtrains_dtrack_bumper_st.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_bumper_st_30.b3d b/models/advtrains_dtrack_bumper_st_30.b3d deleted file mode 100644 index 5f5b3f4..0000000 Binary files a/models/advtrains_dtrack_bumper_st_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_bumper_st_45.b3d b/models/advtrains_dtrack_bumper_st_45.b3d deleted file mode 100644 index f13ae75..0000000 Binary files a/models/advtrains_dtrack_bumper_st_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_bumper_st_60.b3d b/models/advtrains_dtrack_bumper_st_60.b3d deleted file mode 100644 index 59a2285..0000000 Binary files a/models/advtrains_dtrack_bumper_st_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_cr.b3d b/models/advtrains_dtrack_cr.b3d deleted file mode 100644 index 159717e..0000000 Binary files a/models/advtrains_dtrack_cr.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_cr_30.b3d b/models/advtrains_dtrack_cr_30.b3d deleted file mode 100644 index 09cdb1f..0000000 Binary files a/models/advtrains_dtrack_cr_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_cr_45.b3d b/models/advtrains_dtrack_cr_45.b3d deleted file mode 100644 index 176da81..0000000 Binary files a/models/advtrains_dtrack_cr_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_cr_60.b3d b/models/advtrains_dtrack_cr_60.b3d deleted file mode 100644 index 00313c8..0000000 Binary files a/models/advtrains_dtrack_cr_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_detector_st.b3d b/models/advtrains_dtrack_detector_st.b3d deleted file mode 100644 index 893c8cd..0000000 Binary files a/models/advtrains_dtrack_detector_st.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_detector_st_30.b3d b/models/advtrains_dtrack_detector_st_30.b3d deleted file mode 100644 index 2e59e93..0000000 Binary files a/models/advtrains_dtrack_detector_st_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_detector_st_45.b3d b/models/advtrains_dtrack_detector_st_45.b3d deleted file mode 100644 index c73166f..0000000 Binary files a/models/advtrains_dtrack_detector_st_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_detector_st_60.b3d b/models/advtrains_dtrack_detector_st_60.b3d deleted file mode 100644 index b6bc9af..0000000 Binary files a/models/advtrains_dtrack_detector_st_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_st.b3d b/models/advtrains_dtrack_st.b3d deleted file mode 100644 index f3e2753..0000000 Binary files a/models/advtrains_dtrack_st.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_st_30.b3d b/models/advtrains_dtrack_st_30.b3d deleted file mode 100644 index 7a35c8d..0000000 Binary files a/models/advtrains_dtrack_st_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_st_45.b3d b/models/advtrains_dtrack_st_45.b3d deleted file mode 100644 index b2a1702..0000000 Binary files a/models/advtrains_dtrack_st_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_st_60.b3d b/models/advtrains_dtrack_st_60.b3d deleted file mode 100644 index 0a59f77..0000000 Binary files a/models/advtrains_dtrack_st_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlcr.b3d b/models/advtrains_dtrack_swlcr.b3d deleted file mode 100644 index 1adc23f..0000000 Binary files a/models/advtrains_dtrack_swlcr.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlcr_30.b3d b/models/advtrains_dtrack_swlcr_30.b3d deleted file mode 100644 index 7d8373b..0000000 Binary files a/models/advtrains_dtrack_swlcr_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlcr_45.b3d b/models/advtrains_dtrack_swlcr_45.b3d deleted file mode 100644 index 9679b9e..0000000 Binary files a/models/advtrains_dtrack_swlcr_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlcr_60.b3d b/models/advtrains_dtrack_swlcr_60.b3d deleted file mode 100644 index 3efc924..0000000 Binary files a/models/advtrains_dtrack_swlcr_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlst.b3d b/models/advtrains_dtrack_swlst.b3d deleted file mode 100644 index 93841a4..0000000 Binary files a/models/advtrains_dtrack_swlst.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlst_30.b3d b/models/advtrains_dtrack_swlst_30.b3d deleted file mode 100644 index e9a90c7..0000000 Binary files a/models/advtrains_dtrack_swlst_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlst_45.b3d b/models/advtrains_dtrack_swlst_45.b3d deleted file mode 100644 index 49c707c..0000000 Binary files a/models/advtrains_dtrack_swlst_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swlst_60.b3d b/models/advtrains_dtrack_swlst_60.b3d deleted file mode 100644 index c9a6ffe..0000000 Binary files a/models/advtrains_dtrack_swlst_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrcr.b3d b/models/advtrains_dtrack_swrcr.b3d deleted file mode 100644 index ee29b62..0000000 Binary files a/models/advtrains_dtrack_swrcr.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrcr_30.b3d b/models/advtrains_dtrack_swrcr_30.b3d deleted file mode 100644 index ba065e1..0000000 Binary files a/models/advtrains_dtrack_swrcr_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrcr_45.b3d b/models/advtrains_dtrack_swrcr_45.b3d deleted file mode 100644 index 7f9dc43..0000000 Binary files a/models/advtrains_dtrack_swrcr_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrcr_60.b3d b/models/advtrains_dtrack_swrcr_60.b3d deleted file mode 100644 index b8ffa61..0000000 Binary files a/models/advtrains_dtrack_swrcr_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrst.b3d b/models/advtrains_dtrack_swrst.b3d deleted file mode 100644 index 0b3e7ad..0000000 Binary files a/models/advtrains_dtrack_swrst.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrst_30.b3d b/models/advtrains_dtrack_swrst_30.b3d deleted file mode 100644 index 4aea19b..0000000 Binary files a/models/advtrains_dtrack_swrst_30.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrst_45.b3d b/models/advtrains_dtrack_swrst_45.b3d deleted file mode 100644 index 4182fe5..0000000 Binary files a/models/advtrains_dtrack_swrst_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_swrst_60.b3d b/models/advtrains_dtrack_swrst_60.b3d deleted file mode 100644 index 6d2c891..0000000 Binary files a/models/advtrains_dtrack_swrst_60.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst1.b3d b/models/advtrains_dtrack_vst1.b3d deleted file mode 100644 index c9d7427..0000000 Binary files a/models/advtrains_dtrack_vst1.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst1_45.b3d b/models/advtrains_dtrack_vst1_45.b3d deleted file mode 100644 index 14d438c..0000000 Binary files a/models/advtrains_dtrack_vst1_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst2.b3d b/models/advtrains_dtrack_vst2.b3d deleted file mode 100644 index c128650..0000000 Binary files a/models/advtrains_dtrack_vst2.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst2_45.b3d b/models/advtrains_dtrack_vst2_45.b3d deleted file mode 100644 index 263276d..0000000 Binary files a/models/advtrains_dtrack_vst2_45.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst31.b3d b/models/advtrains_dtrack_vst31.b3d deleted file mode 100644 index df0f383..0000000 Binary files a/models/advtrains_dtrack_vst31.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst32.b3d b/models/advtrains_dtrack_vst32.b3d deleted file mode 100644 index 01d2978..0000000 Binary files a/models/advtrains_dtrack_vst32.b3d and /dev/null differ diff --git a/models/advtrains_dtrack_vst33.b3d b/models/advtrains_dtrack_vst33.b3d deleted file mode 100644 index 7fe418d..0000000 Binary files a/models/advtrains_dtrack_vst33.b3d and /dev/null differ diff --git a/models/advtrains_engine_industrial.b3d b/models/advtrains_engine_industrial.b3d deleted file mode 100644 index f1ea485..0000000 Binary files a/models/advtrains_engine_industrial.b3d and /dev/null differ diff --git a/models/advtrains_engine_japan.b3d b/models/advtrains_engine_japan.b3d deleted file mode 100644 index f82c33e..0000000 Binary files a/models/advtrains_engine_japan.b3d and /dev/null differ diff --git a/models/advtrains_engine_steam.b3d b/models/advtrains_engine_steam.b3d deleted file mode 100644 index 36bdd15..0000000 Binary files a/models/advtrains_engine_steam.b3d and /dev/null differ diff --git a/models/advtrains_modernwagon.b3d b/models/advtrains_modernwagon.b3d deleted file mode 100644 index aacddca..0000000 Binary files a/models/advtrains_modernwagon.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_off.b3d b/models/advtrains_retrosignal_off.b3d deleted file mode 100644 index 3d231dd..0000000 Binary files a/models/advtrains_retrosignal_off.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_off_30.b3d b/models/advtrains_retrosignal_off_30.b3d deleted file mode 100644 index da258e1..0000000 Binary files a/models/advtrains_retrosignal_off_30.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_off_45.b3d b/models/advtrains_retrosignal_off_45.b3d deleted file mode 100644 index 338224a..0000000 Binary files a/models/advtrains_retrosignal_off_45.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_off_60.b3d b/models/advtrains_retrosignal_off_60.b3d deleted file mode 100644 index c560ca1..0000000 Binary files a/models/advtrains_retrosignal_off_60.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_on.b3d b/models/advtrains_retrosignal_on.b3d deleted file mode 100644 index 3d19439..0000000 Binary files a/models/advtrains_retrosignal_on.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_on_30.b3d b/models/advtrains_retrosignal_on_30.b3d deleted file mode 100644 index 98f8a92..0000000 Binary files a/models/advtrains_retrosignal_on_30.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_on_45.b3d b/models/advtrains_retrosignal_on_45.b3d deleted file mode 100644 index 414e121..0000000 Binary files a/models/advtrains_retrosignal_on_45.b3d and /dev/null differ diff --git a/models/advtrains_retrosignal_on_60.b3d b/models/advtrains_retrosignal_on_60.b3d deleted file mode 100644 index a51529a..0000000 Binary files a/models/advtrains_retrosignal_on_60.b3d and /dev/null differ diff --git a/models/advtrains_signal.b3d b/models/advtrains_signal.b3d deleted file mode 100644 index 7f69560..0000000 Binary files a/models/advtrains_signal.b3d and /dev/null differ diff --git a/models/advtrains_signal_30.b3d b/models/advtrains_signal_30.b3d deleted file mode 100644 index 0b949a7..0000000 Binary files a/models/advtrains_signal_30.b3d and /dev/null differ diff --git a/models/advtrains_signal_45.b3d b/models/advtrains_signal_45.b3d deleted file mode 100644 index ccaebf4..0000000 Binary files a/models/advtrains_signal_45.b3d and /dev/null differ diff --git a/models/advtrains_signal_60.b3d b/models/advtrains_signal_60.b3d deleted file mode 100644 index cf41e6d..0000000 Binary files a/models/advtrains_signal_60.b3d and /dev/null differ diff --git a/models/advtrains_subway_train.b3d b/models/advtrains_subway_train.b3d deleted file mode 100644 index a824d33..0000000 Binary files a/models/advtrains_subway_train.b3d and /dev/null differ diff --git a/models/advtrains_track_cr.b3d b/models/advtrains_track_cr.b3d deleted file mode 100644 index b0f5e4b..0000000 Binary files a/models/advtrains_track_cr.b3d and /dev/null differ diff --git a/models/advtrains_track_st.b3d b/models/advtrains_track_st.b3d deleted file mode 100644 index 10b5d90..0000000 Binary files a/models/advtrains_track_st.b3d and /dev/null differ diff --git a/models/advtrains_track_st_45.b3d b/models/advtrains_track_st_45.b3d deleted file mode 100644 index 32505a1..0000000 Binary files a/models/advtrains_track_st_45.b3d and /dev/null differ diff --git a/models/advtrains_wagon.b3d b/models/advtrains_wagon.b3d deleted file mode 100644 index 5c8214c..0000000 Binary files a/models/advtrains_wagon.b3d and /dev/null differ diff --git a/models/advtrains_wagon_japan.b3d b/models/advtrains_wagon_japan.b3d deleted file mode 100644 index 7970438..0000000 Binary files a/models/advtrains_wagon_japan.b3d and /dev/null differ diff --git a/models/advtrains_wagon_tank.b3d b/models/advtrains_wagon_tank.b3d deleted file mode 100644 index af2604b..0000000 Binary files a/models/advtrains_wagon_tank.b3d and /dev/null differ diff --git a/models/advtrains_wagon_wood.b3d b/models/advtrains_wagon_wood.b3d deleted file mode 100644 index 0e7fb4b..0000000 Binary files a/models/advtrains_wagon_wood.b3d and /dev/null differ diff --git a/models/blender/engine-with-animation.blend b/models/blender/engine-with-animation.blend deleted file mode 100644 index 2649587..0000000 Binary files a/models/blender/engine-with-animation.blend and /dev/null differ diff --git a/models/blender/gleis/infos/Grafik_weiche.png b/models/blender/gleis/infos/Grafik_weiche.png deleted file mode 100644 index 6674eb3..0000000 Binary files a/models/blender/gleis/infos/Grafik_weiche.png and /dev/null differ diff --git a/models/blender/gleis/infos/breite b/models/blender/gleis/infos/breite deleted file mode 100644 index b2862c6..0000000 --- a/models/blender/gleis/infos/breite +++ /dev/null @@ -1 +0,0 @@ -1435mm diff --git a/models/blender/gleis/licence.txt~ b/models/blender/gleis/licence.txt~ deleted file mode 100644 index e69de29..0000000 diff --git a/models/blender/gleis/rail_my.blend b/models/blender/gleis/rail_my.blend deleted file mode 100644 index 3c741bc..0000000 Binary files a/models/blender/gleis/rail_my.blend and /dev/null differ diff --git a/models/blender/gleis/rail_my.blend1 b/models/blender/gleis/rail_my.blend1 deleted file mode 100644 index 6322856..0000000 Binary files a/models/blender/gleis/rail_my.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt.blend b/models/blender/gleis/rail_my_rt.blend deleted file mode 100644 index 8372a0c..0000000 Binary files a/models/blender/gleis/rail_my_rt.blend and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt.blend1 b/models/blender/gleis/rail_my_rt.blend1 deleted file mode 100644 index 7d0978e..0000000 Binary files a/models/blender/gleis/rail_my_rt.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt_final.blend b/models/blender/gleis/rail_my_rt_final.blend deleted file mode 100644 index 6a9a088..0000000 Binary files a/models/blender/gleis/rail_my_rt_final.blend and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt_final.blend1 b/models/blender/gleis/rail_my_rt_final.blend1 deleted file mode 100644 index 1f346ae..0000000 Binary files a/models/blender/gleis/rail_my_rt_final.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt_switches.blend b/models/blender/gleis/rail_my_rt_switches.blend deleted file mode 100644 index fdce427..0000000 Binary files a/models/blender/gleis/rail_my_rt_switches.blend and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt_switches.blend1 b/models/blender/gleis/rail_my_rt_switches.blend1 deleted file mode 100644 index 04370ba..0000000 Binary files a/models/blender/gleis/rail_my_rt_switches.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt_switches2.blend b/models/blender/gleis/rail_my_rt_switches2.blend deleted file mode 100644 index 9562e4d..0000000 Binary files a/models/blender/gleis/rail_my_rt_switches2.blend and /dev/null differ diff --git a/models/blender/gleis/rail_my_rt_switches2.blend1 b/models/blender/gleis/rail_my_rt_switches2.blend1 deleted file mode 100644 index 07a155f..0000000 Binary files a/models/blender/gleis/rail_my_rt_switches2.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_together.blend b/models/blender/gleis/rail_together.blend deleted file mode 100644 index cff51ea..0000000 Binary files a/models/blender/gleis/rail_together.blend and /dev/null differ diff --git a/models/blender/gleis/rail_together.png b/models/blender/gleis/rail_together.png deleted file mode 100644 index 386cd5c..0000000 Binary files a/models/blender/gleis/rail_together.png and /dev/null differ diff --git a/models/blender/gleis/rail_together2.png b/models/blender/gleis/rail_together2.png deleted file mode 100644 index 3effe34..0000000 Binary files a/models/blender/gleis/rail_together2.png and /dev/null differ diff --git a/models/blender/gleis/rail_together3.png b/models/blender/gleis/rail_together3.png deleted file mode 100644 index 4a183c1..0000000 Binary files a/models/blender/gleis/rail_together3.png and /dev/null differ diff --git a/models/blender/gleis/rail_verticals.blend b/models/blender/gleis/rail_verticals.blend deleted file mode 100644 index 45c37e1..0000000 Binary files a/models/blender/gleis/rail_verticals.blend and /dev/null differ diff --git a/models/blender/gleis/rail_verticals.blend1 b/models/blender/gleis/rail_verticals.blend1 deleted file mode 100644 index 320f30b..0000000 Binary files a/models/blender/gleis/rail_verticals.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_verticals3.blend b/models/blender/gleis/rail_verticals3.blend deleted file mode 100644 index 5d62959..0000000 Binary files a/models/blender/gleis/rail_verticals3.blend and /dev/null differ diff --git a/models/blender/gleis/rail_verticals3.blend1 b/models/blender/gleis/rail_verticals3.blend1 deleted file mode 100644 index 893f2ea..0000000 Binary files a/models/blender/gleis/rail_verticals3.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_verticals45.blend b/models/blender/gleis/rail_verticals45.blend deleted file mode 100644 index a1589e3..0000000 Binary files a/models/blender/gleis/rail_verticals45.blend and /dev/null differ diff --git a/models/blender/gleis/rail_verticals45.blend1 b/models/blender/gleis/rail_verticals45.blend1 deleted file mode 100644 index 6b44d1c..0000000 Binary files a/models/blender/gleis/rail_verticals45.blend1 and /dev/null differ diff --git a/models/blender/gleis/rail_verticals45.blend11 b/models/blender/gleis/rail_verticals45.blend11 deleted file mode 100644 index 48316e8..0000000 Binary files a/models/blender/gleis/rail_verticals45.blend11 and /dev/null differ diff --git a/models/blender/gleis/texturen/rail.png b/models/blender/gleis/texturen/rail.png deleted file mode 100644 index 8478cf6..0000000 Binary files a/models/blender/gleis/texturen/rail.png and /dev/null differ diff --git a/models/blender/gleis/texturen/uv.png b/models/blender/gleis/texturen/uv.png deleted file mode 100644 index fb0af3e..0000000 Binary files a/models/blender/gleis/texturen/uv.png and /dev/null differ diff --git a/models/blender/industrial/industry_loc.blend b/models/blender/industrial/industry_loc.blend deleted file mode 100644 index 1a6cb2b..0000000 Binary files a/models/blender/industrial/industry_loc.blend and /dev/null differ diff --git a/models/blender/industrial/industry_loc.blend1 b/models/blender/industrial/industry_loc.blend1 deleted file mode 100644 index af54c3f..0000000 Binary files a/models/blender/industrial/industry_loc.blend1 and /dev/null differ diff --git a/models/blender/industrial/industry_loc.blend11 b/models/blender/industrial/industry_loc.blend11 deleted file mode 100644 index a089a65..0000000 Binary files a/models/blender/industrial/industry_loc.blend11 and /dev/null differ diff --git a/models/blender/industrial/industry_oil_ wagong.blend b/models/blender/industrial/industry_oil_ wagong.blend deleted file mode 100644 index 30bde51..0000000 Binary files a/models/blender/industrial/industry_oil_ wagong.blend and /dev/null differ diff --git a/models/blender/industrial/industry_oil_ wagong.blend1 b/models/blender/industrial/industry_oil_ wagong.blend1 deleted file mode 100644 index 849971d..0000000 Binary files a/models/blender/industrial/industry_oil_ wagong.blend1 and /dev/null differ diff --git a/models/blender/industrial/industry_tree_wagong.blend b/models/blender/industrial/industry_tree_wagong.blend deleted file mode 100644 index 23de208..0000000 Binary files a/models/blender/industrial/industry_tree_wagong.blend and /dev/null differ diff --git a/models/blender/industrial/industry_tree_wagong.blend1 b/models/blender/industrial/industry_tree_wagong.blend1 deleted file mode 100644 index bf2c9ed..0000000 Binary files a/models/blender/industrial/industry_tree_wagong.blend1 and /dev/null differ diff --git a/models/blender/industrial/industry_tree_wagong.png b/models/blender/industrial/industry_tree_wagong.png deleted file mode 100644 index 87109dd..0000000 Binary files a/models/blender/industrial/industry_tree_wagong.png and /dev/null differ diff --git a/models/blender/locomotive.blend b/models/blender/locomotive.blend deleted file mode 100644 index 8fd6059..0000000 Binary files a/models/blender/locomotive.blend and /dev/null differ diff --git a/models/blender/magnet_track.blend b/models/blender/magnet_track.blend deleted file mode 100644 index 0ab14e7..0000000 Binary files a/models/blender/magnet_track.blend and /dev/null differ diff --git a/models/blender/mbb/advtrains_wagon_japan.xcf b/models/blender/mbb/advtrains_wagon_japan.xcf deleted file mode 100644 index 4fc88c0..0000000 Binary files a/models/blender/mbb/advtrains_wagon_japan.xcf and /dev/null differ diff --git a/models/blender/mbb/modern_japanlocomotive.blend b/models/blender/mbb/modern_japanlocomotive.blend deleted file mode 100644 index 6eb8f3d..0000000 Binary files a/models/blender/mbb/modern_japanlocomotive.blend and /dev/null differ diff --git a/models/blender/mbb/modern_japanlocomotive.blend1 b/models/blender/mbb/modern_japanlocomotive.blend1 deleted file mode 100644 index a2e745d..0000000 Binary files a/models/blender/mbb/modern_japanlocomotive.blend1 and /dev/null differ diff --git a/models/blender/mbb/modern_japanlocomotive.png b/models/blender/mbb/modern_japanlocomotive.png deleted file mode 100644 index b80d16f..0000000 Binary files a/models/blender/mbb/modern_japanlocomotive.png and /dev/null differ diff --git a/models/blender/mbb/modern_japanlocomotive.xcf b/models/blender/mbb/modern_japanlocomotive.xcf deleted file mode 100644 index bb28534..0000000 Binary files a/models/blender/mbb/modern_japanlocomotive.xcf and /dev/null differ diff --git a/models/blender/mbb/modern_locomotive.blend b/models/blender/mbb/modern_locomotive.blend deleted file mode 100644 index 8e72233..0000000 Binary files a/models/blender/mbb/modern_locomotive.blend and /dev/null differ diff --git a/models/blender/mbb/modern_wagong.blend b/models/blender/mbb/modern_wagong.blend deleted file mode 100644 index f32710a..0000000 Binary files a/models/blender/mbb/modern_wagong.blend and /dev/null differ diff --git a/models/blender/mbb/modern_wagong.blend1 b/models/blender/mbb/modern_wagong.blend1 deleted file mode 100644 index 376831c..0000000 Binary files a/models/blender/mbb/modern_wagong.blend1 and /dev/null differ diff --git a/models/blender/mbb/modern_wagong_uv.blend b/models/blender/mbb/modern_wagong_uv.blend deleted file mode 100644 index 4c10fb3..0000000 Binary files a/models/blender/mbb/modern_wagong_uv.blend and /dev/null differ diff --git a/models/blender/mbb/modern_wagong_uv.blend1 b/models/blender/mbb/modern_wagong_uv.blend1 deleted file mode 100644 index ce77416..0000000 Binary files a/models/blender/mbb/modern_wagong_uv.blend1 and /dev/null differ diff --git a/models/blender/mbb/modern_wagong_uv.png b/models/blender/mbb/modern_wagong_uv.png deleted file mode 100644 index 68018ea..0000000 Binary files a/models/blender/mbb/modern_wagong_uv.png and /dev/null differ diff --git a/models/blender/mbb/prellbock.blend b/models/blender/mbb/prellbock.blend deleted file mode 100644 index 1c20ab2..0000000 Binary files a/models/blender/mbb/prellbock.blend and /dev/null differ diff --git a/models/blender/mbb/prellbock.blend1 b/models/blender/mbb/prellbock.blend1 deleted file mode 100644 index 981538e..0000000 Binary files a/models/blender/mbb/prellbock.blend1 and /dev/null differ diff --git a/models/blender/mbb/prellbock.uv.png b/models/blender/mbb/prellbock.uv.png deleted file mode 100644 index 7730753..0000000 Binary files a/models/blender/mbb/prellbock.uv.png and /dev/null differ diff --git a/models/blender/mbb/regio-lokomotive.blend b/models/blender/mbb/regio-lokomotive.blend deleted file mode 100644 index 210e60e..0000000 Binary files a/models/blender/mbb/regio-lokomotive.blend and /dev/null differ diff --git a/models/blender/mbb/regio-waron.blend b/models/blender/mbb/regio-waron.blend deleted file mode 100644 index 19b07ce..0000000 Binary files a/models/blender/mbb/regio-waron.blend and /dev/null differ diff --git a/models/blender/mbb/retrosignal.blend b/models/blender/mbb/retrosignal.blend deleted file mode 100644 index b795215..0000000 Binary files a/models/blender/mbb/retrosignal.blend and /dev/null differ diff --git a/models/blender/mbb/retrosignal.blend1 b/models/blender/mbb/retrosignal.blend1 deleted file mode 100644 index 94af470..0000000 Binary files a/models/blender/mbb/retrosignal.blend1 and /dev/null differ diff --git a/models/blender/mbb/signal(2)_hoch.blend b/models/blender/mbb/signal(2)_hoch.blend deleted file mode 100644 index 70391f6..0000000 Binary files a/models/blender/mbb/signal(2)_hoch.blend and /dev/null differ diff --git a/models/blender/mbb/signal(2)_unten.blend b/models/blender/mbb/signal(2)_unten.blend deleted file mode 100644 index 4e917bc..0000000 Binary files a/models/blender/mbb/signal(2)_unten.blend and /dev/null differ diff --git a/models/blender/mbb/signal.blend b/models/blender/mbb/signal.blend deleted file mode 100644 index 135c7b4..0000000 Binary files a/models/blender/mbb/signal.blend and /dev/null differ diff --git a/models/blender/mbb/signal.blend1 b/models/blender/mbb/signal.blend1 deleted file mode 100644 index 63a8c99..0000000 Binary files a/models/blender/mbb/signal.blend1 and /dev/null differ diff --git a/models/blender/mbb/signal.png b/models/blender/mbb/signal.png deleted file mode 100644 index 779cdda..0000000 Binary files a/models/blender/mbb/signal.png and /dev/null differ diff --git a/models/blender/mbb/signal.xcf b/models/blender/mbb/signal.xcf deleted file mode 100644 index f667739..0000000 Binary files a/models/blender/mbb/signal.xcf and /dev/null differ diff --git a/models/blender/mbb/signal2.png b/models/blender/mbb/signal2.png deleted file mode 100644 index 7af4e2d..0000000 Binary files a/models/blender/mbb/signal2.png and /dev/null differ diff --git a/models/blender/mbb/tr-logo.png b/models/blender/mbb/tr-logo.png deleted file mode 100644 index 9bc0f10..0000000 Binary files a/models/blender/mbb/tr-logo.png and /dev/null differ diff --git a/models/blender/mbb/weichenhebel1.blend b/models/blender/mbb/weichenhebel1.blend deleted file mode 100644 index 70b997d..0000000 Binary files a/models/blender/mbb/weichenhebel1.blend and /dev/null differ diff --git a/models/blender/mbb/weichenhebel2.blend b/models/blender/mbb/weichenhebel2.blend deleted file mode 100644 index c1c3aac..0000000 Binary files a/models/blender/mbb/weichenhebel2.blend and /dev/null differ diff --git a/models/blender/newlocomotive.blend b/models/blender/newlocomotive.blend deleted file mode 100644 index 858882b..0000000 Binary files a/models/blender/newlocomotive.blend and /dev/null differ diff --git a/models/blender/newlocomotive.blend1 b/models/blender/newlocomotive.blend1 deleted file mode 100644 index 4b8b24f..0000000 Binary files a/models/blender/newlocomotive.blend1 and /dev/null differ diff --git a/models/blender/newlocomotive_uvs.png b/models/blender/newlocomotive_uvs.png deleted file mode 100644 index 879be65..0000000 Binary files a/models/blender/newlocomotive_uvs.png and /dev/null differ diff --git a/models/blender/newwagon.blend b/models/blender/newwagon.blend deleted file mode 100644 index 1cedc55..0000000 Binary files a/models/blender/newwagon.blend and /dev/null differ diff --git a/models/blender/newwagon.blend1 b/models/blender/newwagon.blend1 deleted file mode 100644 index eb30fde..0000000 Binary files a/models/blender/newwagon.blend1 and /dev/null differ diff --git a/models/blender/newwagon.png b/models/blender/newwagon.png deleted file mode 100644 index 812bc32..0000000 Binary files a/models/blender/newwagon.png and /dev/null differ diff --git a/models/blender/subway-train.blend b/models/blender/subway-train.blend deleted file mode 100644 index 690d87b..0000000 Binary files a/models/blender/subway-train.blend and /dev/null differ diff --git a/models/blender/subway-train.blend1 b/models/blender/subway-train.blend1 deleted file mode 100644 index 86d1f92..0000000 Binary files a/models/blender/subway-train.blend1 and /dev/null differ diff --git a/models/blender/subway-train.png b/models/blender/subway-train.png deleted file mode 100644 index d0b9731..0000000 Binary files a/models/blender/subway-train.png and /dev/null differ diff --git a/models/blender/subway-train.xcf b/models/blender/subway-train.xcf deleted file mode 100644 index 775b87c..0000000 Binary files a/models/blender/subway-train.xcf and /dev/null differ diff --git a/models/blender/trackplane.blend b/models/blender/trackplane.blend deleted file mode 100644 index 79365f7..0000000 Binary files a/models/blender/trackplane.blend and /dev/null differ diff --git a/models/blender/trackvertical1.blend b/models/blender/trackvertical1.blend deleted file mode 100644 index fca6742..0000000 Binary files a/models/blender/trackvertical1.blend and /dev/null differ diff --git a/models/blender/trackvertical1.blend1 b/models/blender/trackvertical1.blend1 deleted file mode 100644 index b146b56..0000000 Binary files a/models/blender/trackvertical1.blend1 and /dev/null differ diff --git a/models/blender/trackvertical1.png b/models/blender/trackvertical1.png deleted file mode 100644 index a998dcb..0000000 Binary files a/models/blender/trackvertical1.png and /dev/null differ diff --git a/models/blender/trackvertical2.blend b/models/blender/trackvertical2.blend deleted file mode 100644 index a066b84..0000000 Binary files a/models/blender/trackvertical2.blend and /dev/null differ diff --git a/models/blender/trackvertical2.png b/models/blender/trackvertical2.png deleted file mode 100644 index 43142f9..0000000 Binary files a/models/blender/trackvertical2.png and /dev/null differ diff --git a/models/oldmodels/locomotive.b3d b/models/oldmodels/locomotive.b3d deleted file mode 100644 index 5e16be3..0000000 Binary files a/models/oldmodels/locomotive.b3d and /dev/null differ diff --git a/models/oldmodels/trackvertical1.b3d b/models/oldmodels/trackvertical1.b3d deleted file mode 100644 index 5620f60..0000000 Binary files a/models/oldmodels/trackvertical1.b3d and /dev/null differ diff --git a/models/oldmodels/trackvertical2.b3d b/models/oldmodels/trackvertical2.b3d deleted file mode 100644 index 22dbb20..0000000 Binary files a/models/oldmodels/trackvertical2.b3d and /dev/null differ diff --git a/models/trackplane.b3d b/models/trackplane.b3d deleted file mode 100644 index b4728c3..0000000 Binary files a/models/trackplane.b3d and /dev/null differ diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/pseudoload.lua b/pseudoload.lua deleted file mode 100644 index 8511811..0000000 --- a/pseudoload.lua +++ /dev/null @@ -1,180 +0,0 @@ -local print=function(t) minetest.log("action", t) minetest.chat_send_all(t) end - ---pseudoload.lua ---responsible for keeping up a database of all rail nodes existant in the world, regardless of whether the mapchunk is loaded. - -advtrains.trackdb={} ---trackdb[tt][y][x][z]={conn1, conn2, rely1, rely2, railheight} ---serialization format: ---(2byte x)(2byte y)(2byte z)(4bits conn1, 4bits conn2)[(plain rely1)|(plain rely2)|(plain railheight)]\n ---[] may be missing if 0,0,0 - ---load initially - ---[[ TODO temporary outcomment - ---delayed since all traintypes need to be registered -minetest.after(0, function() - -for tt, _ in pairs(advtrains.all_traintypes) do - local pl_fpath=minetest.get_worldpath().."/advtrains_trackdb_"..tt - advtrains.trackdb[tt]={} - local file, err = io.open(pl_fpath, "r") - if not file then - local er=err or "Unknown Error" - print("[advtrains]Failed loading advtrains trackdb save file "..er) - else - --custom format to save memory - while true do - local xbytes=file:read(2) - if not xbytes or #xbytes<2 then - break --eof reached - end - print(xbytes) - local ybytes=file:read(2) - local zbytes=file:read(2) - local x=(string.byte(xbytes[1])-128)*256+(string.byte(xbytes[2])) - local y=(string.byte(ybytes[1])-128)*256+(string.byte(ybytes[2])) - local z=(string.byte(zbytes[1])-128)*256+(string.byte(zbytes[2])) - - local conn1=string.byte(file:read(1)) - local conn1=string.byte(file:read(1)) - - if not advtrains.trackdb[tt][y] then advtrains.trackdb[tt][y]={} end - if not advtrains.trackdb[tt][y][x] then advtrains.trackdb[tt][y][x]={} end - - local rest=file.read("*l") - if rest~="" then - local rely1, rely2, railheight=string.match(rest, "([^|]+)|([^|]+)|([^|]+)") - if rely1 and rely2 and railheight then - advtrains.trackdb[tt][y][x][z]={ - conn1=conn1, conn2=conn2, - rely1=rely1, rely2=rely2, - railheight=railheight - } - else - advtrains.trackdb[tt][y][x][z]={ - conn1=conn1, conn2=conn2 - } - end - else - advtrains.trackdb[tt][y][x][z]={ - conn1=conn1, conn2=conn2 - } - end - end - file:close() - end -end - ---end minetest.after -end) - -function advtrains.save_trackdb() - for tt, _ in pairs(advtrains.all_traintypes) do - local pl_fpath=minetest.get_worldpath().."/advtrains_trackdb_"..tt - local file, err = io.open(pl_fpath, "w") - if not file then - local er=err or "Unknown Error" - print("[advtrains]Failed saving advtrains trackdb save file "..er) - else - --custom format to save memory - for y,tyl in pairs(advtrains.trackdb[tt]) do - for x,txl in pairs(tyl) do - for z,rail in pairs(txl) do - print("write "..x.." "..y.." "..z.." "..minetest.serialize(rail)) - file:write(string.char(math.floor(x/256)+128)..string.char((x%256))) - file:write(string.char(math.floor(y/256)+128)..string.char((y%256))) - file:write(string.char(math.floor(z/256)+128)..string.char((z%256))) - file:write(string.char(rail.conn1)) - file:write(string.char(rail.conn2)) - if (rail.rely1 and rail.rely1~=0) or (rail.rely2 and rail.rely2~=0) or (rail.railheight and rail.railheight~=0) then - file:write(rail.rely1.."|"..rail.rely2.."|"..rail.railheight) - end - file:write("\n") - end - end - end - file:close() - end - end -end -]]--end temp outcomment -advtrains.trackdb={} -advtrains.fpath_tdb=minetest.get_worldpath().."/advtrains_trackdb" -local file, err = io.open(advtrains.fpath_tdb, "r") -if not file then - local er=err or "Unknown Error" - print("[advtrains]Failed loading advtrains save file "..er) -else - local tbl = minetest.deserialize(file:read("*a")) - if type(tbl) == "table" then - advtrains.trackdb=tbl - end - file:close() -end -function advtrains.save_trackdb() - local datastr = minetest.serialize(advtrains.trackdb) - if not datastr then - minetest.log("error", "[advtrains] Failed to serialize trackdb data!") - return - end - local file, err = io.open(advtrains.fpath_tdb, "w") - if err then - return err - end - file:write(datastr) - file:close() -end - ---get_node with pseudoload. ---returns: ---true, conn1, conn2, rely1, rely2, railheight in case everything's right. ---false if it's not a rail or the train does not drive on this rail, but it is loaded or ---nil if the node is neither loaded nor in trackdb ---the distraction between false and nil will be needed only in special cases.(train initpos) -function advtrains.get_rail_info_at(pos, traintype) - local node=minetest.get_node_or_nil(pos) - if not node then - --try raildb - local rdp=vector.round(pos) - local dbe=(advtrains.trackdb[traintype] and advtrains.trackdb[traintype][rdp.y] and advtrains.trackdb[traintype][rdp.y][rdp.x] and advtrains.trackdb[traintype][rdp.y][rdp.x][rdp.z]) - if dbe then - return true, dbe.conn1, dbe.conn2, dbe.rely1 or 0, dbe.rely2 or 0, dbe.railheight or 0 - else - return nil - end - end - local nodename=node.name - if(not advtrains.is_track_and_drives_on(nodename, advtrains.all_traintypes[traintype].drives_on)) then - return false - end - local conn1, conn2, rely1, rely2, railheight=advtrains.get_track_connections(node.name, node.param2) - - --already in trackdb? - local rdp=vector.round(pos) - if not (advtrains.trackdb[traintype] and advtrains.trackdb[traintype][rdp.y] and advtrains.trackdb[traintype][rdp.y][rdp.x] and advtrains.trackdb[traintype][rdp.y][rdp.x][rdp.z]) then--TODO is this necessary? - if not advtrains.trackdb[traintype] then advtrains.trackdb[traintype]={} end - if not advtrains.trackdb[traintype][rdp.y] then advtrains.trackdb[traintype][rdp.y]={} end - if not advtrains.trackdb[traintype][rdp.y][rdp.x] then advtrains.trackdb[traintype][rdp.y][rdp.x]={} end - advtrains.trackdb[traintype][rdp.y][rdp.x][rdp.z]={ - conn1=conn1, conn2=conn2, - rely1=rely1, rely2=rely2, - railheight=railheight - } - end - - return true, conn1, conn2, rely1, rely2, railheight -end -function advtrains.reset_trackdb_position(pos) - local rdp=vector.round(pos) - for tt, _ in pairs(advtrains.all_traintypes) do - if not advtrains.trackdb[tt] then advtrains.trackdb[tt]={} end - if not advtrains.trackdb[tt][rdp.y] then advtrains.trackdb[tt][rdp.y]={} end - if not advtrains.trackdb[tt][rdp.y][rdp.x] then advtrains.trackdb[tt][rdp.y][rdp.x]={} end - advtrains.trackdb[tt][rdp.y][rdp.x][rdp.z]=nil - advtrains.get_rail_info_at(pos, tt)--to restore it. - end -end - - diff --git a/readme.txt b/readme.txt deleted file mode 100644 index ad093bd..0000000 --- a/readme.txt +++ /dev/null @@ -1,23 +0,0 @@ - -## ADVTRAINS ## realistic trains in Minetest! -by orwell96 and contributors(see below) - -For up-to-date information, visit https://forum.minetest.net/viewtopic.php?f=9&t=14726 - - -Manual: -If manual.pdf is not present (which is the case when you downloaded the zip file), see https://github.com/orwell96/advtrains/blob/master/manual.pdf - -License of code: LGPL 2.1 -License of media: CC-BY-NC-SA 3.0 - -Contributions: - -Gravel Texture : from Minetest Game -Initial rail model/texture : DS-minetest -Models for signals/bumpers : mbb -Steam engine / wagon texture: mbb -Industrial engine/wagons : mbb -Inventory images : mbb -Small code contributions : NaruTrey / gpcf -Mod Description : hajo \ No newline at end of file diff --git a/signals.lua b/signals.lua deleted file mode 100644 index 8be65e0..0000000 --- a/signals.lua +++ /dev/null @@ -1,76 +0,0 @@ ---advtrains by orwell96 ---signals.lua -for r,f in pairs({on="off", off="on"}) do - - advtrains.trackplacer.register_tracktype("advtrains:retrosignal", "") - advtrains.trackplacer.register_tracktype("advtrains:signal", "") - - for rotid, rotation in ipairs({"", "_30", "_45", "_60"}) do - local crea=1 - if rotid==1 and r=="off" then crea=0 end - - minetest.register_node("advtrains:retrosignal_"..r..rotation, { - drawtype = "mesh", - paramtype="light", - paramtype2="facedir", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4}, - }, - mesh = "advtrains_retrosignal_"..r..rotation..".b3d", - tiles = {"advtrains_retrosignal.png"}, - inventory_image="advtrains_retrosignal_inv.png", - drop="advtrains:retrosignal_off", - description="Lampless Signal ("..r..rotation..")", - on_rightclick=switchfunc, - sunlight_propagates=true, - groups = { - choppy=3, - not_blocking_trains=1, - not_in_creative_inventory=crea, - }, - mesecons = {effector = { - ["action_"..f] = function (pos, node) - minetest.swap_node(pos, {name = "advtrains:retrosignal_"..f..rotation, param2 = node.param2}) - end - }}, - on_rightclick=function(pos, node, clicker) - minetest.swap_node(pos, {name = "advtrains:retrosignal_"..f..rotation, param2 = node.param2}) - end, - }) - advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil) - minetest.register_node("advtrains:signal_"..r..rotation, { - drawtype = "mesh", - paramtype="light", - paramtype2="facedir", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4}, - }, - mesh = "advtrains_signal"..rotation..".b3d", - tiles = {"advtrains_signal_"..r..".png"}, - inventory_image="advtrains_signal_inv.png", - drop="advtrains:signal_off", - description="Signal ("..r..rotation..")", - on_rightclick=switchfunc, - groups = { - choppy=3, - not_blocking_trains=1, - not_in_creative_inventory=crea, - }, - light_source = 1, - sunlight_propagates=true, - mesecons = {effector = { - ["action_"..f] = function (pos, node) - minetest.swap_node(pos, {name = "advtrains:signal_"..f..rotation, param2 = node.param2}) - end - }}, - on_rightclick=function(pos, node, clicker) - minetest.swap_node(pos, {name = "advtrains:signal_"..f..rotation, param2 = node.param2}) - end, - }) - advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil) - end -end diff --git a/textures/advtrains_couple.png b/textures/advtrains_couple.png deleted file mode 100644 index 9e997e4..0000000 Binary files a/textures/advtrains_couple.png and /dev/null differ diff --git a/textures/advtrains_discouple.png b/textures/advtrains_discouple.png deleted file mode 100644 index b27c4fb..0000000 Binary files a/textures/advtrains_discouple.png and /dev/null differ diff --git a/textures/advtrains_dtrack_bumper_placer.png b/textures/advtrains_dtrack_bumper_placer.png deleted file mode 100644 index 27191fe..0000000 Binary files a/textures/advtrains_dtrack_bumper_placer.png and /dev/null differ diff --git a/textures/advtrains_dtrack_detector_placer.png b/textures/advtrains_dtrack_detector_placer.png deleted file mode 100644 index e6c6ad6..0000000 Binary files a/textures/advtrains_dtrack_detector_placer.png and /dev/null differ diff --git a/textures/advtrains_dtrack_placer.png b/textures/advtrains_dtrack_placer.png deleted file mode 100644 index c49777c..0000000 Binary files a/textures/advtrains_dtrack_placer.png and /dev/null differ diff --git a/textures/advtrains_dtrack_rail.png b/textures/advtrains_dtrack_rail.png deleted file mode 100644 index 568e533..0000000 Binary files a/textures/advtrains_dtrack_rail.png and /dev/null differ diff --git a/textures/advtrains_dtrack_rail_detector_on.png b/textures/advtrains_dtrack_rail_detector_on.png deleted file mode 100644 index 3ae0dac..0000000 Binary files a/textures/advtrains_dtrack_rail_detector_on.png and /dev/null differ diff --git a/textures/advtrains_dtrack_slopeplacer.png b/textures/advtrains_dtrack_slopeplacer.png deleted file mode 100644 index 1d456b0..0000000 Binary files a/textures/advtrains_dtrack_slopeplacer.png and /dev/null differ diff --git a/textures/advtrains_engine_industrial.png b/textures/advtrains_engine_industrial.png deleted file mode 100644 index 38a872f..0000000 Binary files a/textures/advtrains_engine_industrial.png and /dev/null differ diff --git a/textures/advtrains_engine_industrial_inv.png b/textures/advtrains_engine_industrial_inv.png deleted file mode 100644 index be4e80f..0000000 Binary files a/textures/advtrains_engine_industrial_inv.png and /dev/null differ diff --git a/textures/advtrains_engine_japan.png b/textures/advtrains_engine_japan.png deleted file mode 100644 index b286b38..0000000 Binary files a/textures/advtrains_engine_japan.png and /dev/null differ diff --git a/textures/advtrains_engine_japan_inv.png b/textures/advtrains_engine_japan_inv.png deleted file mode 100644 index 6af0636..0000000 Binary files a/textures/advtrains_engine_japan_inv.png and /dev/null differ diff --git a/textures/advtrains_newlocomotive.png b/textures/advtrains_newlocomotive.png deleted file mode 100644 index e461bc7..0000000 Binary files a/textures/advtrains_newlocomotive.png and /dev/null differ diff --git a/textures/advtrains_newlocomotive.xcf b/textures/advtrains_newlocomotive.xcf deleted file mode 100644 index 9ad5187..0000000 Binary files a/textures/advtrains_newlocomotive.xcf and /dev/null differ diff --git a/textures/advtrains_newlocomotive_inv.png b/textures/advtrains_newlocomotive_inv.png deleted file mode 100755 index 8d3fafb..0000000 Binary files a/textures/advtrains_newlocomotive_inv.png and /dev/null differ diff --git a/textures/advtrains_platform.png b/textures/advtrains_platform.png deleted file mode 100644 index 5ba9663..0000000 Binary files a/textures/advtrains_platform.png and /dev/null differ diff --git a/textures/advtrains_retrosignal.png b/textures/advtrains_retrosignal.png deleted file mode 100644 index 141198d..0000000 Binary files a/textures/advtrains_retrosignal.png and /dev/null differ diff --git a/textures/advtrains_retrosignal_inv.png b/textures/advtrains_retrosignal_inv.png deleted file mode 100644 index 1036594..0000000 Binary files a/textures/advtrains_retrosignal_inv.png and /dev/null differ diff --git a/textures/advtrains_signal_inv.png b/textures/advtrains_signal_inv.png deleted file mode 100644 index ed64ed9..0000000 Binary files a/textures/advtrains_signal_inv.png and /dev/null differ diff --git a/textures/advtrains_signal_off.png b/textures/advtrains_signal_off.png deleted file mode 100644 index 8046e52..0000000 Binary files a/textures/advtrains_signal_off.png and /dev/null differ diff --git a/textures/advtrains_signal_on.png b/textures/advtrains_signal_on.png deleted file mode 100644 index 5228bb3..0000000 Binary files a/textures/advtrains_signal_on.png and /dev/null differ diff --git a/textures/advtrains_subway_train.png b/textures/advtrains_subway_train.png deleted file mode 100644 index 1d569f3..0000000 Binary files a/textures/advtrains_subway_train.png and /dev/null differ diff --git a/textures/advtrains_subway_train_inv.png b/textures/advtrains_subway_train_inv.png deleted file mode 100644 index 1d0e809..0000000 Binary files a/textures/advtrains_subway_train_inv.png and /dev/null differ diff --git a/textures/advtrains_track_cr.png b/textures/advtrains_track_cr.png deleted file mode 100644 index 40f0cc5..0000000 Binary files a/textures/advtrains_track_cr.png and /dev/null differ diff --git a/textures/advtrains_track_cr_45.png b/textures/advtrains_track_cr_45.png deleted file mode 100644 index 54966b3..0000000 Binary files a/textures/advtrains_track_cr_45.png and /dev/null differ diff --git a/textures/advtrains_track_placer.png b/textures/advtrains_track_placer.png deleted file mode 100644 index 03e17ed..0000000 Binary files a/textures/advtrains_track_placer.png and /dev/null differ diff --git a/textures/advtrains_track_st.png b/textures/advtrains_track_st.png deleted file mode 100644 index 5ad7e4f..0000000 Binary files a/textures/advtrains_track_st.png and /dev/null differ diff --git a/textures/advtrains_track_st_45.png b/textures/advtrains_track_st_45.png deleted file mode 100644 index 63b4c96..0000000 Binary files a/textures/advtrains_track_st_45.png and /dev/null differ diff --git a/textures/advtrains_track_swlcr.png b/textures/advtrains_track_swlcr.png deleted file mode 100644 index d9b5c0b..0000000 Binary files a/textures/advtrains_track_swlcr.png and /dev/null differ diff --git a/textures/advtrains_track_swlcr_45.png b/textures/advtrains_track_swlcr_45.png deleted file mode 100644 index f098fc9..0000000 Binary files a/textures/advtrains_track_swlcr_45.png and /dev/null differ diff --git a/textures/advtrains_track_swlst.png b/textures/advtrains_track_swlst.png deleted file mode 100644 index 314bd2d..0000000 Binary files a/textures/advtrains_track_swlst.png and /dev/null differ diff --git a/textures/advtrains_track_swlst_45.png b/textures/advtrains_track_swlst_45.png deleted file mode 100644 index 765d0ec..0000000 Binary files a/textures/advtrains_track_swlst_45.png and /dev/null differ diff --git a/textures/advtrains_track_swrcr.png b/textures/advtrains_track_swrcr.png deleted file mode 100644 index f74e1bc..0000000 Binary files a/textures/advtrains_track_swrcr.png and /dev/null differ diff --git a/textures/advtrains_track_swrcr_45.png b/textures/advtrains_track_swrcr_45.png deleted file mode 100644 index fa432aa..0000000 Binary files a/textures/advtrains_track_swrcr_45.png and /dev/null differ diff --git a/textures/advtrains_track_swrst.png b/textures/advtrains_track_swrst.png deleted file mode 100644 index 06ea29e..0000000 Binary files a/textures/advtrains_track_swrst.png and /dev/null differ diff --git a/textures/advtrains_track_swrst_45.png b/textures/advtrains_track_swrst_45.png deleted file mode 100644 index be477b7..0000000 Binary files a/textures/advtrains_track_swrst_45.png and /dev/null differ diff --git a/textures/advtrains_trackworker.png b/textures/advtrains_trackworker.png deleted file mode 100644 index b50bcae..0000000 Binary files a/textures/advtrains_trackworker.png and /dev/null differ diff --git a/textures/advtrains_wagon.png b/textures/advtrains_wagon.png deleted file mode 100644 index c37c979..0000000 Binary files a/textures/advtrains_wagon.png and /dev/null differ diff --git a/textures/advtrains_wagon_box.png b/textures/advtrains_wagon_box.png deleted file mode 100644 index 8bfbe06..0000000 Binary files a/textures/advtrains_wagon_box.png and /dev/null differ diff --git a/textures/advtrains_wagon_box_inv.png b/textures/advtrains_wagon_box_inv.png deleted file mode 100644 index 480f245..0000000 Binary files a/textures/advtrains_wagon_box_inv.png and /dev/null differ diff --git a/textures/advtrains_wagon_inv.png b/textures/advtrains_wagon_inv.png deleted file mode 100755 index 0b72ac3..0000000 Binary files a/textures/advtrains_wagon_inv.png and /dev/null differ diff --git a/textures/advtrains_wagon_japan.png b/textures/advtrains_wagon_japan.png deleted file mode 100644 index bee565e..0000000 Binary files a/textures/advtrains_wagon_japan.png and /dev/null differ diff --git a/textures/advtrains_wagon_japan_inv.png b/textures/advtrains_wagon_japan_inv.png deleted file mode 100644 index 3e6357c..0000000 Binary files a/textures/advtrains_wagon_japan_inv.png and /dev/null differ diff --git a/textures/advtrains_wagon_tank.png b/textures/advtrains_wagon_tank.png deleted file mode 100644 index 79b1316..0000000 Binary files a/textures/advtrains_wagon_tank.png and /dev/null differ diff --git a/textures/advtrains_wagon_tank_inv.png b/textures/advtrains_wagon_tank_inv.png deleted file mode 100644 index 03401be..0000000 Binary files a/textures/advtrains_wagon_tank_inv.png and /dev/null differ diff --git a/textures/advtrains_wagon_wood.png b/textures/advtrains_wagon_wood.png deleted file mode 100644 index acc6f72..0000000 Binary files a/textures/advtrains_wagon_wood.png and /dev/null differ diff --git a/textures/advtrains_wagon_wood_inv.png b/textures/advtrains_wagon_wood_inv.png deleted file mode 100644 index 87109dd..0000000 Binary files a/textures/advtrains_wagon_wood_inv.png and /dev/null differ diff --git a/textures/drwho_screwdriver.png b/textures/drwho_screwdriver.png deleted file mode 100644 index b50bcae..0000000 Binary files a/textures/drwho_screwdriver.png and /dev/null differ diff --git a/textures/larger rails.xcf b/textures/larger rails.xcf deleted file mode 100644 index 42ae592..0000000 Binary files a/textures/larger rails.xcf and /dev/null differ diff --git a/trackplacer.lua b/trackplacer.lua deleted file mode 100644 index eebf2ae..0000000 --- a/trackplacer.lua +++ /dev/null @@ -1,282 +0,0 @@ ---trackplacer.lua ---holds code for the track-placing system. the default 'track' item will be a craftitem that places rails as needed. this will neither place or change switches nor place vertical rails. - ---all new trackplacer code -local tp={ - tracks={} -} - -function tp.register_tracktype(nnprefix, n_suffix) - tp.tracks[nnprefix]={ - default=n_suffix, - single_conn={}, - double_conn={}, - --keys:conn1_conn2 (example:1_4) - --values:{name=x, param2=x} - twcycle={}, - twrotate={},--indexed by suffix, list, tells order of rotations - modify={} - } -end -function tp.add_double_conn(nnprefix, suffix, rotation, conns) - local nodename=nnprefix.."_"..suffix..rotation - for i=0,3 do - tp.tracks[nnprefix].double_conn[((conns.conn1+4*i)%16).."_"..((conns.conn2+4*i)%16)]={name=nodename, param2=i} - tp.tracks[nnprefix].double_conn[((conns.conn2+4*i)%16).."_"..((conns.conn1+4*i)%16)]={name=nodename, param2=i} - end - tp.tracks[nnprefix].modify[nodename]=true -end -function tp.add_single_conn(nnprefix, suffix, rotation, conns) - local nodename=nnprefix.."_"..suffix..rotation - for i=0,3 do - tp.tracks[nnprefix].single_conn[((conns.conn1+4*i)%16)]={name=nodename, param2=i} - tp.tracks[nnprefix].single_conn[((conns.conn2+4*i)%16)]={name=nodename, param2=i} - end - tp.tracks[nnprefix].modify[nodename]=true -end - -function tp.add_worked(nnprefix, suffix, rotation, cycle_follows) - tp.tracks[nnprefix].twcycle[suffix]=cycle_follows - if not tp.tracks[nnprefix].twrotate[suffix] then tp.tracks[nnprefix].twrotate[suffix]={} end - table.insert(tp.tracks[nnprefix].twrotate[suffix], rotation) -end - - ---[[ - rewrite algorithm. - selection criteria: these will never be changed or even selected: - - tracks being already connected on both sides - - tracks that are already connected on one side but are not bendable to the desired position - the following situations can occur: - 1. there are two more than two rails around - 1.1 there is one or more subset(s) that can be directly connected - -> choose the first possibility - 2.2 not - -> choose the first one and orient straight - 2. there's exactly 1 rail around - -> choose and orient straight - 3. there's no rail around - -> set straight -]] -function tp.find_already_connected(pos)--TODO vertical calculations(check node below) - local function istrackandbc(pos, conn) - local cnode=minetest.get_node(advtrains.dirCoordSet(pos, conn)) - local bconn=(conn+8)%16 - if advtrains.is_track_and_drives_on(cnode.name, advtrains.all_tracktypes) then - local cconn1, cconn2=advtrains.get_track_connections(cnode.name, cnode.param2) - return cconn1==bconn or cconn2==bconn - end - return false - end - local dnode=minetest.get_node(pos) - local dconn1, dconn2=advtrains.get_track_connections(dnode.name, dnode.param2) - local t={[true]="true", [false]="false"} - if istrackandbc(pos, dconn1) and istrackandbc(pos, dconn2) then return dconn1, dconn2 - elseif istrackandbc(pos, dconn1) then return dconn1 - elseif istrackandbc(pos, dconn2) then return dconn2 - end - return nil -end -function tp.rail_and_can_be_bent(originpos, conn, nnpref) - local pos=advtrains.dirCoordSet(originpos, conn) - local newdir=(conn+8)%16 - local node=minetest.get_node(pos) - local tr=tp.tracks[nnpref] - if not advtrains.is_track_and_drives_on(node.name, advtrains.all_tracktypes) then - return false - end - --rail at other end? - local adj1, adj2=tp.find_already_connected(pos) - if adj1 and adj2 then - return false--dont destroy existing track - elseif adj1 and not adj2 then - if tr.double_conn[adj1.."_"..newdir] then - return true--if exists, connect new rail and old end - end - return false - else - if tr.single_conn[newdir] then--just rotate old rail to right orientation - return true - end - return false - end -end -function tp.bend_rail(originpos, conn, nnpref) - local pos=advtrains.dirCoordSet(originpos, conn) - local newdir=(conn+8)%16 - local node=minetest.get_node(pos) - local tr=tp.tracks[nnpref] - --is rail already connected? no need to bend. - local conn1, conn2=advtrains.get_track_connections(node.name, node.param2) - if newdir==conn1 or newdir==conn2 then - return - end - --rail at other end? - local adj1, adj2=tp.find_already_connected(pos) - if adj1 and adj2 then - return false--dont destroy existing track - elseif adj1 and not adj2 then - if tr.double_conn[adj1.."_"..newdir] then - minetest.set_node(pos, tr.double_conn[adj1.."_"..newdir]) - return true--if exists, connect new rail and old end - end - return false - else - if tr.single_conn[newdir] then--just rotate old rail to right orientation - minetest.set_node(pos, tr.single_conn[newdir]) - return true - end - return false - end -end -function tp.placetrack(pos, nnpref) - --1. find all rails that are likely to be connected - local tr=tp.tracks[nnpref] - local p_rails={} - for i=0,15 do - if tp.rail_and_can_be_bent(pos, i, nnpref) then - p_rails[#p_rails+1]=i - end - end - if #p_rails==0 then - minetest.set_node(pos, {name=nnpref.."_"..tr.default}) - elseif #p_rails==1 then - tp.bend_rail(pos, p_rails[1], nnpref) - minetest.set_node(pos, tr.single_conn[p_rails[1]]) - else - --iterate subsets - for k1, conn1 in ipairs(p_rails) do - for k2, conn2 in ipairs(p_rails) do - if k1~=k2 then - if (tr.double_conn[conn1.."_"..conn2]) then - tp.bend_rail(pos, conn1, nnpref) - tp.bend_rail(pos, conn2, nnpref) - minetest.set_node(pos, tr.double_conn[conn1.."_"..conn2]) - return - end - end - end - end - --not found - tp.bend_rail(pos, p_rails[1], nnpref) - minetest.set_node(pos, tr.single_conn[p_rails[1]]) - end -end - - -function tp.register_track_placer(nnprefix, imgprefix, dispname) - minetest.register_craftitem(nnprefix.."_placer",{ - description = dispname, - inventory_image = imgprefix.."_placer.png", - wield_image = imgprefix.."_placer.png", - groups={}, - on_place = function(itemstack, placer, pointed_thing) - local name = placer:get_player_name() - if not name then - return itemstack - end - if pointed_thing.type=="node" then - local pos=pointed_thing.above - local upos=pointed_thing.under - if minetest.is_protected(pos,name) and minetest.is_protected(upos,name) then - return itemstack - end - if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to - and minetest.registered_nodes[minetest.get_node(upos).name] and minetest.registered_nodes[minetest.get_node(upos).name].walkable then - tp.placetrack(pos, nnprefix) - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - end - end - return itemstack - end, - }) -end - - - -minetest.register_craftitem("advtrains:trackworker",{ - description = "Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate rail/bumper/signal/etc.", - groups = {cracky=1}, -- key=name, value=rating; rating=1..3. - inventory_image = "advtrains_trackworker.png", - wield_image = "advtrains_trackworker.png", - stack_max = 1, - on_place = function(itemstack, placer, pointed_thing) - local name = placer:get_player_name() - if not name then - return - end - if pointed_thing.type=="node" then - local pos=pointed_thing.under - if minetest.is_protected(pos, name) then - return - end - local node=minetest.get_node(pos) - - --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end - if advtrains.is_train_at_pos(pos) then return end - - local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$") - --print(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) - if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then - nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") - rotation = "" - if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then - minetest.chat_send_player(placer:get_player_name(), "This node can't be rotated using the trackworker!") - return - end - end - local modext=tp.tracks[nnprefix].twrotate[suffix] - - if rotation==modext[#modext] then --increase param2 - minetest.set_node(pos, {name=nnprefix.."_"..suffix..modext[1], param2=(node.param2+1)%4}) - return - else - local modpos - for k,v in pairs(modext) do if v==rotation then modpos=k end end - if not modpos then - minetest.chat_send_player(placer:get_player_name(), "This node can't be rotated using the trackworker!") - return - end - minetest.set_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2}) - end - advtrains.invalidate_all_paths() - end - end, - on_use=function(itemstack, user, pointed_thing) - local name = user:get_player_name() - if not name then - return - end - if pointed_thing.type=="node" then - local pos=pointed_thing.under - local node=minetest.get_node(pos) - if minetest.is_protected(pos, name) then - return - end - - --if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end - if advtrains.is_train_at_pos(pos) then return end - local nnprefix, suffix, rotation=string.match(node.name, "^(.+)_([^_]+)(_[^_]+)$") - --print(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) - if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then - nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") - rotation = "" - if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then - minetest.chat_send_player(user:get_player_name(), "This node can't be changed using the trackworker!") - return - end - end - local nextsuffix=tp.tracks[nnprefix].twcycle[suffix] - minetest.set_node(pos, {name=nnprefix.."_"..nextsuffix..rotation, param2=node.param2}) - --invalidate trains - advtrains.invalidate_all_paths() - else - print(name, dump(tp.tracks)) - end - end, -}) - ---putting into right place -advtrains.trackplacer=tp diff --git a/tracks.lua b/tracks.lua deleted file mode 100644 index 99dbb27..0000000 --- a/tracks.lua +++ /dev/null @@ -1,693 +0,0 @@ ---advtrains by orwell96, see readme.txt - ---dev-time settings: ---EDIT HERE ---If the old non-model rails on straight tracks should be replaced by the new... ---false: no ---true: yes -advtrains.register_replacement_lbms=false - ---[[TracksDefinition -nodename_prefix -texture_prefix -description -common={} -straight={} -straight45={} -curve={} -curve45={} -lswitchst={} -lswitchst45={} -rswitchst={} -rswitchst45={} -lswitchcr={} -lswitchcr45={} -rswitchcr={} -rswitchcr45={} -vert1={ - --you'll probably want to override mesh here -} -vert2={ - --you'll probably want to override mesh here -} -]]-- -advtrains.all_tracktypes={} - ---definition preparation -local function conns(c1, c2, r1, r2, rh, rots) return {conn1=c1, conn2=c2, rely1=r1, rely2=r2, railheight=rh} end - -local t_30deg={ - regstep=1, - variant={ - st=conns(0,8), - cr=conns(0,7), - swlst=conns(0,8), - swlcr=conns(0,7), - swrst=conns(0,8), - swrcr=conns(0,9), - vst1=conns(8,0,0,0.5,0.25), - vst2=conns(8,0,0.5,1,0.75), - vst31=conns(8,0,0,0.33,0.16), - vst32=conns(8,0,0.33,0.66,0.5), - vst33=conns(8,0,0.66,1,0.83), - }, - description={ - st="straight", - cr="curve", - swlst="left switch (straight)", - swlcr="left switch (curve)", - swrst="right switch (straight)", - swrcr="right switch (curve)", - vst1="steep uphill 1/2", - vst2="steep uphill 2/2", - vst31="uphill 1/3", - vst32="uphill 2/3", - vst33="uphill 3/3", - }, - switch={ - swlst="swlcr", - swlcr="swlst", - swrst="swrcr", - swrcr="swrst", - }, - switchmc={ - swlst="on", - swlcr="off", - swrst="on", - swrcr="off", - }, - regtp=true, - trackplacer={ - st=true, - cr=true, - }, - tpsingle={ - st=true, - }, - tpdefault="st", - trackworker={ - ["swrcr"]="st", - ["swrst"]="st", - ["st"]="cr", - ["cr"]="swlst", - ["swlcr"]="swrcr", - ["swlst"]="swrst", - }, - regsp=true, - slopenodes={ - vst1=true, vst2=true, - vst31=true, vst32=true, vst33=true, - }, - slopeplacer={ - [2]={"vst1", "vst2"}, - [3]={"vst31", "vst32", "vst33"}, - max=3,--highest entry - }, - slopeplacer_45={ - [2]={"vst1_45", "vst2_45"}, - max=2, - }, - rotation={"", "_30", "_45", "_60"}, - increativeinv={}, -} -local t_30deg_straightonly={ - regstep=1, - variant={ - st=conns(0,8), - }, - description={ - st="straight", - }, - switch={ - }, - switchmc={ - }, - regtp=true, - trackplacer={ - }, - tpsingle={ - }, - tpdefault="st", - trackworker={ - ["st"]="st", - }, - slopenodes={}, - rotation={"", "_30", "_45", "_60"}, - increativeinv={st}, -} -local t_30deg_straightonly_noplacer={ - regstep=1, - variant={ - st=conns(0,8), - }, - description={ - st="straight", - }, - switch={ - }, - switchmc={ - }, - regtp=false, - trackplacer={ - }, - tpsingle={ - }, - tpdefault="st", - trackworker={ - ["st"]="st", - }, - slopenodes={}, - rotation={"", "_30", "_45", "_60"}, - increativeinv={st}, -} -local t_45deg={ - regstep=2, - variant={ - st=conns(0,8), - cr=conns(0,6), - swlst=conns(0,8), - swlcr=conns(0,6), - swrst=conns(0,8), - swrcr=conns(0,10), - vst1=conns(8,0,0,0.5,0.25), - vst2=conns(8,0,0.5,1,0.75), - }, - description={ - st="straight", - cr="curve", - swlst="left switch (straight)", - swlcr="left switch (curve)", - swrst="right switch (straight)", - swrcr="right switch (curve)", - vst1="vertical lower node", - vst2="vertical upper node", - }, - switch={ - swlst="swlcr", - swlcr="swlst", - swrst="swrcr", - swrcr="swrst", - }, - switchmc={ - swlst="on", - swlcr="off", - swrst="on", - swrcr="off", - }, - regtp=true, - trackplacer={ - st=true, - cr=true, - }, - tpsingle={ - st=true, - }, - tpdefault="st", - trackworker={ - ["swrcr"]="st", - ["swrst"]="st", - ["st"]="cr", - ["cr"]="swlst", - ["swlcr"]="swrcr", - ["swlst"]="swrst", - }, - slopenodes={}, - rotation={"", "_45"}, - increativeinv={vst1=true, vst2=true} -} - ---definition format: ([] optional) ---[[{ - nodename_prefix - texture_prefix - [shared_texture] - models_prefix - models_suffix (with dot) - [shared_model] - formats={ - st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2 - (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all) - } - common={} change something on common rail appearance -}]] -function advtrains.register_tracks(tracktype, def, preset) - local function make_switchfunc(suffix_target, mesecon_state) - local switchfunc=function(pos, node) - if advtrains.is_train_at_pos(pos) then return end - minetest.set_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2}) - advtrains.invalidate_all_paths() - advtrains.reset_trackdb_position(pos) - end - return switchfunc, {effector = { - ["action_"..mesecon_state] = switchfunc, - rules=advtrains.meseconrules - }} - end - local function make_overdef(suffix, rotation, conns, switchfunc, mesecontbl, in_creative_inv, drop_slope) - local img_suffix=suffix..rotation - return { - mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix), - tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png")}, - --inventory_image = def.texture_prefix.."_"..img_suffix..".png", - --wield_image = def.texture_prefix.."_"..img_suffix..".png", - description=def.description.."("..preset.description[suffix]..rotation..")", - connect1=conns.conn1, - connect2=conns.conn2, - rely1=conns.rely1 or 0, - rely2=conns.rely2 or 0, - railheight=conns.railheight or 0, - on_rightclick=switchfunc, - groups = { - attached_node=1, - ["advtrains_track_"..tracktype]=1, - dig_immediate=2, - not_in_creative_inventory=(not in_creative_inv and 1 or nil), - not_blocking_trains=1, - }, - mesecons=mesecontbl, - drop = increativeinv and def.nodename_prefix.."_"..suffix..rotation or (drop_slope and def.nodename_prefix.."_slopeplacer" or def.nodename_prefix.."_placer"), - } - end - local function cycle_conns(conns, rotid) - local add=(rotid-1)*preset.regstep - return { - conn1=(conns.conn1+add)%16, - conn2=(conns.conn2+add)%16, - rely1=conns.rely1 or 0, - rely2=conns.rely2 or 0, - railheight=conns.railheight or 0, - } - end - local common_def=advtrains.merge_tables({ - description = def.description, - drawtype = "mesh", - paramtype="light", - paramtype2="facedir", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - rely1=0, - rely2=0, - railheight=0, - drop=def.nodename_prefix.."_placer", - can_dig=function(pos) - return not advtrains.is_train_at_pos(pos) - end, - after_dig_node=function(pos) - advtrains.invalidate_all_paths() - advtrains.reset_trackdb_position(pos) - end, - after_place_node=function(pos) - advtrains.reset_trackdb_position(pos) - end, - }, def.common or {}) - --make trackplacer base def - advtrains.trackplacer.register_tracktype(def.nodename_prefix, preset.tpdefault) - if preset.regtp then - advtrains.trackplacer.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description) - end - if preset.regsp then - advtrains.slope.register_placer(def, preset) - end - for suffix, conns in pairs(preset.variant) do - for rotid, rotation in ipairs(preset.rotation) do - if not def.formats[suffix] or def.formats[suffix][rotid] then - local switchfunc, mesecontbl - if preset.switch[suffix] then - switchfunc, mesecontbl=make_switchfunc(preset.switch[suffix]..rotation, preset.switchmc[suffix]) - end - local adef={} - if def.get_additional_definiton then - adef=def.get_additional_definiton(def, preset, suffix, rotation) - end - - minetest.register_node(def.nodename_prefix.."_"..suffix..rotation, advtrains.merge_tables( - common_def, - make_overdef( - suffix, rotation, - cycle_conns(conns, rotid), - switchfunc, mesecontbl, preset.increativeinv[suffix], preset.slopenodes[suffix] - ), - adef - ) - ) - --trackplacer - if preset.regtp then - if preset.trackplacer[suffix] then - advtrains.trackplacer.add_double_conn(def.nodename_prefix, suffix, rotation, cycle_conns(conns, rotid)) - end - if preset.tpsingle[suffix] then - advtrains.trackplacer.add_single_conn(def.nodename_prefix, suffix, rotation, cycle_conns(conns, rotid)) - end - end - advtrains.trackplacer.add_worked(def.nodename_prefix, suffix, rotation, preset.trackworker[suffix]) - end - end - end - table.insert(advtrains.all_tracktypes, tracktype) -end - - -function advtrains.is_track_and_drives_on(nodename, drives_on) - if not minetest.registered_nodes[nodename] then - return false - end - local nodedef=minetest.registered_nodes[nodename] - for k,v in ipairs(drives_on) do - if nodedef.groups["advtrains_track_"..v] then - return true - end - end - return false -end - -function advtrains.get_track_connections(name, param2) - local nodedef=minetest.registered_nodes[name] - if not nodedef then print("[advtrains] get_track_connections couldn't find nodedef for nodename "..(name or "nil")) return 0, 8, 0, 0, 0 end - local noderot=param2 - if not param2 then noderot=0 end - if noderot > 3 then print("[advtrains] get_track_connections: rail has invaild param2 of "..noderot) noderot=0 end - - return (nodedef.connect1 + 4 * noderot)%16, (nodedef.connect2 + 4 * noderot)%16, nodedef.rely1 or 0, nodedef.rely2 or 0, nodedef.railheight or 0 -end - ---detector code ---holds a table with nodes on which trains are on. - -advtrains.detector = {} -advtrains.detector.on_node = {} -advtrains.detector.on_node_restore = {} ---set if paths were invalidated before. tells trainlogic.lua to call advtrains.detector.finalize_restore() -advtrains.detector.clean_step_before = false - ---when train enters a node, call this ---The entry already being contained in advtrains.detector.on_node_restore will not trigger an on_train_enter event on the node. (when path is reset, this is saved). -function advtrains.detector.enter_node(pos, train_id) - local pts = minetest.pos_to_string(advtrains.round_vector_floor_y(pos)) - --print("enterNode "..pts.." "..train_id) - if not advtrains.detector.on_node[pts] then - advtrains.detector.on_node[pts]=train_id - if advtrains.detector.on_node_restore[pts] then - advtrains.detector.on_node_restore[pts]=nil - else - advtrains.detector.call_enter_callback(advtrains.round_vector_floor_y(pos), train_id) - end - end -end -function advtrains.detector.leave_node(pos, train_id) - local pts = minetest.pos_to_string(advtrains.round_vector_floor_y(pos)) - --print("leaveNode "..pts.." "..train_id) - if advtrains.detector.on_node[pts] then - advtrains.detector.call_leave_callback(advtrains.round_vector_floor_y(pos), train_id) - advtrains.detector.on_node[pts]=nil - end -end ---called immediately before invalidating paths -function advtrains.detector.setup_restore() - --print("setup_restore") - advtrains.detector.on_node_restore = advtrains.detector.on_node - advtrains.detector.on_node = {} -end ---called one step after invalidating paths, when all trains have restored their path and called enter_node for their contents. -function advtrains.detector.finalize_restore() - --print("finalize_restore") - for pts, train_id in pairs(advtrains.detector.on_node_restore) do - --print("called leave callback "..pts.." "..train_id) - advtrains.detector.call_leave_callback(minetest.string_to_pos(pts), train_id) - end - advtrains.detector.on_node_restore = {} -end -function advtrains.detector.call_enter_callback(pos, train_id) - --print("instructed to call enter calback") - - local node = minetest.get_node(pos) --this spares the check if node is nil, it has a name in any case - local mregnode=minetest.registered_nodes[node.name] - if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_enter then - mregnode.advtrains.on_train_enter(pos, train_id) - end -end -function advtrains.detector.call_leave_callback(pos, train_id) - --print("instructed to call leave calback") - - local node = minetest.get_node(pos) --this spares the check if node is nil, it has a name in any case - local mregnode=minetest.registered_nodes[node.name] - if mregnode and mregnode.advtrains and mregnode.advtrains.on_train_leave then - mregnode.advtrains.on_train_leave(pos, train_id) - end -end - --- slope placer. Defined in register_tracks. ---crafted with rail and gravel -local sl={} -function sl.register_placer(def, preset) - minetest.register_craftitem(def.nodename_prefix.."_slopeplacer",{ - description = def.description.." Slope", - inventory_image = def.texture_prefix.."_slopeplacer.png", - wield_image = def.texture_prefix.."_slopeplacer.png", - groups={}, - on_place = sl.create_slopeplacer_on_place(def, preset) - }) -end ---(itemstack, placer, pointed_thing) -function sl.create_slopeplacer_on_place(def, preset) - return function(istack, player, pt) - if not pt.type=="node" then - minetest.chat_send_player(player:get_player_name(), "Can't place: not pointing at node") - return istack - end - local pos=pt.above - if not pos then - minetest.chat_send_player(player:get_player_name(), "Can't place: not pointing at node") - return istack - end - local node=minetest.get_node(pos) - if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then - minetest.chat_send_player(player:get_player_name(), "Can't place: space occupied!") - return istack - end - if minetest.is_protected(pos, player:get_player_name()) then - minetest.chat_send_player(player:get_player_name(), "Can't place: protected position!") - return istack - end - --determine player orientation (only horizontal component) - --get_look_horizontal may not be available - local yaw=player.get_look_horizontal and player:get_look_horizontal() or (player:get_look_yaw() - math.pi/2) - - --rounding unit vectors is a nice way for selecting 1 of 8 directions since sin(30°) is 0.5. - dirvec={x=math.floor(math.sin(-yaw)+0.5), y=0, z=math.floor(math.cos(-yaw)+0.5)} - --translate to direction to look up inside the preset table - local param2, rot45=({ - [-1]={ - [-1]=2, - [0]=3, - [1]=3, - }, - [0]={ - [-1]=2, - [1]=0, - }, - [1]={ - [-1]=1, - [0]=1, - [1]=0, - }, - })[dirvec.x][dirvec.z], dirvec.x~=0 and dirvec.z~=0 - local lookup=preset.slopeplacer - if rot45 then lookup=preset.slopeplacer_45 end - - --go unitvector forward and look how far the next node is - local step=1 - while step<=lookup.max do - local node=minetest.get_node(vector.add(pos, dirvec)) - --next node solid? - if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to or minetest.is_protected(pos, player:get_player_name()) then - --do slopes of this distance exist? - if lookup[step] then - if minetest.setting_getbool("creative_mode") or istack:get_count()>=step then - --start placing - local placenodes=lookup[step] - while step>0 do - minetest.set_node(pos, {name=def.nodename_prefix.."_"..placenodes[step], param2=param2}) - if not minetest.setting_getbool("creative_mode") then - istack:take_item() - end - step=step-1 - pos=vector.subtract(pos, dirvec) - end - else - minetest.chat_send_player(player:get_player_name(), "Can't place: Not enough slope items left ("..step.." required)") - end - else - minetest.chat_send_player(player:get_player_name(), "Can't place: There's no slope of length "..step) - end - return istack - end - step=step+1 - pos=vector.add(pos, dirvec) - end - minetest.chat_send_player(player:get_player_name(), "Can't place: no supporting node at upper end.") - return itemstack - end -end - -advtrains.slope=sl - ---END code, BEGIN definition ---definition format: ([] optional) ---[[{ - nodename_prefix - texture_prefix - [shared_texture] - models_prefix - models_suffix (with dot) - [shared_model] - formats={ - st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2 - (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all) - } - common={} change something on common rail appearance -}]] - -advtrains.register_tracks("regular", { - nodename_prefix="advtrains:track", - texture_prefix="advtrains_track", - shared_model="trackplane.b3d", - description="Deprecated Track", - formats={vst1={}, vst2={}}, -}, t_45deg) - - -advtrains.register_tracks("default", { - nodename_prefix="advtrains:dtrack", - texture_prefix="advtrains_dtrack", - models_prefix="advtrains_dtrack", - models_suffix=".b3d", - shared_texture="advtrains_dtrack_rail.png", - description="Track", - formats={vst1={true, false, true}, vst2={true, false, true}, vst31={true}, vst32={true}, vst33={true}}, -}, t_30deg) - ---bumpers -advtrains.register_tracks("default", { - nodename_prefix="advtrains:dtrack_bumper", - texture_prefix="advtrains_dtrack_bumper", - models_prefix="advtrains_dtrack_bumper", - models_suffix=".b3d", - shared_texture="advtrains_dtrack_rail.png", - description="Bumper", - formats={}, -}, t_30deg_straightonly) ---legacy bumpers -for _,rot in ipairs({"", "_30", "_45", "_60"}) do - minetest.register_alias("advtrains:dtrack_bumper"..rot, "advtrains:dtrack_bumper_st"..rot) -end - -if mesecon then - advtrains.register_tracks("default", { - nodename_prefix="advtrains:dtrack_detector_off", - texture_prefix="advtrains_dtrack_detector", - models_prefix="advtrains_dtrack_detector", - models_suffix=".b3d", - shared_texture="advtrains_dtrack_rail.png", - description="Detector Rail", - formats={}, - get_additional_definiton = function(def, preset, suffix, rotation) - return { - mesecons = { - receptor = { - state = mesecon.state.off, - rules = advtrains.meseconrules - } - }, - advtrains = { - on_train_enter=function(pos, train_id) - minetest.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) - mesecon.receptor_on(pos, advtrains.meseconrules) - end - } - } - end - }, t_30deg_straightonly) - advtrains.register_tracks("default", { - nodename_prefix="advtrains:dtrack_detector_on", - texture_prefix="advtrains_dtrack_detector", - models_prefix="advtrains_dtrack_detector", - models_suffix=".b3d", - shared_texture="advtrains_dtrack_rail_detector_on.png", - description="Detector(on)(you hacker you)", - formats={}, - get_additional_definiton = function(def, preset, suffix, rotation) - return { - mesecons = { - receptor = { - state = mesecon.state.on, - rules = advtrains.meseconrules - } - }, - advtrains = { - on_train_leave=function(pos, train_id) - minetest.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=minetest.get_node(pos).param2}) - mesecon.receptor_off(pos, advtrains.meseconrules) - end - } - } - end - }, t_30deg_straightonly_noplacer) -end ---TODO legacy ---I know lbms are better for this purpose -for name,rep in pairs({swl_st="swlst", swr_st="swrst", swl_cr="swlcr", swr_cr="swrcr", }) do - minetest.register_abm({ - -- In the following two fields, also group:groupname will work. - nodenames = {"advtrains:track_"..name}, - interval = 1.0, -- Operation interval in seconds - chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this - action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep, param2=node.param2}) end, - }) - minetest.register_abm({ - -- In the following two fields, also group:groupname will work. - nodenames = {"advtrains:track_"..name.."_45"}, - interval = 1.0, -- Operation interval in seconds - chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this - action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep.."_45", param2=node.param2}) end, - }) -end - -if advtrains.register_replacement_lbms then -minetest.register_lbm({ - name = "advtrains:ramp_replacement_1", --- In the following two fields, also group:groupname will work. - nodenames = {"advtrains:track_vert1"}, - action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst1", param2=(node.param2+2)%4}) end, -}) -minetest.register_lbm({ - name = "advtrains:ramp_replacement_1", --- -- In the following two fields, also group:groupname will work. - nodenames = {"advtrains:track_vert2"}, - action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst2", param2=(node.param2+2)%4}) end, -}) - minetest.register_abm({ - name = "advtrains:st_rep_1", - -- In the following two fields, also group:groupname will work. - nodenames = {"advtrains:track_st"}, - interval=1, - chance=1, - action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st", param2=node.param2}) end, - }) - minetest.register_lbm({ - name = "advtrains:st_rep_1", - -- -- In the following two fields, also group:groupname will work. - nodenames = {"advtrains:track_st_45"}, - action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st_45", param2=node.param2}) end, - }) -end - - - - - - - - diff --git a/trainhud.lua b/trainhud.lua deleted file mode 100644 index aead246..0000000 --- a/trainhud.lua +++ /dev/null @@ -1,109 +0,0 @@ ---trainhud.lua: holds all the code for train controlling - -advtrains.hud = {} - -minetest.register_on_leaveplayer(function(player) -advtrains.hud[player:get_player_name()] = nil -end) - -local mletter={[1]="F", [-1]="R", [0]="N"} - -function advtrains.on_control_change(pc, train, flip) - if pc.sneak then - if pc.up then - train.tarvelocity = advtrains.all_traintypes[train.traintype].max_speed or 10 - end - if pc.down then - train.tarvelocity = 0 - end - if pc.left then - train.tarvelocity = 4 - end - if pc.right then - train.tarvelocity = 8 - end - if pc.jump then - train.brake = true - --0: released, 1: brake and pressed, 2: released and brake, 3: pressed and brake - if not train.brake_hold_state or train.brake_hold_state==0 then - train.brake_hold_state = 1 - elseif train.brake_hold_state==2 then - train.brake_hold_state = 3 - end - elseif train.brake_hold_state==1 then - train.brake_hold_state = 2 - elseif train.brake_hold_state==3 then - train.brake = false - train.brake_hold_state = 0 - end - --shift+use:see wagons.lua - else - if pc.up then - train.tarvelocity = train.tarvelocity + 1 - end - if pc.down then - if train.velocity>0 then - train.tarvelocity = math.max(train.tarvelocity - 1, 0) - else - train.movedir = -train.movedir - end - end - if train.brake_hold_state~=2 then - train.brake = false - end - if pc.jump then - train.brake = true - end - if pc.aux1 then - --horn - end - end -end -function advtrains.update_driver_hud(pname, train, flip) - advtrains.set_trainhud(pname, advtrains.hud_train_format(train, flip)) -end -function advtrains.clear_driver_hud(pname) - advtrains.set_trainhud(pname, "") -end - -function advtrains.set_trainhud(name, text) - local hud = advtrains.hud[name] - local player=minetest.get_player_by_name(name) - if not player then - return - end - if not hud then - hud = {} - advtrains.hud[name] = hud - hud.id = player:hud_add({ - hud_elem_type = "text", - name = "ADVTRAINS", - number = 0xFFFFFF, - position = {x=0.5, y=0.7}, - offset = {x=0, y=0}, - text = text, - scale = {x=200, y=60}, - alignment = {x=0, y=0}, - }) - hud.oldText=text - return - elseif hud.oldText ~= text then - player:hud_change(hud.id, "text", text) - hud.oldText=text - end -end -function advtrains.hud_train_format(train, flip) - local fct=flip and -1 or 1 - if not train or not train.traintype then return "" end - - local max=advtrains.all_traintypes[train.traintype].max_speed or 10 - local vel=advtrains.abs_ceil(train.velocity) - local tvel=advtrains.abs_ceil(train.tarvelocity) - local topLine, firstLine, secondLine - - topLine=train.traintype.." ["..mletter[fct*train.movedir].."] "..(train.brake and "="..( train.brake_hold_state==2 and "^" or "" ).."B=" or "") - firstLine="Speed: |"..string.rep("+", vel)..string.rep("_", max-vel)..">" - secondLine="Target: |"..string.rep("+", tvel)..string.rep("_", max-tvel)..">" - - return topLine.."\n"..firstLine.."\n"..secondLine -end diff --git a/trainlogic.lua b/trainlogic.lua deleted file mode 100644 index 5e3936f..0000000 --- a/trainlogic.lua +++ /dev/null @@ -1,895 +0,0 @@ ---trainlogic.lua ---controls train entities stuff about connecting/disconnecting/colliding trains and other things - ---local print=function(t, ...) minetest.log("action", table.concat({t, ...}, " ")) minetest.chat_send_all(table.concat({t, ...}, " ")) end -local print=function() end - -local benchmark=false ---printbm=function(str, t) print("[advtrains]"..str.." "..((os.clock()-t)*1000).."ms") end -local bm={} -local bmlt=0 -local bmsteps=0 -local bmstepint=200 -printbm=function(action, ta) - if not benchmark then return end - local t=(os.clock()-ta)*1000 - if not bm[action] then - bm[action]=t - else - bm[action]=bm[action]+t - end - bmlt=bmlt+t -end -function endstep() - if not benchmark then return end - bmsteps=bmsteps-1 - if bmsteps<=0 then - bmsteps=bmstepint - for key, value in pairs(bm) do - minetest.chat_send_all(key.." "..(value/bmstepint).." ms avg.") - end - minetest.chat_send_all("Total time consumed by all advtrains actions per step: "..(bmlt/bmstepint).." ms avg.") - bm={} - bmlt=0 - end -end - ---TODO: these values need to be integrated when i remove traintypes. -advtrains.train_accel_force=2--per second and divided by number of wagons -advtrains.train_brake_force=3--per second, not divided by number of wagons -advtrains.train_roll_force=0.5--per second, not divided by number of wagons, acceleration when rolling without brake -advtrains.train_emerg_force=10--for emergency brakes(when going off track) - -advtrains.audit_interval=30 - -advtrains.all_traintypes={} -function advtrains.register_train_type(name, drives_on, max_speed) - advtrains.all_traintypes[name]={} - advtrains.all_traintypes[name].drives_on=drives_on - advtrains.all_traintypes[name].max_speed=max_speed or 10 -end - - -advtrains.trains={} -advtrains.wagon_save={} - ---load initially -advtrains.fpath=minetest.get_worldpath().."/advtrains" -local file, err = io.open(advtrains.fpath, "r") -if not file then - local er=err or "Unknown Error" - print("[advtrains]Failed loading advtrains save file "..er) -else - local tbl = minetest.deserialize(file:read("*a")) - if type(tbl) == "table" then - advtrains.trains=tbl - end - file:close() -end -advtrains.fpath_ws=minetest.get_worldpath().."/advtrains_wagon_save" -local file, err = io.open(advtrains.fpath_ws, "r") -if not file then - local er=err or "Unknown Error" - print("[advtrains]Failed loading advtrains save file "..er) -else - local tbl = minetest.deserialize(file:read("*a")) - if type(tbl) == "table" then - advtrains.wagon_save=tbl - end - file:close() -end - - -advtrains.save = function() - --print("[advtrains]saving") - advtrains.invalidate_all_paths() - local datastr = minetest.serialize(advtrains.trains) - if not datastr then - minetest.log("error", "[advtrains] Failed to serialize train data!") - return - end - local file, err = io.open(advtrains.fpath, "w") - if err then - return err - end - file:write(datastr) - file:close() - - -- update wagon saves - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized then - wagon:get_staticdata() - end - end - --cross out userdata - for w_id, data in pairs(advtrains.wagon_save) do - data.name=nil - data.object=nil - if data.driver then - data.driver_name=data.driver:get_player_name() - data.driver=nil - else - data.driver_name=nil - end - if data.discouple then - data.discouple.object:remove() - data.discouple=nil - end - end - --print(dump(advtrains.wagon_save)) - datastr = minetest.serialize(advtrains.wagon_save) - if not datastr then - minetest.log("error", "[advtrains] Failed to serialize train data!") - return - end - file, err = io.open(advtrains.fpath_ws, "w") - if err then - return err - end - file:write(datastr) - file:close() - - advtrains.save_trackdb() -end -minetest.register_on_shutdown(advtrains.save) - -advtrains.save_and_audit_timer=advtrains.audit_interval -minetest.register_globalstep(function(dtime) - advtrains.save_and_audit_timer=advtrains.save_and_audit_timer-dtime - if advtrains.save_and_audit_timer<=0 then - local t=os.clock() - --print("[advtrains] audit step") - --clean up orphaned trains - for k,v in pairs(advtrains.trains) do - --advtrains.update_trainpart_properties(k) - if #v.trainparts==0 then - print("[advtrains][train "..k.."] has empty trainparts, removing.") - advtrains.trains[k]=nil - end - end - --save - advtrains.save() - advtrains.save_and_audit_timer=advtrains.audit_interval - printbm("saving", t) - end - --regular train step - local t=os.clock() - for k,v in pairs(advtrains.trains) do - advtrains.train_step(k, v, dtime) - end - - --see tracks.lua - if advtrains.detector.clean_step_before then - advtrains.detector.finalize_restore() - end - - printbm("trainsteps", t) - endstep() -end) - -function advtrains.train_step(id, train, dtime) - - --TODO check for all vars to be present - if not train.velocity then - train.velocity=0 - end - if not train.movedir or (train.movedir~=1 and train.movedir~=-1) then - train.movedir=1 - end - --very unimportant thing: check if couple is here - if train.couple_eid_front and (not minetest.luaentities[train.couple_eid_front] or not minetest.luaentities[train.couple_eid_front].is_couple) then train.couple_eid_front=nil end - if train.couple_eid_back and (not minetest.luaentities[train.couple_eid_back] or not minetest.luaentities[train.couple_eid_back].is_couple) then train.couple_eid_back=nil end - - --skip certain things (esp. collision) when not moving - local train_moves=(train.velocity~=0) - - --if not train.last_pos then advtrains.trains[id]=nil return end - - if not advtrains.pathpredict(id, train) then - print("pathpredict failed(returned false)") - train.velocity=0 - train.tarvelocity=0 - return - end - - local path=advtrains.get_or_create_path(id, train) - if not path then - train.velocity=0 - train.tarvelocity=0 - print("train has no path for whatever reason") - return - end - - local train_end_index=advtrains.get_train_end_index(train) - --apply off-track handling: - local front_off_track=train.max_index_on_track and train.index>train.max_index_on_track - local back_off_track=train.min_index_on_track and train_end_index1 then train.tarvelocity=1 end - elseif front_off_track then--allow movement only backward - if train.movedir==1 and train.tarvelocity>0 then train.tarvelocity=0 end - if train.movedir==-1 and train.tarvelocity>1 then train.tarvelocity=1 end - elseif back_off_track then--allow movement only forward - if train.movedir==-1 and train.tarvelocity>0 then train.tarvelocity=0 end - if train.movedir==1 and train.tarvelocity>1 then train.tarvelocity=1 end - end - - --update advtrains.detector - if not train.detector_old_index then - train.detector_old_index = math.floor(train_end_index) - train.detector_old_end_index = math.floor(train_end_index) - end - local ifo, ifn, ibo, ibn = train.detector_old_index, math.floor(train.index), train.detector_old_end_index, math.floor(train_end_index) - if ifn>ifo then - for i=ifo, ifn do - if path[i] then - advtrains.detector.enter_node(path[i], id) - end - end - elseif ifnibo then - for i=ibo, ibn do - if path[i] then - advtrains.detector.leave_node(path[i], id) - end - end - end - train.detector_old_index = math.floor(train.index) - train.detector_old_end_index = math.floor(train_end_index) - - if train_moves then - --check for collisions by finding objects - --front - local search_radius=4 - - --coupling - local couple_outward=1 - local posfront=advtrains.get_real_index_position(path, train.index+couple_outward) - local posback=advtrains.get_real_index_position(path, train_end_index-couple_outward) - for _,pos in ipairs({posfront, posback}) do - if pos then - local objrefs=minetest.get_objects_inside_radius(pos, search_radius) - for _,v in pairs(objrefs) do - local le=v:get_luaentity() - if le and le.is_wagon and le.initialized and le.train_id~=id then - advtrains.try_connect_trains(id, le.train_id) - end - end - end - end - --heh, new collision again. - --this time, based on NODES and the advtrains.detector.on_node table. - local collpos - local coll_grace=1 - if train.movedir==1 then - collpos=advtrains.get_real_index_position(path, train.index-coll_grace) - else - collpos=advtrains.get_real_index_position(path, train_end_index+coll_grace) - end - if collpos then - local rcollpos=advtrains.round_vector_floor_y(collpos) - for x=-1,1 do - for z=-1,1 do - local testpts=minetest.pos_to_string(vector.add(rcollpos, {x=x, y=0, z=z})) - if advtrains.detector.on_node[testpts] and advtrains.detector.on_node[testpts]~=id then - --collides - train.recently_collided_with_env=true - train.velocity=0.5*train.velocity - train.movedir=train.movedir*-1 - train.tarvelocity=0 - end - end - end - end - end - --check for any trainpart entities if they have been unloaded. do this only if train is near a player, to not spawn entities into unloaded areas - train.check_trainpartload=(train.check_trainpartload or 0)-dtime - local node_range=(math.max((minetest.setting_get("active_block_range") or 0),1)*16) - if train.check_trainpartload<=0 then - local ori_pos=advtrains.get_real_index_position(path, train.index) --not much to calculate - print("[advtrains][train "..id.."] at "..minetest.pos_to_string(vector.round(ori_pos))) - - local should_check=false - for _,p in ipairs(minetest.get_connected_players()) do - should_check=should_check or ((vector.distance(ori_pos, p:getpos())0 then--accelerating, force will be brought on only by locomotives. - --print("accelerating with default force") - applydiff=(math.min((advtrains.train_accel_force*train.locomotives_in_train*dtime)/mass, math.abs(diff))) - else--decelerating - if front_off_track or back_off_track or train.recently_collided_with_env then --every wagon has a brake, so not divided by mass. - --print("braking with emergency force") - applydiff= -(math.min((advtrains.train_emerg_force*dtime), math.abs(diff))) - elseif train.brake then - --print("braking with default force") - --no math.min, because it can grow beyond tarvelocity, see up there - --dont worry, it will never fall below zero. - applydiff= -((advtrains.train_brake_force*dtime)) - else - --print("roll") - applydiff= -(math.min((advtrains.train_roll_force*dtime), math.abs(diff))) - end - end - train.last_accel=(applydiff*train.movedir) - train.velocity=math.min(math.max( train.velocity+applydiff , 0), advtrains.all_traintypes[train.traintype].max_speed) - else - train.last_accel=0 - end - - --move - --TODO 3,5 + 0.7 - train.index=train.index and train.index+(((train.velocity*train.movedir)/(train.path_dist[math.floor(train.index)] or 1))*dtime) or 0 - -end - - ---structure of train table: ---[[ -trains={ - [train_id]={ - trainparts={ - [n]=wagon_id - } - path={path} - velocity - tarvelocity - index - trainlen - path_inv_level - last_pos | - last_dir | for pathpredicting. - } -} ---a wagon itself has the following properties: -wagon={ - unique_id - train_id - pos_in_train (is index difference, including train_span stuff) - pos_in_trainparts (is index in trainparts tabel of trains) -} -inherited by metatable: -wagon_proto={ - wagon_span -} -]] - ---returns new id -function advtrains.create_new_train_at(pos, pos_prev, traintype) - local newtrain_id=os.time()..os.clock() - while advtrains.trains[newtrain_id] do newtrain_id=os.time()..os.clock() end--ensure uniqueness(will be unneccessary) - - advtrains.trains[newtrain_id]={} - advtrains.trains[newtrain_id].last_pos=pos - advtrains.trains[newtrain_id].last_pos_prev=pos_prev - advtrains.trains[newtrain_id].traintype=traintype - advtrains.trains[newtrain_id].tarvelocity=0 - advtrains.trains[newtrain_id].velocity=0 - advtrains.trains[newtrain_id].trainparts={} - return newtrain_id -end - ---returns false on failure. handle this case! -function advtrains.pathpredict(id, train) - - --print("pos ",x,y,z) - --::rerun:: - if not train.index then train.index=0 end - if not train.path or #train.path<2 then - if not train.last_pos then - --no chance to recover - print("[advtrains]train hasn't saved last-pos, removing train.") - advtrains.train[id]=nil - return false - end - - local node_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(train.last_pos), train.traintype) - - if node_ok==nil then - --block not loaded, do nothing - return nil - elseif node_ok==false then - print("[advtrains]no track here, (fail) removing train.") - advtrains.trains[id]=nil - return false - end - - if not train.last_pos_prev then - --no chance to recover - print("[advtrains]train hasn't saved last-pos_prev, removing train.") - advtrains.trains[id]=nil - return false - end - - local prevnode_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(train.last_pos_prev), train.traintype) - - if prevnode_ok==nil then - --block not loaded, do nothing - return nil - elseif prevnode_ok==false then - print("[advtrains]no track at prev, (fail) removing train.") - advtrains.trains[id]=nil - return false - end - - train.index=(train.restore_add_index or 0)+(train.savedpos_off_track_index_offset or 0) - --restore_add_index is set by save() to prevent trains hopping to next round index. should be between -0.5 and 0.5 - --savedpos_off_track_index_offset is set if train went off track. see below. - train.path={} - train.path_dist={} - train.path[0]=train.last_pos - train.path[-1]=train.last_pos_prev - train.path_dist[-1]=vector.distance(train.last_pos, train.last_pos_prev) - end - - local pregen_front=2 - local pregen_back=2 - if train.velocity>0 then - if train.movedir>0 then - pregen_front=2+math.ceil(train.velocity*0.15) --assumes server step of 0.1 seconds, +50% tolerance - else - pregen_back=2+math.ceil(train.velocity*0.15) - end - end - - - local maxn=advtrains.maxN(train.path) - while (maxn-train.index) < pregen_front do--pregenerate - --print("[advtrains]maxn conway for ",maxn,minetest.pos_to_string(path[maxn]),maxn-1,minetest.pos_to_string(path[maxn-1])) - local conway=advtrains.conway(train.path[maxn], train.path[maxn-1], train.traintype) - if conway then - train.path[maxn+1]=conway - train.max_index_on_track=maxn - else - --do as if nothing has happened and preceed with path - --but do not update max_index_on_track - --print("over-generating path max to index "..maxn+1) - train.path[maxn+1]=vector.add(train.path[maxn], vector.subtract(train.path[maxn], train.path[maxn-1])) - end - train.path_dist[maxn]=vector.distance(train.path[maxn+1], train.path[maxn]) - maxn=advtrains.maxN(train.path) - end - - local minn=advtrains.minN(train.path) - while (train.index-minn) < (train.trainlen or 0) + pregen_back do --post_generate. has to be at least trainlen. (we let go of the exact calculation here since this would be unuseful here) - --print("[advtrains]minn conway for ",minn,minetest.pos_to_string(path[minn]),minn+1,minetest.pos_to_string(path[minn+1])) - local conway=advtrains.conway(train.path[minn], train.path[minn+1], train.traintype) - if conway then - train.path[minn-1]=conway - train.min_index_on_track=minn - else - --do as if nothing has happened and preceed with path - --but do not update min_index_on_track - --print("over-generating path min to index "..minn-1) - train.path[minn-1]=vector.add(train.path[minn], vector.subtract(train.path[minn], train.path[minn+1])) - end - train.path_dist[minn-1]=vector.distance(train.path[minn], train.path[minn-1]) - minn=advtrains.minN(train.path) - end - if not train.min_index_on_track then train.min_index_on_track=0 end - if not train.max_index_on_track then train.max_index_on_track=0 end - - --make pos/yaw available for possible recover calls - if train.max_index_on_tracktrain.index then --whoops, train went even more far. same behavior - train.savedpos_off_track_index_offset=train.index-train.min_index_on_track - train.last_pos=train.path[train.min_index_on_track+1] - train.last_pos_prev=train.path[train.min_index_on_track] - --print("train is off-track (back), last positions kept at "..minetest.pos_to_string(train.last_pos).." / "..minetest.pos_to_string(train.last_pos_prev)) - else --regular case - train.savedpos_off_track_index_offset=nil - train.last_pos=train.path[math.floor(train.index+0.5)] - train.last_pos_prev=train.path[math.floor(train.index-0.5)] - end - return train.path -end -function advtrains.get_train_end_index(train) - return advtrains.get_real_path_index(train, train.trainlen or 2)--this function can be found inside wagons.lua since it's more related to wagons. we just set trainlen as pos_in_train -end - -function advtrains.get_or_create_path(id, train) - if not train.path then return advtrains.pathpredict(id, train) end - return train.path -end - -function advtrains.add_wagon_to_train(wagon, train_id, index) - local train=advtrains.trains[train_id] - if index then - table.insert(train.trainparts, index, wagon.unique_id) - else - table.insert(train.trainparts, wagon.unique_id) - end - --this is not the usual case!!! - --we may set initialized because the wagon has no chance to step() - wagon.initialized=true - --TODO is this art or can we throw it away? - advtrains.update_trainpart_properties(train_id) -end -function advtrains.update_trainpart_properties(train_id, invert_flipstate) - local train=advtrains.trains[train_id] - local rel_pos=0 - local count_l=0 - for i, w_id in ipairs(train.trainparts) do - local any_loaded=false - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.unique_id==w_id then - rel_pos=rel_pos+wagon.wagon_span - wagon.train_id=train_id - wagon.pos_in_train=rel_pos - wagon.pos_in_trainparts=i - wagon.old_velocity_vector=nil - if wagon.is_locomotive then - count_l=count_l+1 - end - if invert_flipstate then - wagon.wagon_flipped = not wagon.wagon_flipped - end - rel_pos=rel_pos+wagon.wagon_span - any_loaded=true - end - end - if not any_loaded then - print("update_trainpart_properties wagon "..w_id.." not loaded, ignoring it.") - end - end - train.trainlen=rel_pos - train.locomotives_in_train=count_l -end - -function advtrains.split_train_at_wagon(wagon) - --get train - local train=advtrains.trains[wagon.train_id] - local real_pos_in_train=advtrains.get_real_path_index(train, wagon.pos_in_train) - local pos_for_new_train=advtrains.get_or_create_path(wagon.train_id, train)[math.floor(real_pos_in_train+wagon.wagon_span)] - local pos_for_new_train_prev=advtrains.get_or_create_path(wagon.train_id, train)[math.floor(real_pos_in_train-1+wagon.wagon_span)] - - --before doing anything, check if both are rails. else do not allow - if not pos_for_new_train then - print("split_train: pos_for_new_train not set") - return false - end - local node_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(pos_for_new_train), train.traintype) - if not node_ok then - print("split_train: pos_for_new_train "..minetest.pos_to_string(advtrains.round_vector_floor_y(pos_for_new_train_prev)).." not loaded or is not a rail") - return false - end - - if not train.last_pos_prev then - print("split_train: pos_for_new_train_prev not set") - return false - end - - local prevnode_ok=advtrains.get_rail_info_at(advtrains.round_vector_floor_y(pos_for_new_train), train.traintype) - if not prevnode_ok then - print("split_train: pos_for_new_train_prev "..minetest.pos_to_string(advtrains.round_vector_floor_y(pos_for_new_train_prev)).." not loaded or is not a rail") - return false - end - - --create subtrain - local newtrain_id=advtrains.create_new_train_at(pos_for_new_train, pos_for_new_train_prev, train.traintype) - local newtrain=advtrains.trains[newtrain_id] - --insert all wagons to new train - for k,v in ipairs(train.trainparts) do - if k>=wagon.pos_in_trainparts then - table.insert(newtrain.trainparts, v) - train.trainparts[k]=nil - end - end - --update train parts - advtrains.update_trainpart_properties(wagon.train_id)--atm it still is the desierd id. - advtrains.update_trainpart_properties(newtrain_id) - train.tarvelocity=0 - newtrain.velocity=train.velocity - newtrain.tarvelocity=0 -end - ---there are 4 cases: ---1/2. F<->R F<->R regular, put second train behind first ---->frontpos of first train will match backpos of second ---3. F<->R R<->F flip one of these trains, take the other as new train ---->backpos's will match ---4. R<->F F<->R flip one of these trains and take it as new parent ---->frontpos's will match -function advtrains.try_connect_trains(id1, id2) - local train1=advtrains.trains[id1] - local train2=advtrains.trains[id2] - if not train1 or not train2 then return end - if not train1.path or not train2.path then return end - if #train1.trainparts==0 or #train2.trainparts==0 then return end - - local frontpos1=advtrains.get_real_index_position(train1.path, train1.index) - local backpos1=advtrains.get_real_index_position(train1.path, advtrains.get_train_end_index(train1)) - --couple logic - if train1.traintype==train2.traintype then - local frontpos2=advtrains.get_real_index_position(train2.path, train2.index) - local backpos2=advtrains.get_real_index_position(train2.path, advtrains.get_train_end_index(train2)) - - if not frontpos1 or not frontpos2 or not backpos1 or not backpos2 then return end - - local couple_spawnradius=0.7 - --case 1 (first train is front) - if vector.distance(frontpos2, backpos1)1 then - if gp.velocity==0 then - if not self.discouple or not self.discouple.object:getyaw() then - local object=minetest.add_entity(pos, "advtrains:discouple") - if object then - local le=object:get_luaentity() - le.wagon=self - --box is hidden when attached, so unuseful. - --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) - self.discouple=le - else - print("Couldn't spawn DisCouple") - end - end - else - if self.discouple and self.discouple.object:getyaw() then - self.discouple.object:remove() - end - end - end - --for path to be available. if not, skip step - if not advtrains.get_or_create_path(self.train_id, gp) then - self.object:setvelocity({x=0, y=0, z=0}) - return - end - if not self.pos_in_train then - --why ever. but better continue next step... - advtrains.update_trainpart_properties(self.train_id) - return - end - - local index=advtrains.get_real_path_index(self:train(), self.pos_in_train) - --print("trainindex "..gp.index.." wagonindex "..index) - - --position recalculation - local first_pos=gp.path[math.floor(index)] - local second_pos=gp.path[math.floor(index)+1] - if not first_pos or not second_pos then - --print("[advtrains] object "..self.unique_id.." path end reached!") - self.object:setvelocity({x=0,y=0,z=0}) - return - end - - --checking for environment collisions(a 3x3 cube around the center) - if not gp.recently_collided_with_env then - local collides=false - for x=-1,1 do - for y=0,2 do - for z=-1,1 do - local node=minetest.get_node_or_nil(vector.add(first_pos, {x=x, y=y, z=z})) - if (advtrains.train_collides(node)) then - collides=true - end - end - end - end - if collides then - gp.recently_collided_with_env=true - gp.velocity=-0.5*gp.velocity - gp.tarvelocity=0 - end - end - - --FIX: use index of the wagon, not of the train. - local velocity=(gp.velocity*gp.movedir)/(gp.path_dist[math.floor(index)] or 1) - local acceleration=(gp.last_accel or 0)/(gp.path_dist[math.floor(index)] or 1) - local factor=index-math.floor(index) - local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,} - local velocityvec={x=(first_pos.x-second_pos.x)*velocity*-1, z=(first_pos.z-second_pos.z)*velocity*-1, y=(first_pos.y-second_pos.y)*velocity*-1} - local accelerationvec={x=(first_pos.x-second_pos.x)*acceleration*-1, z=(first_pos.z-second_pos.z)*acceleration*-1, y=(first_pos.y-second_pos.y)*acceleration*-1} - - --some additional positions to determine orientation - local aposfwd=gp.path[math.floor(index+2)] - local aposbwd=gp.path[math.floor(index-1)] - - local yaw - if aposfwd and aposbwd then - yaw=advtrains.get_wagon_yaw(aposfwd, second_pos, first_pos, aposbwd, factor)+math.pi--TODO remove when cleaning up - else - yaw=math.atan2((first_pos.x-second_pos.x), (second_pos.z-first_pos.z)) - end - if self.wagon_flipped then - yaw=yaw+math.pi - end - - self.updatepct_timer=(self.updatepct_timer or 0)-dtime - if not self.old_velocity_vector - or not vector.equals(velocityvec, self.old_velocity_vector) - or not self.old_acceleration_vector - or not vector.equals(accelerationvec, self.old_acceleration_vector) - or self.old_yaw~=yaw - or self.updatepct_timer<=0 then--only send update packet if something changed - self.object:setpos(actual_pos) - self.object:setvelocity(velocityvec) - self.object:setacceleration(accelerationvec) - self.object:setyaw(yaw) - self.updatepct_timer=2 - if self.update_animation then - self:update_animation(gp.velocity) - end - end - - - self.old_velocity_vector=velocityvec - self.old_acceleration_vector=accelerationvec - self.old_yaw=yaw - printbm("wagon step", t) -end - -function advtrains.get_real_path_index(train, pit) - local pos_in_train_left=pit - local index=train.index - if pos_in_train_left>(index-math.floor(index))*(train.path_dist[math.floor(index)] or 1) then - pos_in_train_left=pos_in_train_left - (index-math.floor(index))*(train.path_dist[math.floor(index)] or 1) - index=math.floor(index) - while pos_in_train_left>(train.path_dist[index-1] or 1) do - pos_in_train_left=pos_in_train_left - (train.path_dist[index-1] or 1) - index=index-1 - end - index=index-(pos_in_train_left/(train.path_dist[index-1] or 1)) - else - index=index-(pos_in_train_left/(train.path_dist[math.floor(index-1)] or 1)) - end - return index -end - -function wagon:get_on(clicker, seatno) - if not self.seatp then - self.seatp={} - end - if not self.seats[seatno] then return end - if self.seatp[seatno] and self.seatp[seatno]~=clicker:get_player_name() then - self:get_off(seatno) - end - self.seatp[seatno] = clicker:get_player_name() - advtrains.player_to_train_mapping[clicker:get_player_name()]=self.train_id - clicker:set_attach(self.object, "", self.seats[seatno].attach_offset, {x=0,y=0,z=0}) - clicker:set_eye_offset(self.seats[seatno].view_offset, self.seats[seatno].view_offset) -end -function wagon:get_off_plr(pname) - local no=self:get_seatno(pname) - if no then - self:get_off(no) - end -end -function wagon:get_seatno(pname) - for no, cont in pairs(self.seatp) do - if cont==pname then - return no - end - end - return nil -end -function wagon:get_off(seatno) - if not self.seatp[seatno] then return end - local pname = self.seatp[seatno] - local clicker = minetest.get_player_by_name(pname) - advtrains.player_to_train_mapping[pname]=nil - advtrains.clear_driver_hud(pname) - if clicker then - clicker:set_detach() - clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) - local objpos=advtrains.round_vector_floor_y(self.object:getpos()) - local yaw=self.object:getyaw() - local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4) - --abuse helper function - for _,r in ipairs({-1, 1}) do - local p=vector.add({x=isx and r or 0, y=0, z=not isx and r or 0}, objpos) - if minetest.get_item_group(minetest.get_node(p).name, "platform")>0 then - minetest.after(0.2, function() clicker:setpos({x=p.x, y=p.y+1, z=p.z}) end) - end - end - end - self.seatp[seatno]=nil -end -function wagon:show_get_on_form(pname) - if not self.initialized then return end - if #self.seats==0 then - if self.has_inventory and self.get_inventory_formspec then - minetest.show_formspec(pname, "advtrains_inv_"..self.unique_id, self:get_inventory_formspec()) - end - return - end - local form, comma="size[5,8]label[0.5,0.5;Select seat:]textlist[0.5,1;4,6;seat;", "" - for seatno, seattbl in ipairs(self.seats) do - local addtext, colorcode="", "" - if self.seatp and self.seatp[seatno] then - colorcode="#FF0000" - addtext=" ("..self.seatp[seatno]..")" - end - form=form..comma..colorcode..seattbl.name..addtext - comma="," - end - form=form..";0,false]" - if self.has_inventory and self.get_inventory_formspec then - form=form.."button_exit[1,7;3,1;inv;Show Inventory]" - end - minetest.show_formspec(pname, "advtrains_geton_"..self.unique_id, form) -end -minetest.register_on_player_receive_fields(function(player, formname, fields) - local uid=string.match(formname, "^advtrains_geton_(.+)$") - if uid then - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized and wagon.unique_id==uid then - if fields.inv then - if wagon.has_inventory and wagon.get_inventory_formspec then - minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec()) - end - elseif fields.seat then - local val=minetest.explode_textlist_event(fields.seat) - if val and val.type~="INV" then - --get on - wagon:get_on(player, val.index) - --will work with the new close_formspec functionality. close exactly this formspec. - minetest.show_formspec(player:get_player_name(), formname, "") - end - end - end - end - end -end) -function wagon:reattach_all() - if not self.seatp then self.seatp={} end - for seatno, pname in pairs(self.seatp) do - local p=minetest.get_player_by_name(pname) - if p then - self:get_on(p ,seatno) - end - end -end -minetest.register_on_joinplayer(function(player) - for _,wagon in pairs(minetest.luaentities) do - if wagon.is_wagon and wagon.initialized then - wagon:reattach_all() - end - end -end) - -function advtrains.register_wagon(sysname, traintype, prototype, desc, inv_img) - setmetatable(prototype, {__index=wagon}) - minetest.register_entity("advtrains:"..sysname,prototype) - - minetest.register_craftitem("advtrains:"..sysname, { - description = desc, - inventory_image = inv_img, - wield_image = inv_img, - stack_max = 1, - - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then - return - end - - local node=minetest.env:get_node_or_nil(pointed_thing.under) - if not node then print("[advtrains]Ignore at placer position") return itemstack end - local nodename=node.name - if(not advtrains.is_track_and_drives_on(nodename, advtrains.all_traintypes[traintype].drives_on)) then - print("[advtrains]no track here, not placing.") - return itemstack - end - local conn1=advtrains.get_track_connections(node.name, node.param2) - local id=advtrains.create_new_train_at(pointed_thing.under, advtrains.dirCoordSet(pointed_thing.under, conn1), traintype) - - local ob=minetest.env:add_entity(pointed_thing.under, "advtrains:"..sysname) - if not ob then - print("[advtrains]couldn't add_entity, aborting") - end - local le=ob:get_luaentity() - - le.owner=placer:get_player_name() - le.infotext=desc..", owned by "..placer:get_player_name() - - local wagon_uid=le:init_new_instance(id, {}) - - advtrains.add_wagon_to_train(le, id) - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - return itemstack - - end, - }) -end -advtrains.register_train_type("steam", {"regular", "default"}) - ---[[advtrains.register_wagon("blackwagon", "steam",{textures = {"black.png"}}) -advtrains.register_wagon("bluewagon", "steam",{textures = {"blue.png"}}) -advtrains.register_wagon("greenwagon", "steam",{textures = {"green.png"}}) -advtrains.register_wagon("redwagon", "steam",{textures = {"red.png"}}) -advtrains.register_wagon("yellowwagon", "steam",{textures = {"yellow.png"}}) -]] - ---[[ - wagons can define update_animation(self, velocity) if they have a speed-dependent animation - this function will be called when the velocity vector changes or every 2 seconds. -]] -advtrains.register_wagon("newlocomotive", "steam",{ - mesh="advtrains_engine_steam.b3d", - textures = {"advtrains_newlocomotive.png"}, - is_locomotive=true, - seats = { - { - name="Driver Stand (left)", - attach_offset={x=-5, y=10, z=-10}, - view_offset={x=0, y=6, z=0}, - driving_ctrl_access=true, - }, - { - name="Driver Stand (right)", - attach_offset={x=5, y=10, z=-10}, - view_offset={x=0, y=6, z=0}, - driving_ctrl_access=true, - }, - }, - visual_size = {x=1, y=1}, - wagon_span=1.85, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - update_animation=function(self, velocity) - --if self.old_anim_velocity~=advtrains.abs_ceil(velocity) then - self.object:set_animation({x=1,y=60}, 100)--math.floor(velocity)) - --self.old_anim_velocity=advtrains.abs_ceil(velocity) - --end - end, - custom_on_activate = function(self, staticdata_table, dtime_s) - minetest.add_particlespawner({ - amount = 10, - time = 0, - -- ^ If time is 0 has infinite lifespan and spawns the amount on a per-second base - minpos = {x=0, y=2, z=1.2}, - maxpos = {x=0, y=2, z=1.2}, - minvel = {x=-0.2, y=1.8, z=-0.2}, - maxvel = {x=0.2, y=2, z=0.2}, - minacc = {x=0, y=-0.1, z=0}, - maxacc = {x=0, y=-0.3, z=0}, - minexptime = 2, - maxexptime = 4, - minsize = 1, - maxsize = 5, - -- ^ The particle's properties are random values in between the bounds: - -- ^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration), - -- ^ minsize/maxsize, minexptime/maxexptime (expirationtime) - collisiondetection = true, - -- ^ collisiondetection: if true uses collision detection - vertical = false, - -- ^ vertical: if true faces player using y axis only - texture = "smoke_puff.png", - -- ^ Uses texture (string) - attached = self.object, - }) - end, - drops={"default:steelblock 4"}, -}, "Steam Engine", "advtrains_newlocomotive_inv.png") -advtrains.register_wagon("wagon_default", "steam",{ - mesh="advtrains_wagon.b3d", - textures = {"advtrains_wagon.png"}, - seats = { - { - name="Default Seat", - attach_offset={x=0, y=10, z=0}, - view_offset={x=0, y=6, z=0}, - }, - }, - visual_size = {x=1, y=1}, - wagon_span=1.8, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, -}, "Passenger Wagon", "advtrains_wagon_inv.png") -advtrains.register_wagon("wagon_box", "steam",{ - mesh="advtrains_wagon.b3d", - textures = {"advtrains_wagon_box.png"}, - seats = {}, - visual_size = {x=1, y=1}, - wagon_span=1.8, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, - has_inventory = true, - get_inventory_formspec = function(self) - return "size[8,11]".. - "list[detached:advtrains_wgn_"..self.unique_id..";box;0,0;8,6;]".. - "list[current_player;main;0,7;8,4;]".. - "listring[]" - end, - inventory_list_sizes = { - box=8*6, - }, -}, "Box Wagon", "advtrains_wagon_box_inv.png") - -advtrains.register_train_type("electric", {"regular", "default"}, 20) - -advtrains.register_wagon("engine_japan", "electric",{ - mesh="advtrains_engine_japan.b3d", - textures = {"advtrains_engine_japan.png"}, - seats = { - { - name="Default Seat (driver stand)", - attach_offset={x=0, y=10, z=0}, - view_offset={x=0, y=6, z=0}, - driving_ctrl_access=true, - }, - }, - visual_size = {x=1, y=1}, - wagon_span=2.5, - is_locomotive=true, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, -}, "Japanese Train Engine", "advtrains_engine_japan_inv.png") - -advtrains.register_wagon("wagon_japan", "electric",{ - mesh="advtrains_wagon_japan.b3d", - textures = {"advtrains_wagon_japan.png"}, - seats = { - { - name="Default Seat", - attach_offset={x=0, y=10, z=0}, - view_offset={x=0, y=6, z=0}, - }, - }, - visual_size = {x=1, y=1}, - wagon_span=2.3, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, -}, "Japanese Train Wagon", "advtrains_wagon_japan_inv.png") - -advtrains.register_wagon("engine_industrial", "electric",{ - mesh="advtrains_engine_industrial.b3d", - textures = {"advtrains_engine_industrial.png"}, - seats = { - { - name="Driver Stand (left)", - attach_offset={x=-5, y=10, z=-10}, - view_offset={x=0, y=10, z=0}, - driving_ctrl_access=true, - }, - { - name="Driver Stand (right)", - attach_offset={x=5, y=10, z=-10}, - view_offset={x=0, y=10, z=0}, - driving_ctrl_access=true, - }, - }, - visual_size = {x=1, y=1}, - wagon_span=2.6, - is_locomotive=true, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, -}, "Industrial Train Engine", "advtrains_engine_industrial_inv.png") -advtrains.register_wagon("wagon_tank", "electric",{ - mesh="advtrains_wagon_tank.b3d", - textures = {"advtrains_wagon_tank.png"}, - seats = {}, - visual_size = {x=1, y=1}, - wagon_span=2.2, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, - has_inventory = true, - get_inventory_formspec = function(self) - return "size[8,11]".. - "list[detached:advtrains_wgn_"..self.unique_id..";box;0,0;8,6;]".. - "list[current_player;main;0,7;8,4;]".. - "listring[]" - end, - inventory_list_sizes = { - box=8*6, - }, -}, "Industrial tank wagon", "advtrains_wagon_tank_inv.png") -advtrains.register_wagon("wagon_wood", "electric",{ - mesh="advtrains_wagon_wood.b3d", - textures = {"advtrains_wagon_wood.png"}, - seats = {}, - visual_size = {x=1, y=1}, - wagon_span=1.8, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - drops={"default:steelblock 4"}, - has_inventory = true, - get_inventory_formspec = function(self) - return "size[8,11]".. - "list[detached:advtrains_wgn_"..self.unique_id..";box;0,0;8,6;]".. - "list[current_player;main;0,7;8,4;]".. - "listring[]" - end, - inventory_list_sizes = { - box=8*6, - }, -}, "Industrial wood wagon", "advtrains_wagon_wood_inv.png") - -advtrains.register_train_type("subway", {"default"}, 15) - -advtrains.register_wagon("subway_wagon", "subway",{ - mesh="advtrains_subway_train.b3d", - textures = {"advtrains_subway_train.png"}, - seats = { - { - name="Default Seat (driver stand)", - attach_offset={x=0, y=10, z=0}, - view_offset={x=0, y=6, z=0}, - driving_ctrl_access=true, - }, - }, - visual_size = {x=1, y=1}, - wagon_span=1.8, - collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, - is_locomotive=true, - drops={"default:steelblock 4"}, -}, "Subway Passenger Wagon", "advtrains_subway_train_inv.png") - - - -- cgit v1.2.3