aboutsummaryrefslogtreecommitdiff
path: root/src/mapgen/mapgen_v7.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mapgen/mapgen_v7.cpp')
0 files changed, 0 insertions, 0 deletions
ass='add'>advtrains/advtrains/atc.lua342
-rw-r--r--advtrains/advtrains/copytool.lua185
-rw-r--r--advtrains/advtrains/couple.lua192
-rw-r--r--advtrains/advtrains/craft_items.lua23
-rw-r--r--advtrains/advtrains/crafting.lua76
-rw-r--r--advtrains/advtrains/debugitems.lua53
-rw-r--r--advtrains/advtrains/debugringbuffer.lua44
-rw-r--r--advtrains/advtrains/depends.txt3
-rw-r--r--advtrains/advtrains/description.txt8
-rw-r--r--advtrains/advtrains/helpers.lua447
-rw-r--r--advtrains/advtrains/init.lua597
-rw-r--r--advtrains/advtrains/locale/advtrains.de.tr71
-rw-r--r--advtrains/advtrains/locale/advtrains.zh_CN.tr107
-rw-r--r--advtrains/advtrains/log.lua17
-rw-r--r--advtrains/advtrains/lzb.lua191
-rw-r--r--advtrains/advtrains/misc_nodes.lua118
-rw-r--r--advtrains/advtrains/models/advtrains_across.obj537
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3dbin0 -> 32927 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3dbin0 -> 48546 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3dbin0 -> 32926 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3dbin0 -> 48546 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr.b3dbin0 -> 28040 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr_30.b3dbin0 -> 28043 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr_45.b3dbin0 -> 34483 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_cr_60.b3dbin0 -> 34483 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st.b3dbin0 -> 10712 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st_30.b3dbin0 -> 20043 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st_45.b3dbin0 -> 12235 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_st_60.b3dbin0 -> 20043 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst1.obj348
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj434
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst2.obj372
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj462
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst31.obj348
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst32.obj372
-rw-r--r--advtrains/advtrains/models/advtrains_dtrack_vst33.obj388
-rw-r--r--advtrains/advtrains/models/advtrains_modernwagon.b3dbin0 -> 172028 bytes-rw-r--r--advtrains/advtrains/models/advtrains_platform_diag.b3dbin0 -> 1970 bytes-rw-r--r--advtrains/advtrains/models/advtrains_platform_diag_low.b3dbin0 -> 1982 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off_30.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off_45.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_off_60.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on_30.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on_45.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_retrosignal_on_60.b3dbin0 -> 13093 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal.b3dbin0 -> 61544 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal_30.b3dbin0 -> 61544 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal_45.b3dbin0 -> 61544 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal_60.b3dbin0 -> 61544 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal_wall_l.b3dbin0 -> 40514 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal_wall_r.b3dbin0 -> 40514 bytes-rw-r--r--advtrains/advtrains/models/advtrains_signal_wall_t.b3dbin0 -> 40514 bytes-rw-r--r--advtrains/advtrains/models/advtrains_track_cr.b3dbin0 -> 8023 bytes-rw-r--r--advtrains/advtrains/models/advtrains_track_st.b3dbin0 -> 15831 bytes-rw-r--r--advtrains/advtrains/models/advtrains_track_st_45.b3dbin0 -> 8935 bytes-rw-r--r--advtrains/advtrains/models/trackplane.b3dbin0 -> 262 bytes-rw-r--r--advtrains/advtrains/nodedb.lua343
-rw-r--r--advtrains/advtrains/occupation.lua207
-rw-r--r--advtrains/advtrains/p_mesecon_iface.lua54
-rw-r--r--advtrains/advtrains/passive.lua121
-rw-r--r--advtrains/advtrains/path.lua377
-rw-r--r--advtrains/advtrains/protection.lua197
-rw-r--r--advtrains/advtrains/settingtypes.txt47
-rw-r--r--advtrains/advtrains/signals.lua328
-rw-r--r--advtrains/advtrains/sounds/advtrains_crossing_bell.oggbin0 -> 47722 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_across.pngbin0 -> 302 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_across_anim.pngbin0 -> 524 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_boiler.pngbin0 -> 413 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_chimney.pngbin0 -> 309 bytes-rw-r--r--advtrains/advtrains/textures/advtrains_copytool.pngbin0 -> 779 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_couple.pngbin0 -> 339 bytes-rw-r--r--advtrains/advtrains/textures/advtrains_cpl_lock.pngbin0 -> 209 bytes-rw-r--r--advtrains/advtrains/textures/advtrains_cpl_unlock.pngbin0 -> 213 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_discouple.pngbin0 -> 293 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_driver_cab.pngbin0 -> 352 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_atc_placer.pngbin0 -> 1259 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_bumper_placer.pngbin0 -> 2213 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_detector_placer.pngbin0 -> 1253 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_load_placer.pngbin0 -> 1248 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_placer.pngbin0 -> 1097 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_rail.pngbin0 -> 4582 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared.pngbin0 -> 7141 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_atc.pngbin0 -> 7215 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_detector_off.pngbin0 -> 7180 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_detector_on.pngbin0 -> 7181 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_load.pngbin0 -> 7339 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_shared_unload.pngbin0 -> 7338 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_slopeplacer.pngbin0 -> 2415 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_dtrack_unload_placer.pngbin0 -> 1260 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_platform.pngbin0 -> 193 bytes-rw-r--r--advtrains/advtrains/textures/advtrains_platform_diag.pngbin0 -> 93 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_retrosignal.pngbin0 -> 8496 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_retrosignal_inv.pngbin0 -> 2242 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_inv.pngbin0 -> 856 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_off.pngbin0 -> 5882 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_on.pngbin0 -> 5884 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_wall_off.pngbin0 -> 3056 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_signal_wall_on.pngbin0 -> 3043 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_cr.pngbin0 -> 33370 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_cr_45.pngbin0 -> 33938 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_placer.pngbin0 -> 32349 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_st.pngbin0 -> 20405 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_st_45.pngbin0 -> 39977 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlcr.pngbin0 -> 33378 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlcr_45.pngbin0 -> 45772 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlst.pngbin0 -> 32321 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swlst_45.pngbin0 -> 46408 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrcr.pngbin0 -> 33670 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrcr_45.pngbin0 -> 46865 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrst.pngbin0 -> 32654 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_track_swrst_45.pngbin0 -> 47636 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_trackworker.pngbin0 -> 328 bytes-rw-r--r--advtrains/advtrains/textures/advtrains_wagon_placeholder.pngbin0 -> 723 bytes-rwxr-xr-xadvtrains/advtrains/textures/advtrains_wheel.pngbin0 -> 582 bytes-rwxr-xr-xadvtrains/advtrains/textures/drwho_screwdriver.pngbin0 -> 328 bytes-rw-r--r--advtrains/advtrains/trackdb_legacy.lua27
-rw-r--r--advtrains/advtrains/trackplacer.lua438
-rw-r--r--advtrains/advtrains/tracks.lua742
-rw-r--r--advtrains/advtrains/trainhud.lua226
-rw-r--r--advtrains/advtrains/trainlogic.lua1255
-rw-r--r--advtrains/advtrains/wagons.lua1437
-rw-r--r--advtrains/advtrains_interlocking/approach.lua113
-rw-r--r--advtrains/advtrains_interlocking/ars.lua155
-rw-r--r--advtrains/advtrains_interlocking/database.lua599
-rw-r--r--advtrains/advtrains_interlocking/demosignals.lua111
-rw-r--r--advtrains/advtrains_interlocking/depends.txt2
-rw-r--r--advtrains/advtrains_interlocking/init.lua30
-rw-r--r--advtrains/advtrains_interlocking/models/at_il_tcb_node.obj248
-rw-r--r--advtrains/advtrains_interlocking/route_prog.lua548
-rw-r--r--advtrains/advtrains_interlocking/route_ui.lua152
-rw-r--r--advtrains/advtrains_interlocking/routesetting.lua357
-rw-r--r--advtrains/advtrains_interlocking/settingtypes.txt4
-rw-r--r--advtrains/advtrains_interlocking/signal_api.lua546
-rw-r--r--advtrains/advtrains_interlocking/tcb_ts_ui.lua789
-rw-r--r--advtrains/advtrains_interlocking/textures/advtrains_dtrack_npr_placer.pngbin0 -> 1238 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/advtrains_dtrack_shared_npr.pngbin0 -> 3176 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_end.pngbin0 -> 451 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_lock.pngbin0 -> 534 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_lock_edit.pngbin0 -> 533 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_set.pngbin0 -> 398 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_route_start.pngbin0 -> 380 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_advance.pngbin0 -> 304 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_end_here.pngbin0 -> 243 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_end_over.pngbin0 -> 281 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_routep_end_over_last.pngbin0 -> 277 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_asp_danger.pngbin0 -> 247 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_asp_free.pngbin0 -> 245 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_asp_slow.pngbin0 -> 245 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_ip.pngbin0 -> 285 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_signal_off.pngbin0 -> 236 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_tcb_marker.pngbin0 -> 308 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_tcb_node.pngbin0 -> 279 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_tool.pngbin0 -> 337 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_cr_l.pngbin0 -> 314 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_cr_r.pngbin0 -> 298 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_free.pngbin0 -> 367 bytes-rw-r--r--advtrains/advtrains_interlocking/textures/at_il_turnout_st.pngbin0 -> 229 bytes-rw-r--r--advtrains/advtrains_interlocking/tool.lua66
-rw-r--r--advtrains/advtrains_interlocking/train_sections.lua199
-rw-r--r--advtrains/advtrains_interlocking/tsr_rail.lua56
-rw-r--r--advtrains/advtrains_itrainmap/depends.txt1
-rw-r--r--advtrains/advtrains_itrainmap/init.lua149
-rw-r--r--advtrains/advtrains_itrainmap/textures/itm_example.pngbin0 -> 154460 bytes-rw-r--r--advtrains/advtrains_line_automation/depends.txt2
-rw-r--r--advtrains/advtrains_line_automation/init.lua47
-rw-r--r--advtrains/advtrains_line_automation/railwaytime.lua308
-rw-r--r--advtrains/advtrains_line_automation/readme.txt5
-rw-r--r--advtrains/advtrains_line_automation/scheduler.lua133
-rw-r--r--advtrains/advtrains_line_automation/settingtypes.txt6
-rw-r--r--advtrains/advtrains_line_automation/stoprail.lua218
-rw-r--r--advtrains/advtrains_line_automation/textures/advtrains_dtrack_shared_stop.pngbin0 -> 3306 bytes-rw-r--r--advtrains/advtrains_line_automation/textures/advtrains_dtrack_stop_placer.pngbin0 -> 1238 bytes-rw-r--r--advtrains/advtrains_luaautomation/README.txt288
-rw-r--r--advtrains/advtrains_luaautomation/active_common.lua175
-rw-r--r--advtrains/advtrains_luaautomation/atc_rail.lua194
-rw-r--r--advtrains/advtrains_luaautomation/chatcmds.lua84
-rw-r--r--advtrains/advtrains_luaautomation/depends.txt4
-rw-r--r--advtrains/advtrains_luaautomation/environment.lua362
-rw-r--r--advtrains/advtrains_luaautomation/init.lua109
-rw-r--r--advtrains/advtrains_luaautomation/interrupt.lua48
-rw-r--r--advtrains/advtrains_luaautomation/operation_panel.lua28
-rw-r--r--advtrains/advtrains_luaautomation/p_display.lua0
-rw-r--r--advtrains/advtrains_luaautomation/passive_api.txt24
-rw-r--r--advtrains/advtrains_luaautomation/pcnaming.lua76
-rw-r--r--advtrains/advtrains_luaautomation/textures/atlatc_oppanel.pngbin0 -> 631 bytes-rw-r--r--advtrains/advtrains_luaautomation/textures/atlatc_pcnaming.pngbin0 -> 329 bytes-rw-r--r--advtrains/advtrains_signals_ks/depends.txt2
-rw-r--r--advtrains/advtrains_signals_ks/init.lua255
-rw-r--r--advtrains/advtrains_signals_ks/init_degrotate_nodes.lua94
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_dist.obj270
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_head_main.obj286
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_dist.obj1989
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_lamps_main.obj2719
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr0.obj4280
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr30.obj4293
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr45.obj4301
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_main_smr60.obj4310
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast.obj366
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr0.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr30.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr45.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_mast_smr60.obj141
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr0.obj2942
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr30.obj2940
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr45.obj2933
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sht_smr60.obj2950
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr0.obj134
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr30.obj135
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr45.obj135
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_sign_smr60.obj135
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_zs_bottom.obj956
-rw-r--r--advtrains/advtrains_signals_ks/models/advtrains_signals_ks_zs_top.obj835
-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_green.pngbin0 -> 155 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_red.pngbin0 -> 155 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_white.pngbin0 -> 155 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_aspect_yellow.pngbin0 -> 155 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_head.pngbin0 -> 260 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_hs_inv.pngbin0 -> 210 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_danger.pngbin0 -> 227 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_free.pngbin0 -> 215 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_shunt.pngbin0 -> 238 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_shuntd.pngbin0 -> 239 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ltm_slow.pngbin0 -> 219 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_mast.pngbin0 -> 224 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_ra_inv.pngbin0 -> 252 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_12.pngbin0 -> 197 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_16.pngbin0 -> 190 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_8.pngbin0 -> 174 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_e.pngbin0 -> 166 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_sign_hfs.pngbin0 -> 193 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_signpost.pngbin0 -> 224 bytes-rw-r--r--advtrains/advtrains_signals_ks/textures/advtrains_signals_ks_zs_7.pngbin0 -> 251 bytes-rw-r--r--advtrains/advtrains_train_industrial/depends.txt3
-rw-r--r--advtrains/advtrains_train_industrial/init.lua107
-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_engine_industrial.b3dbin0 -> 138641 bytes-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_engine_industrial_big.b3dbin0 -> 283441 bytes-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_wagon_tank.b3dbin0 -> 155412 bytes-rw-r--r--advtrains/advtrains_train_industrial/models/advtrains_wagon_wood.b3dbin0 -> 182813 bytes-rw-r--r--advtrains/advtrains_train_industrial/sounds/advtrains_industrial_horn.oggbin0 -> 54380 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_engine_industrial.pngbin0 -> 23044 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_engine_industrial_big.pngbin0 -> 23765 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_engine_industrial_inv.pngbin0 -> 381 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_tank.pngbin0 -> 23411 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_tank_inv.pngbin0 -> 408 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_wood.pngbin0 -> 21622 bytes-rw-r--r--advtrains/advtrains_train_industrial/textures/advtrains_wagon_wood_inv.pngbin0 -> 316 bytes-rw-r--r--advtrains/advtrains_train_japan/depends.txt3
-rw-r--r--advtrains/advtrains_train_japan/init.lua140
-rw-r--r--advtrains/advtrains_train_japan/models/advtrains_engine_japan.b3dbin0 -> 437635 bytes-rw-r--r--advtrains/advtrains_train_japan/models/advtrains_wagon_japan.b3dbin0 -> 554284 bytes-rw-r--r--advtrains/advtrains_train_japan/sounds/advtrains_japan_horn.oggbin0 -> 39307 bytes-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_engine_japan.pngbin0 -> 27935 bytes-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_engine_japan_inv.pngbin0 -> 434 bytes-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_wagon_japan.pngbin0 -> 54396 bytes-rw-r--r--advtrains/advtrains_train_japan/textures/advtrains_wagon_japan_inv.pngbin0 -> 400 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/depends.txt3
-rwxr-xr-xadvtrains/advtrains_train_steam/init.lua253
-rwxr-xr-xadvtrains/advtrains_train_steam/models/advtrains_detailed_steam_engine.b3dbin0 -> 472151 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/models/advtrains_engine_steam.b3dbin0 -> 437126 bytes-rw-r--r--advtrains/advtrains_train_steam/models/advtrains_passenger_wagon.b3dbin0 -> 145287 bytes-rw-r--r--advtrains/advtrains_train_steam/models/advtrains_wagon.b3dbin0 -> 107352 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/models/advtrains_wagon_box.b3dbin0 -> 50385 bytes-rw-r--r--advtrains/advtrains_train_steam/screenshot.pngbin0 -> 809738 bytes-rw-r--r--advtrains/advtrains_train_steam/sounds/advtrains_steam_loop.oggbin0 -> 239037 bytes-rw-r--r--advtrains/advtrains_train_steam/sounds/advtrains_steam_whistle.oggbin0 -> 56532 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_detailed_engine_steam_inv.pngbin0 -> 462 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_detailed_steam_engine.pngbin0 -> 30519 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_engine_steam.pngbin0 -> 31915 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_engine_steam_inv.pngbin0 -> 469 bytes-rw-r--r--advtrains/advtrains_train_steam/textures/advtrains_wagon.pngbin0 -> 17701 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_wagon_box.pngbin0 -> 15197 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_wagon_box_inv.pngbin0 -> 347 bytes-rwxr-xr-xadvtrains/advtrains_train_steam/textures/advtrains_wagon_inv.pngbin0 -> 699 bytes-rw-r--r--advtrains/advtrains_train_subway/depends.txt3
-rw-r--r--advtrains/advtrains_train_subway/init.lua152
-rw-r--r--advtrains/advtrains_train_subway/models/advtrains_subway_wagon.b3dbin0 -> 460013 bytes-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_arrive.oggbin0 -> 22658 bytes-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_dclose.oggbin0 -> 14298 bytes-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_depart.oggbin0 -> 39161 bytes-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_dopen.oggbin0 -> 14307 bytes-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_horn.oggbin0 -> 14370 bytes-rw-r--r--advtrains/advtrains_train_subway/sounds/advtrains_subway_loop.oggbin0 -> 33319 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon.pngbin0 -> 2102 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_inv.pngbin0 -> 842 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line.pngbin0 -> 155 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line0.pngbin0 -> 222 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line0_.pngbin0 -> 166 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line1.pngbin0 -> 218 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line1_.pngbin0 -> 172 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line2.pngbin0 -> 229 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line2_.pngbin0 -> 173 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line3.pngbin0 -> 219 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line3_.pngbin0 -> 168 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line4.pngbin0 -> 237 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line4_.pngbin0 -> 169 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line5.pngbin0 -> 228 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line5_.pngbin0 -> 173 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line6.pngbin0 -> 227 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line6_.pngbin0 -> 174 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line7.pngbin0 -> 233 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line7_.pngbin0 -> 169 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line8.pngbin0 -> 218 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line8_.pngbin0 -> 167 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line9.pngbin0 -> 228 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line9_.pngbin0 -> 173 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_lineX.pngbin0 -> 239 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_0.pngbin0 -> 165 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_1.pngbin0 -> 170 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_2.pngbin0 -> 171 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_3.pngbin0 -> 165 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_4.pngbin0 -> 166 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_5.pngbin0 -> 171 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_6.pngbin0 -> 171 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_7.pngbin0 -> 166 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_8.pngbin0 -> 167 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_line_9.pngbin0 -> 171 bytes-rw-r--r--advtrains/advtrains_train_subway/textures/advtrains_subway_wagon_livery.pngbin0 -> 26276 bytes-rw-r--r--advtrains/advtrains_train_track/depends.txt4
-rw-r--r--advtrains/advtrains_train_track/init.lua409
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st.b3dbin0 -> 32927 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st_30.b3dbin0 -> 48546 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st_45.b3dbin0 -> 32926 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_bumper_st_60.b3dbin0 -> 48546 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr.b3dbin0 -> 28040 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr_30.b3dbin0 -> 28043 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr_45.b3dbin0 -> 34483 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_cr_60.b3dbin0 -> 34483 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l.obj2335
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l_30.obj1882
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l_45.obj2710
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_l_60.obj1888
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r.obj2335
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r_30.obj1889
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r_45.obj2710
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_r_60.obj1882
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s.obj2339
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s_30.obj1888
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s_45.obj2707
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_s3_s_60.obj1888
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st.b3dbin0 -> 10712 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st_30.b3dbin0 -> 20043 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st_45.b3dbin0 -> 12235 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_st_60.b3dbin0 -> 20043 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr_30.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlcr_60.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst_30.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swlst_60.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr_30.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrcr_60.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst.b3dbin0 -> 36203 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst_30.b3dbin0 -> 46270 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst_45.b3dbin0 -> 41302 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_swrst_60.b3dbin0 -> 39958 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l.obj1936
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l_30.obj1414
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l_45.obj2033
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_l_60.obj1390
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r.obj1929
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r_30.obj1402
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r_45.obj2037
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_sy_r_60.obj1402
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst1.obj348
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst1_45.obj434
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst2.obj372
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst2_45.obj462
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst31.obj348
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst32.obj372
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_vst33.obj388
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing4590_st.obj2196
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_30l.obj2417
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_30r.obj2378
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_45l.obj1576
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_45r.obj1557
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_60l.obj2303
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing90plusx_60r.obj2280
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st.obj4963
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st_30.obj3476
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st_45.obj3177
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xing_st_60.obj3492
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_30l45r.obj2317
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_30r45l.obj2294
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l30l.obj2556
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l30r.obj2556
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l45r.obj2206
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60l60r.obj2229
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r-46l.obj2149
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r30l.obj2539
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r30r.obj2539
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_dtrack_xingdiag_60r45l.obj2223
-rw-r--r--advtrains/advtrains_train_track/models/advtrains_track_cr.b3dbin0 -> 8023 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_track_st.b3dbin0 -> 15831 bytes-rw-r--r--advtrains/advtrains_train_track/models/advtrains_track_st_45.b3dbin0 -> 8935 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_atc_placer.pngbin0 -> 1259 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_bumper_placer.pngbin0 -> 2213 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_detector_placer.pngbin0 -> 1253 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_load_placer.pngbin0 -> 1248 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_placer.pngbin0 -> 1097 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_rail.pngbin0 -> 4582 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_s3_placer.pngbin0 -> 619 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared.pngbin0 -> 7141 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_atc.pngbin0 -> 7215 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_detector_off.pngbin0 -> 7180 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_detector_on.pngbin0 -> 7181 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_load.pngbin0 -> 7339 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_shared_unload.pngbin0 -> 7338 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_slopeplacer.pngbin0 -> 2415 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_sy_placer.pngbin0 -> 625 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_unload_placer.pngbin0 -> 1260 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_xing4590_placer.pngbin0 -> 468 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_xing_placer.pngbin0 -> 549 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_dtrack_xingdiag_placer.pngbin0 -> 557 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_cr.pngbin0 -> 33370 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_cr_45.pngbin0 -> 33938 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_placer.pngbin0 -> 32349 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_st.pngbin0 -> 20405 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_st_45.pngbin0 -> 39977 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlcr.pngbin0 -> 33378 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlcr_45.pngbin0 -> 45772 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlst.pngbin0 -> 32321 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swlst_45.pngbin0 -> 46408 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrcr.pngbin0 -> 33670 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrcr_45.pngbin0 -> 46865 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrst.pngbin0 -> 32654 bytes-rw-r--r--advtrains/advtrains_train_track/textures/advtrains_track_swrst_45.pngbin0 -> 47636 bytes-rw-r--r--advtrains/assets/AdvTrains_Additions.zipbin0 -> 889352 bytes-rw-r--r--advtrains/assets/Weichenhebel-CooleLokAnimiert.zipbin0 -> 154594 bytes-rw-r--r--advtrains/assets/Weichenhebel-CooleLokAnimiert/dampflock4pipe_animated.blendbin0 -> 859028 bytes-rw-r--r--advtrains/assets/advtrains_across.xcfbin0 -> 13559 bytes-rw-r--r--advtrains/assets/advtrains_newlocomotive.xcfbin0 -> 7462378 bytes-rw-r--r--advtrains/assets/advtrains_wagon.pngbin0 -> 72273 bytes-rw-r--r--advtrains/assets/andreaskreuz.blendbin0 -> 507904 bytes-rw-r--r--advtrains/assets/andreaskreuz.blend1bin0 -> 507904 bytes-rw-r--r--advtrains/assets/andreaskreuz.pngbin0 -> 69701 bytes-rw-r--r--advtrains/assets/at_il_tcb_node.blendbin0 -> 483100 bytes-rw-r--r--advtrains/assets/blender/engine-with-animation.blendbin0 -> 599504 bytes-rw-r--r--advtrains/assets/blender/engine-with-animation_newtry.blendbin0 -> 638904 bytes-rw-r--r--advtrains/assets/blender/gleis/advtrains_dtrack_shared.xcfbin0 -> 75136 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/detectorpart.pngbin0 -> 857 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my.blendbin0 -> 654772 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt.blendbin0 -> 847060 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt_final.blendbin0 -> 1015668 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt_switches.blendbin0 -> 2184236 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_my_rt_switches2.blendbin0 -> 2139340 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together.blendbin0 -> 1016920 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together.pngbin0 -> 233544 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together2.pngbin0 -> 312891 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_together3.pngbin0 -> 309398 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals.blendbin0 -> 550748 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals3.blendbin0 -> 591800 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals45.blendbin0 -> 547788 bytes-rw-r--r--advtrains/assets/blender/gleis/before_redo/rail_verticals45.blend11bin0 -> 547300 bytes-rw-r--r--advtrains/assets/blender/gleis/infos/Grafik_weiche.pngbin0 -> 361700 bytes-rw-r--r--advtrains/assets/blender/gleis/infos/breite1
-rw-r--r--advtrains/assets/blender/gleis/licence.txt~0
-rw-r--r--advtrains/assets/blender/gleis/rail_crossings.blendbin0 -> 444480 bytes-rw-r--r--advtrains/assets/blender/gleis/rail_moreturnouts.blendbin0 -> 468819 bytes-rw-r--r--advtrains/assets/blender/gleis/rail_redo.blendbin0 -> 1929280 bytes-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_curves.blendbin0 -> 791704 bytes-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_rswit.blendbin0 -> 1567640 bytes-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_straight.blendbin0 -> 707632 bytes-rw-r--r--advtrains/assets/blender/gleis/rail_redo_bk_swit.blendbin0 -> 1189696 bytes-rw-r--r--advtrains/assets/blender/gleis/texturen/rail.pngbin0 -> 2616 bytes-rw-r--r--advtrains/assets/blender/gleis/texturen/uv.pngbin0 -> 2343 bytes-rw-r--r--advtrains/assets/blender/gleis/uv_rails_all.pngbin0 -> 3692 bytes-rw-r--r--advtrains/assets/blender/industrial/industry_loc.blendbin0 -> 652640 bytes-rw-r--r--advtrains/assets/blender/industrial/industry_loc.blend11bin0 -> 659096 bytes-rw-r--r--advtrains/assets/blender/industrial/industry_oil_ wagong.blendbin0 -> 693488 bytes-rw-r--r--advtrains/assets/blender/industrial/industry_tree_wagong.blendbin0 -> 640056 bytes-rw-r--r--advtrains/assets/blender/industrial/industry_tree_wagong.pngbin0 -> 316 bytes-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_head_dist.obj270
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_head_main.obj286
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_lamps_dist.obj1989
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_lamps_main.obj2719
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr0.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr0.obj4280
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr30.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr30.obj4293
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr45.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr45.obj4301
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr60.mtl42
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_main_smr60.obj4310
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast.obj366
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr0.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr30.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr45.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_mast_smr60.obj141
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_zs_bottom.obj956
-rw-r--r--advtrains/assets/blender/ks/advtrains_signals_ks_zs_top.obj835
-rw-r--r--advtrains/assets/blender/ks/signal_ks.blendbin0 -> 770684 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks.blend1bin0 -> 770684 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_export.blendbin0 -> 880352 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_export.blend1bin0 -> 880352 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_exportd.blendbin0 -> 535508 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_exportd.blend1bin0 -> 535316 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh.blendbin0 -> 703884 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh.blend1bin0 -> 703884 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_final.blendbin0 -> 652332 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_final.blend1bin0 -> 661328 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_lampuv.pngbin0 -> 211402 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_lampuv.xcfbin0 -> 1558 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_shuntsig.blendbin0 -> 593572 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_singlemesh_shuntsig.blend1bin0 -> 593572 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_splt.blendbin0 -> 884984 bytes-rw-r--r--advtrains/assets/blender/ks/signal_ks_splt.blend1bin0 -> 867672 bytes-rw-r--r--advtrains/assets/blender/locomotive.blendbin0 -> 459600 bytes-rw-r--r--advtrains/assets/blender/magnet_track.blendbin0 -> 516836 bytes-rw-r--r--advtrains/assets/blender/mbb/advtrains_engine_japan.xcfbin0 -> 2621842 bytes-rw-r--r--advtrains/assets/blender/mbb/jpn_engine_anim_uv.pngbin0 -> 274484 bytes-rw-r--r--advtrains/assets/blender/mbb/jpn_wagon_anim_uv.pngbin0 -> 206208 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.blendbin0 -> 715116 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.blend1bin0 -> 715116 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.pngbin0 -> 204978 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive.xcfbin0 -> 957175 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim.blendbin0 -> 1149060 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim.blend1bin0 -> 1170088 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim_uv.blendbin0 -> 1146996 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_anim_uv.blend1bin0 -> 1144108 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows.blendbin0 -> 790808 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows.blend1bin0 -> 790808 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows_join.blendbin0 -> 762448 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_japanlocomotive_windows_join.blend1bin0 -> 767528 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_locomotive.blendbin0 -> 732124 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_wagong.blendbin0 -> 471140 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_wagong.blend1bin0 -> 518316 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_wagong_uv.blendbin0 -> 571364 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_wagong_uv.blend1bin0 -> 575708 bytes-rw-r--r--advtrains/assets/blender/mbb/modern_wagong_uv.pngbin0 -> 189564 bytes-rw-r--r--advtrains/assets/blender/mbb/prellbock.blendbin0 -> 745176 bytes-rw-r--r--advtrains/assets/blender/mbb/prellbock.blend1bin0 -> 485416 bytes-rw-r--r--advtrains/assets/blender/mbb/prellbock.uv.pngbin0 -> 4034 bytes-rw-r--r--advtrains/assets/blender/mbb/regio-lokomotive.blendbin0 -> 704160 bytes-rw-r--r--advtrains/assets/blender/mbb/regio-waron.blendbin0 -> 545620 bytes-rw-r--r--advtrains/assets/blender/mbb/retrosignal.blendbin0 -> 488920 bytes-rw-r--r--advtrains/assets/blender/mbb/retrosignal.blend1bin0 -> 507800 bytes-rw-r--r--advtrains/assets/blender/mbb/signal(2)_hoch.blendbin0 -> 472092 bytes-rw-r--r--advtrains/assets/blender/mbb/signal(2)_unten.blendbin0 -> 472092 bytes-rw-r--r--advtrains/assets/blender/mbb/signal.blendbin0 -> 570336 bytes-rw-r--r--advtrains/assets/blender/mbb/signal.blend1bin0 -> 570336 bytes-rw-r--r--advtrains/assets/blender/mbb/signal.pngbin0 -> 244314 bytes-rw-r--r--advtrains/assets/blender/mbb/signal.xcfbin0 -> 881142 bytes-rw-r--r--advtrains/assets/blender/mbb/signal2.pngbin0 -> 39924 bytes-rw-r--r--advtrains/assets/blender/mbb/tr-logo.pngbin0 -> 197 bytes-rw-r--r--advtrains/assets/blender/mbb/weichenhebel1.blendbin0 -> 493028 bytes-rw-r--r--advtrains/assets/blender/mbb/weichenhebel2.blendbin0 -> 492996 bytes-rw-r--r--advtrains/assets/blender/newlocomotive.blendbin0 -> 603376 bytes-rw-r--r--advtrains/assets/blender/newlocomotive_uvs.pngbin0 -> 175030 bytes-rw-r--r--advtrains/assets/blender/newwagon.blendbin0 -> 542188 bytes-rw-r--r--advtrains/assets/blender/newwagon.pngbin0 -> 108762 bytes-rw-r--r--advtrains/assets/blender/subway-train.blendbin0 -> 518888 bytes-rw-r--r--advtrains/assets/blender/subway-train.pngbin0 -> 96773 bytes-rw-r--r--advtrains/assets/blender/subway-train.xcfbin0 -> 92558 bytes-rw-r--r--advtrains/assets/blender/subway-train_animate.blendbin0 -> 568668 bytes-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored.blendbin0 -> 798328 bytes-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify.blendbin0 -> 879916 bytes-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify_uv.blendbin0 -> 836620 bytes-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify_uv.pngbin0 -> 177111 bytes-rw-r--r--advtrains/assets/blender/subway-train_animate_mirrored_solidify_uv.xcfbin0 -> 369791 bytes-rw-r--r--advtrains/assets/blender/trackplane.blendbin0 -> 462200 bytes-rw-r--r--advtrains/assets/blender/trackvertical1.blendbin0 -> 453656 bytes-rw-r--r--advtrains/assets/blender/trackvertical1.pngbin0 -> 59146 bytes-rw-r--r--advtrains/assets/blender/trackvertical2.blendbin0 -> 459216 bytes-rw-r--r--advtrains/assets/blender/trackvertical2.pngbin0 -> 66755 bytes-rw-r--r--advtrains/assets/dampflock4.blendbin0 -> 1000628 bytes-rw-r--r--advtrains/assets/img_large/tcbex1.pngbin0 -> 546408 bytes-rw-r--r--advtrains/assets/img_large/tcbex2.pngbin0 -> 174379 bytes-rw-r--r--advtrains/assets/img_large/tcbex3.pngbin0 -> 927810 bytes-rw-r--r--advtrains/assets/init.lua0
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/0_home_moritz_Home_Projekte_Minetest_minetest_m___s_assets_lyx_img_screenshot_20180830_142551.eps34162
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/0_home_moritz_Home_Projekte_Minetest_minetest_m___s_assets_lyx_img_screenshot_20180830_142551.pngbin0 -> 257012 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/10_home_moritz_Home_Projekte_Minetest_minetest_____lyx_img_Bildschirmfoto_2019-01-15_19-28-09.pngbin0 -> 135195 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/11_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_arslin_ex1.pngbin0 -> 32940 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/12_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_arslin_ex2.pngbin0 -> 2205 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/13_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_ars_ex1.pngbin0 -> 65581 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/1_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-26-35.eps69401
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/1_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-26-35.pngbin0 -> 392215 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/2_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-32-48.eps62462
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/2_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-32-48.pngbin0 -> 467151 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/3_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-27-25.eps15074
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/3_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-27-25.pngbin0 -> 58974 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/4_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-28-32.eps33895
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/4_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-28-32.pngbin0 -> 180489 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/5_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-51-25.eps41321
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/5_home_moritz_Home_Projekte_Minetest_minetest_m____lyx_img_Bildschirmfoto_2018-08-30_14-51-25.pngbin0 -> 298898 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/6_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex1.eps18740
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/6_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex1.pngbin0 -> 9681 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/7_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex2.eps12586
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/7_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex2.pngbin0 -> 9374 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/8_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_assign_signal.eps27704
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/8_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_assign_signal.pngbin0 -> 117671 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/9_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex3.eps18740
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/9_home_moritz_Home_Projekte_Minetest_minetest_mods_advtrains_assets_lyx_img_route_ex3.pngbin0 -> 11544 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.4ct30
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.4tc29
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.aux4
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.css117
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.dvibin0 -> 65604 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.html830
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.idvbin0 -> 569 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.lg166
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.log555
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.pdfbin0 -> 1419828 bytes-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tex745
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tex.dep7
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tex.dep-pdf57
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.tmp2
-rw-r--r--advtrains/assets/interlocking.html.LyXconv/interlocking.xref73
-rw-r--r--advtrains/assets/interlocking.lyx2026
-rw-r--r--advtrains/assets/interlocking.lyx~2017
-rw-r--r--advtrains/assets/larger rails.xcfbin0 -> 1239132 bytes-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-26-35.pngbin0 -> 392215 bytes-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-27-25.pngbin0 -> 58974 bytes-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-28-32.pngbin0 -> 180489 bytes-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-32-48.pngbin0 -> 467151 bytes-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2018-08-30_14-51-25.pngbin0 -> 298898 bytes-rw-r--r--advtrains/assets/lyx_img/Bildschirmfoto_2019-01-15_19-28-09.pngbin0 -> 135195 bytes-rw-r--r--advtrains/assets/lyx_img/ars_ex1.pngbin0 -> 65581 bytes-rw-r--r--advtrains/assets/lyx_img/arslin_ex1.pngbin0 -> 32940 bytes-rw-r--r--advtrains/assets/lyx_img/arslin_ex2.pngbin0 -> 2205 bytes-rw-r--r--advtrains/assets/lyx_img/assign_signal.pngbin0 -> 117671 bytes-rw-r--r--advtrains/assets/lyx_img/route_ex1.pngbin0 -> 9681 bytes-rw-r--r--advtrains/assets/lyx_img/route_ex2.pngbin0 -> 9374 bytes-rw-r--r--advtrains/assets/lyx_img/route_ex3.pngbin0 -> 11544 bytes-rw-r--r--advtrains/assets/lyx_img/screenshot_20180830_142551.pngbin0 -> 257012 bytes-rw-r--r--advtrains/assets/magleves_lockomotive.blendbin0 -> 747680 bytes-rw-r--r--advtrains/assets/magleves_track.blendbin0 -> 464960 bytes-rw-r--r--advtrains/assets/magleves_wagon.blendbin0 -> 709904 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/0_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_09-43-29.pngbin0 -> 9345 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/10_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-48-54.pngbin0 -> 14032 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/11_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-50-27.pngbin0 -> 4246 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/12_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-51-02.pngbin0 -> 3704 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/13_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-58-39.pngbin0 -> 6880 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/14_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2016-09-17_09-58-20.pngbin0 -> 10375 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/15_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2017-03-09_11-33-09.pngbin0 -> 3496 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/16_home_moritz_Home_Projekte_Minetest_minetest____nual_img_Bildschirmfoto_2017-03-09_11-42-49.pngbin0 -> 25657 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/17_home_moritz_Home_Projekte_Minetest_minetest____ssets_manual_img_screenshot_20161203_231622.pngbin0 -> 108256 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/1_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-04-12.pngbin0 -> 72813 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/2_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-04-57.pngbin0 -> 105448 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/3_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-05-51.pngbin0 -> 93538 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/4_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-07-13.pngbin0 -> 83521 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/5_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_09-56-34.pngbin0 -> 2789 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/6_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-08-02.pngbin0 -> 107762 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/7_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-09-01.pngbin0 -> 112579 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/8_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_10-10-15.pngbin0 -> 114075 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/9_home_moritz_Home_Projekte_Minetest_minetest_m___nual_img_Bildschirmfoto_2016-09-17_09-45-38.pngbin0 -> 16695 bytes-rw-r--r--advtrains/assets/manual.html.LyXconv/manual.css112
-rw-r--r--advtrains/assets/manual.html.LyXconv/manual.html236
-rw-r--r--advtrains/assets/manual.lyx630
-rw-r--r--advtrains/assets/manual.odtbin0 -> 1047714 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-43-29.pngbin0 -> 9345 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-45-38.pngbin0 -> 16695 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-46-21.pngbin0 -> 18834 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-48-54.pngbin0 -> 14032 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-50-27.pngbin0 -> 4246 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-51-02.pngbin0 -> 3704 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-52-17.pngbin0 -> 13788 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-52-40.pngbin0 -> 13889 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-53-01.pngbin0 -> 15473 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-56-34.pngbin0 -> 2789 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-58-20.pngbin0 -> 10375 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_09-58-39.pngbin0 -> 6880 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-04-12.pngbin0 -> 72813 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-04-57.pngbin0 -> 105448 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-05-51.pngbin0 -> 93538 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-07-13.pngbin0 -> 83521 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-08-02.pngbin0 -> 107762 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-09-01.pngbin0 -> 112579 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-09-17_10-10-15.pngbin0 -> 114075 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2016-12-13_19-25-26.pngbin0 -> 15044 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2017-03-09_11-33-09.pngbin0 -> 3496 bytes-rw-r--r--advtrains/assets/manual_img/Bildschirmfoto_2017-03-09_11-42-49.pngbin0 -> 25657 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_223055.pngbin0 -> 824772 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_223328.pngbin0 -> 526640 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_230644.pngbin0 -> 610738 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_230648.pngbin0 -> 555494 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_231622.pngbin0 -> 108256 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_232335.pngbin0 -> 1607786 bytes-rw-r--r--advtrains/assets/manual_img/screenshot_20161203_232545.pngbin0 -> 1527310 bytes-rw-r--r--advtrains/assets/mbbrailtextures/advtrains_dtrack_rail.pngbin0 -> 4582 bytes-rw-r--r--advtrains/assets/mbbrailtextures/advtrains_dtrack_rail_atc.pngbin0 -> 4596 bytes-rw-r--r--advtrains/assets/mbbrailtextures/advtrains_dtrack_rail_detector_on.pngbin0 -> 4579 bytes-rw-r--r--advtrains/assets/modern_japan_lockomotive.blendbin0 -> 892480 bytes-rw-r--r--advtrains/assets/modern_japan_wagon.blendbin0 -> 856968 bytes-rw-r--r--advtrains/assets/oldmodels/locomotive.b3dbin0 -> 181112 bytes-rw-r--r--advtrains/assets/oldmodels/trackvertical1.b3dbin0 -> 629 bytes-rw-r--r--advtrains/assets/oldmodels/trackvertical2.b3dbin0 -> 869 bytes-rw-r--r--advtrains/assets/schild.blendbin0 -> 513160 bytes-rw-r--r--advtrains/assets/schild.blend1bin0 -> 513160 bytes-rw-r--r--advtrains/assets/schild.pngbin0 -> 28705 bytes-rw-r--r--advtrains/assets/schild_flaeche.pngbin0 -> 526 bytes-rw-r--r--advtrains/assets/signal_wall.blendbin0 -> 512620 bytes-rw-r--r--advtrains/assets/signal_wall.pngbin0 -> 107155 bytes-rw-r--r--advtrains/assets/signal_wall_ceiling.blendbin0 -> 512620 bytes-rw-r--r--advtrains/assets/uban_fancy.blendbin0 -> 1020740 bytes-rw-r--r--advtrains/assets/wagonfancytexture.pngbin0 -> 42023 bytes-rw-r--r--advtrains/assets/wagong_fancy.blendbin0 -> 1044484 bytes-rw-r--r--advtrains/atc_command.txt83
-rw-r--r--advtrains/description.txt2
-rw-r--r--advtrains/license.txt198
-rw-r--r--advtrains/license_media.txt68
-rw-r--r--advtrains/modpack.txt0
-rw-r--r--advtrains/privilege_guide.txt43
-rw-r--r--advtrains/readme.txt47
-rw-r--r--advtrains/screenshot.pngbin0 -> 809738 bytes-rw-r--r--advtrains_platform/depends.txt9
-rw-r--r--advtrains_platform/init.lua428
-rwxr-xr-xadvtrains_platform/screenshot.pngbin0 -> 432480 bytes-rw-r--r--advtrains_platform/textures/advtrains_platform_version_node.pngbin0 -> 733 bytes-rwxr-xr-xadvtrains_platform/version_info36
-rw-r--r--apartment/README.md2
-rw-r--r--apartment/handle_schematics.lua670
-rw-r--r--apartment/init.lua966
-rw-r--r--apartment/schems/apartment_4x10_0_270.mtsbin0 -> 497 bytes-rw-r--r--apartment/schems/apartment_4x11_0_180.mtsbin0 -> 489 bytes-rw-r--r--apartment/schems/apartment_4x6_0_90.mtsbin0 -> 349 bytes-rw-r--r--apartment/textures/apartment_controls_occupied.pngbin0 -> 2853 bytes-rw-r--r--apartment/textures/apartment_controls_vacant.pngbin0 -> 2815 bytes-rw-r--r--atm/README.md61
-rw-r--r--atm/depends.txt3
-rw-r--r--atm/init.lua553
-rw-r--r--atm/interest.lua16
-rw-r--r--atm/license.txt19
-rw-r--r--atm/textures/atm2_front.pngbin0 -> 235 bytes-rw-r--r--atm/textures/atm2_side.pngbin0 -> 181 bytes-rw-r--r--atm/textures/atm2_top.pngbin0 -> 161 bytes-rw-r--r--atm/textures/atm3_front.pngbin0 -> 222 bytes-rw-r--r--atm/textures/atm3_side.pngbin0 -> 181 bytes-rw-r--r--atm/textures/atm3_top.pngbin0 -> 161 bytes-rw-r--r--atm/textures/atm_front.pngbin0 -> 272 bytes-rw-r--r--atm/textures/atm_front_wt.pngbin0 -> 356 bytes-rw-r--r--atm/textures/atm_side.pngbin0 -> 196 bytes-rw-r--r--atm/textures/atm_side_wt.pngbin0 -> 305 bytes-rw-r--r--atm/textures/atm_top.pngbin0 -> 159 bytes-rw-r--r--auth_export/README.md35
-rw-r--r--auth_export/channel.lua93
-rw-r--r--auth_export/init.lua26
-rw-r--r--auth_export/webmail.lua53
-rw-r--r--beerchat/LICENSE (renamed from LICENSE)0
-rw-r--r--beerchat/README.md (renamed from README.md)0
-rw-r--r--beerchat/init.lua (renamed from init.lua)0
-rw-r--r--beerchat/mod.conf (renamed from mod.conf)0
-rw-r--r--beerchat/sounds/beerchat_chime.ogg (renamed from sounds/beerchat_chime.ogg)bin11231 -> 11231 bytes-rw-r--r--beerchat/sounds/beerchat_chirp.ogg (renamed from sounds/beerchat_chirp.ogg)bin10382 -> 10382 bytes-rw-r--r--beerchat/sounds/beerchat_utter.ogg (renamed from sounds/beerchat_utter.ogg)bin25028 -> 25028 bytes
769 files changed, 523477 insertions, 0 deletions
diff --git a/advtrains/.gitignore b/advtrains/.gitignore
new file mode 100644
index 0000000..b3180de
--- /dev/null
+++ b/advtrains/.gitignore
@@ -0,0 +1,3 @@
+## Eclipse project files & directories
+.project
+.settings
diff --git a/advtrains/advtrains/api_doc.txt b/advtrains/advtrains/api_doc.txt
new file mode 100644
index 0000000..0256713
--- /dev/null
+++ b/advtrains/advtrains/api_doc.txt
@@ -0,0 +1,190 @@
+Advanced Trains [advtrains] API documentation
+--------
+To use the API, mods must depend on 'advtrains'.
+All boolean values in definition tables default to 'false' and can be omitted.
+### Wagons
+Wagons are registered using the function
+
+advtrains.register_wagon(name, prototype, description, inventory_image)
+- 'name' is the internal name of the wagon. It should follow the mod naming convention, however, this is not enforced.
+ For compatibility reasons, if a mod name is omitted, the wagon will be registered in the advtrains: namespace.
+ Example: A wagon with name="engine_tgv" will be registered as "advtrains:engine_tgv".
+ !IMPORTANT! You must not append a ":" at the start of the name, even if you want to bypass the mod naming convention check. This is because internally the register_wagon function
+ appends a ":" automatically.
+- 'prototype' is the lua entity prototype. The regular definition keys for luaentites apply. Additional required and optional properties see below. DO NOT define 'on_step', 'on_activate', 'on_punch', 'on_rightclick' and 'get_staticdata' since these will be overridden. Use 'custom_*' instead.
+- 'description' is the description of the inventory item that is used to place the wagon.
+- 'inventory_image' is the inventory image of said item.
+
+# Wagon prototype properties
+{
+ ... all regular luaentity properties (mesh, textures, collisionbox a.s.o)...
+ drives_on = {default=true},
+ ^- used to define the tracktypes (see below) that wagon can drive on. The tracktype identifiers are given as keys, similar to privileges)
+ max_speed = 10,
+ ^- optional, default 10: defines the maximum speed this wagon can drive. The maximum speed of a train is determined by the wagon with the lowest max_speed value.
+ seats = {
+ ^- contains zero or more seat definitions. A seat is a place where a player can be attached when getting on a wagon.
+ {
+ name="Left front window",
+ ^- display name of this seat
+ attach_offset={x=0, y=10, z=0},
+ ^- this value is passed to 'set_attach'
+ view_offset={x=0, y=6, z=0},
+ ^- player:set_eye_offset is called with this parameter.
+ group="default"
+ ^- optional. Defines the seat group. See 'seat_groups' below
+ -!- Note: driving_ctrl_access field has moved to seat group definition,
+ -!- but is still partwise supported here. If you don't use seat groups yet,
+ -!- you really should change NOW!
+ },
+ },
+ seat_groups = {
+ ^- If defined, activates advanced seating behavior. See "seating behavior".
+ default = {
+ name = "Seats"
+ ^- name of this seat group, to be shown in get-on menu.
+ access_to = {"foo", "bar"}
+ ^- List of seat groups you can access from this seat using the menu when sitting inside the train.
+ require_doors_open = true
+ ^- Only allow getting on and off if doors are open.
+ driving_ctrl_access=false,
+ ^- If the seat is a driver stand, and players sitting here should get access to the train's driving control.
+ }
+ }
+ assign_to_seat_group = {"default"},
+ ^- optional, like seat_groups. When player right_clicks the wagon, player will be assigned to the first free seat group in the list.
+
+ doors={
+ ^- optional. If defined, defines door animation frames. Opposite door has to be closed during animation period.
+ ^- Remember, advtrains can't handle doors on both sides opened simultaneously.
+ open={
+ [-1]={frames={x=0, y=20}, time=1}, -- open left doors
+ [1]={frames={x=40, y=60}, time=1} -- open right doors
+ sound = <simpleSoundSpec>
+ ^- The sound file of the doors opening. If none is specified, nothing is played.
+ },
+ close={
+ [-1]={frames={x=20, y=40}, time=1}, -- close left doors
+ [1]={frames={x=60, y=80}, time=1} -- close right doors
+ sound = <simpleSoundSpec>
+ ^- The sound file of the doors closing. If none is specified, nothing is played.
+ }
+ },
+ door_entry={ 1.5, -1.5 }
+ ^- optional. If defined, defines the locations of the doors on the model as distance from the object center on the path.
+ ^- Getting on by walking in then takes effect.
+ ^- Positive values mean front, negative ones back. Resulting position is automatically shifted to the right side.
+
+ wagon_span=2,
+ ^- How far this wagon extends from its base position. Is the half of the wagon length.
+ ^- Used to determine in which distance the other wagons have to be positioned. Will require tweaking.
+ extent_h = 1,
+ ^- Determines the collision box extent in x/z direction. Defaults to 1 (=3x3)
+ ^- The actual bounding box size is (extent_h*2)+1, so 0 means 1x1, 1 means 3x3 and 2 means 5x5
+ extent_v = 2,
+ ^- Determines the collision box extent in y direction. Defaults to 2 (=3).
+ ^- The actual bounding box size is extent_v+1, so 0 means 1, 1 means 2, 2 means 3 a.s.o.
+ horn_sound = <simpleSoundSpec>,
+ ^- The sound file of the horn. If none is specified, this wagon can't sound a horn. The specified sound file will be looped.
+
+ drops = {"default:steelblock 3"}
+ ^- List of itemstrings what to drop when the wagon is destroyed
+
+ has_inventory = false
+ ^- If this wagon has an inventory. The inventory is saved with the wagon.
+ ^- the following settings are ignored if not.
+ inventory_list_sizes = {
+ box=8*6,
+ },
+ ^- List of assignments of type list_name=size.
+ ^- For every entry, an inventory list is created with the specified size.
+ get_inventory_formspec = function(self, player_name, inventory_name)
+ return "<a formspec>"
+ end,
+ ^- Function that should return the formspec to be displayed when <player> requests to open the wagon's inventory.
+ ^- advtrains.standard_inventory_formspec can be used for ordinary wagons with inventories to show
+ ^- both the inventory grid and a 'Wagon properties' button.
+ ^- Use "list["..inventory_name..";<list_name>;<X>,<Y>;<W>,<H>;<Start>]" to display a wagon's inventory list.
+
+ custom_on_step = function(self, dtime) end
+ ^- optional: Execute custom code on every step
+ custom_on_activate = function(self, dtime_s) end
+ ^- optional: Execute custom code on activate. Staticdata does not need to be saved and restored since all properties written in 'self' are preserved over unloads.
+ custom_on_velocity_change = function(self, velocity, old_velocity) end
+ ^- optional: Function that is called whenever the train's velocity changes or every 2 seconds. Used to call 'self.object:update_animation()' if needed.
+ ^- for compatibility reasons the name 'update_animation' for this function is still supported.
+
+}
+
+# Notes on wagons
+
+- Every wagon has the field 'id' which assigns each wagon a random id.
+- Properties written in the Lua Entity (self) are discarded when the wagon entity is unloaded. At the moment there is no way to store data inside a wagon persistently.
+- Assuming Z Axis as the axis parallel to the tracks and Y Axis as the one pointing into the sky, wagon models should be dimensioned in a way that:
+ - their origin is centered in X and Z direction
+ - their origin lies 0.5 units above the bottom of the model
+ - the overall extent in X and Y direction is <=3 units
+- wagon_span is then the distance between the model origin and the Z axis extent.
+
+# Seating behavior
+If the advanced seating behavior is active, clicking on a wagon will immediately get you on that wagon depending on the entries in assign_to_seat_group.
+If all seat groups are full, if the doors are closed or if you are not authorized to enter this seat group(e.g. driver stands), will show a warning.
+On a train, right-clicking the wagon will make you get off the train unless:
+- the doors are closed and it requires open doors.
+- you have access to a seat group specified in access_to (you may enter it and it's not full)
+- you are the owner and can access the wagon preferences
+In case there's no possibility, does nothing.
+In case there are multiple possibilities, will show a form.
+
+If you can't enter or leave a train because the doors are closed, holding the Sneak key while right-clicking bypasses the "doors have to be open" enforcement.
+
+### Tracks
+Most modders will be satisfied with the built-in tracks. If cog railways, maglev trains and mine trains are added, it is necessary to understand the definition of tracks. Although the tracks API is there, explaining it would require more effort than me creating the wanted definitions myself. Contact me if you need to register your own rails using my registration functions.
+
+However, it is still possible to register single rails by understanding the node properties of rails.
+minetest.register_node(nodename, {
+ ... usual node definition ...
+ groups = {
+ advtrains_track = 1,
+ advtrains_track_<tracktype>=1
+ ^- these groups tell that the node is a track
+ not_blocking_trains=1,
+ ^- this group tells that the node should not block trains although it's walkable.
+ },
+
+ at_rail_y = 0,
+ ^- Height of this rail node (the y position of a wagon that stands centered on this rail)
+ at_conns = {
+ [1] = { c=0..15, y=0..1 },
+ [2] = { c=0..15, y=0..1 },
+ ( [3] = { c=0..15, y=0..1 }, )
+ ( [4] = { c=0..15, y=0..1 }, )
+ }
+ ^- Connections of this rail. There can be up to 4 connections.
+ 2 connections are a normal rail, 3 connections a turnout (1->2 and 2/3->1) and 4 connections a crossing (1<>2 and 3<>4)
+ c is the direction of the connection (0-16) and y is the height of the connection (rail will only connect when this matches)
+
+ can_dig=function(pos)
+ return not advtrains.get_train_at_pos(pos)
+ end,
+ after_dig_node=function(pos)
+ advtrains.ndb.update(pos)
+ end,
+ after_place_node=function(pos)
+ advtrains.ndb.update(pos)
+ end,
+ ^- the code in these 3 default minetest API functions is required for advtrains to work, however you can add your own code
+
+ advtrains = {
+ on_train_enter=function(pos, train_id, train, index) end
+ ^- called when a train enters the rail
+ on_train_leave=function(pos, train_id, train, index) end
+ ^- called when a train leaves the rail
+
+ -- The following function is only in effect when interlocking is enabled:
+ on_train_approach = function(pos, train_id, train, index, lzbdata)
+ ^- called when a train is approaching this position, called exactly once for every path recalculation (which can happen at any time)
+ ^- This is called so that if the train would start braking now, it would come to halt about(wide approx) 5 nodes before the rail.
+ ^- lzbdata should be ignored and nothing should be assigned to it
+ }
+})
diff --git a/advtrains/advtrains/atc.lua b/advtrains/advtrains/atc.lua
new file mode 100644
index 0000000..20f52b9
--- /dev/null
+++ b/advtrains/advtrains/atc.lua
@@ -0,0 +1,342 @@
+--atc.lua
+--registers and controls the ATC system
+
+local atc={}
+
+local eval_conditional
+
+-- ATC persistence table. advtrains.atc is created by init.lua when it loads the save file.
+atc.controllers = {}
+function atc.load_data(data)
+ local temp = data and data.controllers or {}
+ --transcode atc controller data to node hashes: table access times for numbers are far less than for strings
+ for pts, data in pairs(temp) do
+ if type(pts)=="number" then
+ pts=minetest.pos_to_string(minetest.get_position_from_hash(pts))
+ end
+ atc.controllers[pts] = data
+ end
+end
+function atc.save_data()
+ return {controllers = atc.controllers}
+end
+--contents: {command="...", arrowconn=0-15 where arrow points}
+
+--general
+function atc.train_set_command(train, command, arrow)
+ atc.train_reset_command(train, true)
+ train.atc_delay = 0
+ train.atc_arrow = arrow
+ train.atc_command = command
+end
+
+function atc.send_command(pos, par_tid)
+ local pts=minetest.pos_to_string(pos)
+ if atc.controllers[pts] then
+ --atprint("Called send_command at "..pts)
+ local train_id = par_tid or advtrains.get_train_at_pos(pos)
+ if train_id then
+ if advtrains.trains[train_id] then
+ --atprint("send_command inside if: "..sid(train_id))
+ if atc.controllers[pts].arrowconn then
+ atlog("ATC controller at",pts,": This controller had an arrowconn of", atc.controllers[pts].arrowconn, "set. Since this field is now deprecated, it was removed.")
+ atc.controllers[pts].arrowconn = nil
+ end
+
+ local train = advtrains.trains[train_id]
+ local index = advtrains.path_lookup(train, pos)
+
+ local iconnid = 1
+ if index then
+ iconnid = train.path_cn[index]
+ else
+ atwarn("ATC rail at", pos, ": Rail not on train's path! Can't determine arrow direction. Assuming +!")
+ end
+
+ local command = atc.controllers[pts].command
+ command = eval_conditional(command, iconnid==1, train.velocity)
+ if not command then command="" end
+ command=string.match(command, "^%s*(.*)$")
+
+ if command == "" then
+ atprint("Sending ATC Command to", train_id, ": Not modifying, conditional evaluated empty.")
+ return true
+ end
+
+ atc.train_set_command(train, command, iconnid==1)
+ atprint("Sending ATC Command to", train_id, ":", command, "iconnid=",iconnid)
+ return true
+
+ else
+ atwarn("ATC rail at", pos, ": Sending command failed: The train",train_id,"does not exist. This seems to be a bug.")
+ end
+ else
+ atwarn("ATC rail at", pos, ": Sending command failed: There's no train at this position. This seems to be a bug.")
+ end
+ else
+ atwarn("ATC rail at", pos, ": Sending command failed: Entry for controller not found.")
+ atwarn("ATC rail at", pos, ": Please visit controller and click 'Save'")
+ end
+ return false
+end
+
+-- Resets any ATC commands the train is currently executing, including the target speed (tarvelocity) it is instructed to hold
+-- if keep_tarvel is set, does not clear the tarvelocity
+function atc.train_reset_command(train, keep_tarvel)
+ train.atc_command=nil
+ train.atc_delay=nil
+ train.atc_brake_target=nil
+ train.atc_wait_finish=nil
+ train.atc_arrow=nil
+ if not keep_tarvel then
+ train.tarvelocity=nil
+ end
+end
+
+--nodes
+local idxtrans={static=1, mesecon=2, digiline=3}
+local apn_func=function(pos)
+ -- FIX for long-persisting ndb bug: there's no node in parameter 2 of this function!
+ local meta=minetest.get_meta(pos)
+ if meta then
+ meta:set_string("infotext", attrans("ATC controller, unconfigured."))
+ meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
+ end
+end
+
+advtrains.atc_function = function(def, preset, suffix, rotation)
+ return {
+ after_place_node=apn_func,
+ after_dig_node=function(pos)
+ return advtrains.pcall(function()
+ advtrains.invalidate_all_paths(pos)
+ advtrains.ndb.clear(pos)
+ local pts=minetest.pos_to_string(pos)
+ atc.controllers[pts]=nil
+ end)
+ end,
+ on_receive_fields = function(pos, formname, fields, player)
+ return advtrains.pcall(function()
+ if advtrains.is_protected(pos, player:get_player_name()) then
+ minetest.record_protection_violation(pos, player:get_player_name())
+ return
+ end
+ local meta=minetest.get_meta(pos)
+ if meta then
+ if not fields.save then
+ --maybe only the dropdown changed
+ if fields.mode then
+ meta:set_string("mode", idxtrans[fields.mode])
+ if fields.mode=="digiline" then
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nChannel: @2", (fields.mode or "?"), meta:get_string("command")) )
+ else
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nCommand: @2", (fields.mode or "?"), meta:get_string("command")) )
+ end
+ meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
+ end
+ return
+ end
+ meta:set_string("mode", idxtrans[fields.mode])
+ meta:set_string("command", fields.command)
+ meta:set_string("command_on", fields.command_on)
+ meta:set_string("channel", fields.channel)
+ if fields.mode=="digiline" then
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nChannel: @2", (fields.mode or "?"), meta:get_string("command")) )
+ else
+ meta:set_string("infotext", attrans("ATC controller, mode @1\nCommand: @2", (fields.mode or "?"), meta:get_string("command")) )
+ end
+ meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta))
+
+ local pts=minetest.pos_to_string(pos)
+ local _, conns=advtrains.get_rail_info_at(pos, advtrains.all_tracktypes)
+ atc.controllers[pts]={command=fields.command}
+ if #advtrains.occ.get_trains_at(pos) > 0 then
+ atc.send_command(pos)
+ end
+ end
+ end)
+ end,
+ advtrains = {
+ on_train_enter = function(pos, train_id)
+ atc.send_command(pos)
+ end,
+ },
+ }
+end
+
+function atc.get_atc_controller_formspec(pos, meta)
+ local mode=tonumber(meta:get_string("mode")) or 1
+ local command=meta:get_string("command")
+ local command_on=meta:get_string("command_on")
+ local channel=meta:get_string("channel")
+ local formspec="size[8,6]"
+ -- "dropdown[0,0;3;mode;static,mesecon,digiline;"..mode.."]"
+ if mode<3 then
+ formspec=formspec.."field[0.5,1.5;7,1;command;"..attrans("Command")..";"..minetest.formspec_escape(command).."]"
+ if tonumber(mode)==2 then
+ formspec=formspec.."field[0.5,3;7,1;command_on;"..attrans("Command (on)")..";"..minetest.formspec_escape(command_on).."]"
+ end
+ else
+ formspec=formspec.."field[0.5,1.5;7,1;channel;"..attrans("Digiline channel")..";"..minetest.formspec_escape(channel).."]"
+ end
+ return formspec.."button_exit[0.5,4.5;7,1;save;"..attrans("Save").."]"
+end
+
+--from trainlogic.lua train step
+local matchptn={
+ ["SM"]=function(id, train)
+ train.tarvelocity=train.max_speed
+ return 2
+ end,
+ ["S([0-9]+)"]=function(id, train, match)
+ train.tarvelocity=tonumber(match)
+ return #match+1
+ end,
+ ["B([0-9]+)"]=function(id, train, match)
+ if train.velocity>tonumber(match) then
+ train.atc_brake_target=tonumber(match)
+ if not train.tarvelocity or train.tarvelocity>train.atc_brake_target then
+ train.tarvelocity=train.atc_brake_target
+ end
+ end
+ return #match+1
+ end,
+ ["BB"]=function(id, train)
+ train.atc_brake_target = -1
+ train.tarvelocity = 0
+ return 2
+ end,
+ ["W"]=function(id, train)
+ train.atc_wait_finish=true
+ return 1
+ end,
+ ["D([0-9]+)"]=function(id, train, match)
+ train.atc_delay=tonumber(match)
+ return #match+1
+ end,
+ ["R"]=function(id, train)
+ if train.velocity<=0 then
+ advtrains.invert_train(id)
+ advtrains.train_ensure_init(id, train)
+ -- no one minds if this failed... this shouldn't even be called without train being initialized...
+ else
+ atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving!"))
+ end
+ return 1
+ end,
+ ["O([LRC])"]=function(id, train, match)
+ local tt={L=-1, R=1, C=0}
+ local arr=train.atc_arrow and 1 or -1
+ train.door_open = tt[match]*arr
+ return 2
+ end,
+}
+
+eval_conditional = function(command, arrow, speed)
+ --conditional statement?
+ local is_cond, cond_applies, compare
+ local cond, rest=string.match(command, "^I([%+%-])(.+)$")
+ if cond then
+ is_cond=true
+ if cond=="+" then
+ cond_applies=arrow
+ end
+ if cond=="-" then
+ cond_applies=not arrow
+ end
+ else
+ cond, compare, rest=string.match(command, "^I([<>]=?)([0-9]+)(.+)$")
+ if cond and compare then
+ is_cond=true
+ if cond=="<" then
+ cond_applies=speed<tonumber(compare)
+ end
+ if cond==">" then
+ cond_applies=speed>tonumber(compare)
+ end
+ if cond=="<=" then
+ cond_applies=speed<=tonumber(compare)
+ end
+ if cond==">=" then
+ cond_applies=speed>=tonumber(compare)
+ end
+ end
+ end
+ if is_cond then
+ atprint("Evaluating if statement: "..command)
+ atprint("Cond: "..(cond or "nil"))
+ atprint("Applies: "..(cond_applies and "true" or "false"))
+ atprint("Rest: "..rest)
+ --find end of conditional statement
+ local nest, pos, elsepos=0, 1
+ while nest>=0 do
+ if pos>#rest then
+ atwarn(sid(id), attrans("ATC command syntax error: I statement not closed: @1",command))
+ return ""
+ end
+ local char=string.sub(rest, pos, pos)
+ if char=="I" then
+ nest=nest+1
+ end
+ if char==";" then
+ nest=nest-1
+ end
+ if nest==0 and char=="E" then
+ elsepos=pos+0
+ end
+ pos=pos+1
+ end
+ if not elsepos then elsepos=pos-1 end
+ if cond_applies then
+ command=string.sub(rest, 1, elsepos-1)..string.sub(rest, pos)
+ else
+ command=string.sub(rest, elsepos+1, pos-2)..string.sub(rest, pos)
+ end
+ atprint("Result: "..command)
+ end
+ return command
+end
+
+function atc.execute_atc_command(id, train)
+ --strip whitespaces
+ local command=string.match(train.atc_command, "^%s*(.*)$")
+
+
+ if string.match(command, "^%s*$") then
+ train.atc_command=nil
+ return
+ end
+
+ train.atc_command = eval_conditional(command, train.atc_arrow, train.velocity)
+
+ if not train.atc_command then return end
+ command=string.match(train.atc_command, "^%s*(.*)$")
+
+ if string.match(command, "^%s*$") then
+ train.atc_command=nil
+ return
+ end
+
+ for pattern, func in pairs(matchptn) do
+ local match=string.match(command, "^"..pattern)
+ if match then
+ local patlen=func(id, train, match)
+
+ atprint("Executing: "..string.sub(command, 1, patlen))
+
+ train.atc_command=string.sub(command, patlen+1)
+ if train.atc_delay<=0 and not train.atc_wait_finish then
+ --continue (recursive, cmds shouldn't get too long, and it's a end-recursion.)
+ atc.execute_atc_command(id, train)
+ end
+ return
+ end
+ end
+ atwarn(sid(id), attrans("ATC command parse error: Unknown command: @1", command))
+ atc.train_reset_command(train, true)
+end
+
+
+
+--move table to desired place
+advtrains.atc=atc
diff --git a/advtrains/advtrains/copytool.lua b/advtrains/advtrains/copytool.lua
new file mode 100644
index 0000000..dc18081
--- /dev/null
+++ b/advtrains/advtrains/copytool.lua
@@ -0,0 +1,185 @@
+--clipboard = {trainlen = number, [n] = {type = string, flipped = bool, }
+
+-- Yaw is in radians. There are 2pi rad in a circle. North is the 0 point and the angle increases anticlockwise.
+-- 4.712389 = 1.5pi; sin(1.5pi) = -1
+-- 7.853981 = 2.5pi; sin(2.5pi) = 1
+
+minetest.register_tool("advtrains:copytool", {
+ description = attrans("Train copy/paste tool\n\nLeft-click: copy train\nRight-click: paste train"),
+ inventory_image = "advtrains_copytool.png",
+ wield_image = "advtrains_copytool.png",
+ stack_max = 1,
+ -- Paste: Take the clipboard and the player yaw, and attempt to place a new train in the world.
+ -- The front of the train is used as the start of the new train and it proceeds backwards from
+ -- the direction of travel.
+ on_place = function(itemstack, placer, pointed_thing)
+ return advtrains.pcall(function()
+ if ((not pointed_thing.type == "node") or (not placer.get_player_name)) then
+ return
+ end
+ local pname = placer:get_player_name()
+
+ local node=minetest.get_node_or_nil(pointed_thing.under)
+ if not node then atprint("[advtrains]Ignore at placer position") return itemstack end
+ local nodename=node.name
+ if(not advtrains.is_track_and_drives_on(nodename, {default=true})) then
+ atprint("no track here, not placing.")
+ return itemstack
+ end
+ if not minetest.check_player_privs(placer, {train_operator = true }) then
+ minetest.chat_send_player(pname, "You don't have the train_operator privilege.")
+ return itemstack
+ end
+ if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
+ return itemstack
+ end
+ local tconns=advtrains.get_track_connections(node.name, node.param2)
+ local yaw = placer:get_look_horizontal()
+ local plconnid = advtrains.yawToClosestConn(yaw, tconns)
+
+ local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true})
+ if not prevpos then
+ minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!")
+ return
+ end
+
+ local meta = itemstack:get_meta()
+ if not meta then
+ minetest.chat_send_player(pname, attrans("The clipboard couldn't access the metadata. Paste failed."))
+ return
+ end
+ local clipboard = meta:get_string("clipboard")
+ if (clipboard == "") then
+ minetest.chat_send_player(pname, "The clipboard is empty.");
+ return
+ end
+ clipboard = minetest.deserialize(clipboard)
+ if (clipboard.wagons == nil) then
+ minetest.chat_send_player(pname, "The clipboard is empty.");
+ return
+ end
+
+ local wagons = {}
+ local n = 1
+ for _, wagonProto in pairs(clipboard.wagons) do
+ local wagon = advtrains.create_wagon(wagonProto.type, pname)
+ advtrains.wagons[wagon].wagon_flipped = wagonProto.wagon_flipped
+ wagons[n] = wagon
+ n = n + 1
+ end
+
+ local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, wagons)
+ local train = advtrains.trains[id]
+ train.off_track = train.end_index<train.path_trk_b
+ if (train.off_track) then
+ minetest.chat_send_player(pname, "Back of train would end up off track, cancelling.")
+ advtrains.remove_train(id)
+ return
+ end
+ train.text_outside = clipboard.text_outside
+ train.text_inside = clipboard.text_inside
+ train.routingcode = clipboard.routingcode
+ train.line = clipboard.line
+
+ return
+ end)
+ end,
+ -- Copy: Take the pointed-at train and put it on the clipboard
+ on_use = function(itemstack, user, pointed_thing)
+ if not user:get_player_name() then return end
+ if (pointed_thing.type ~= "object") then return end
+
+ local le = pointed_thing.ref:get_luaentity()
+ if (le == nil) then
+ minetest.chat_send_player(user:get_player_name(), "No such lua entity!")
+ return
+ end
+
+ local wagon = advtrains.wagons[le.id]
+ if (not (le.id and advtrains.wagons[le.id])) then
+ minetest.chat_send_player(user:get_player_name(), string.format("No such wagon: %s", le.id))
+ return
+ end
+
+ local train = advtrains.trains[wagon.train_id]
+ if (not train) then
+ minetest.chat_send_player(user:get_player_name(), string.format("No such train: %s", wagon.train_id))
+ return
+ end
+
+ -- Record the train length. The paste operation should require this much free space.
+ local clipboard = {
+ trainlen = math.ceil(train.trainlen),
+ text_outside = train.text_outside,
+ text_inside = train.text_inside,
+ routingcode = train.routingcode,
+ line = train.line,
+ wagons = {}
+ }
+ local trainLength = math.ceil(train.trainlen)
+
+ local n = 1
+ for _, wagonid in pairs(train.trainparts) do
+ local wagon = advtrains.wagons[wagonid]
+ clipboard.wagons[n] = {
+ wagon_flipped = wagon.wagon_flipped,
+ type = wagon.type
+ }
+ n = n + 1
+ end
+
+
+ local function flip_clipboard(wagon_clipboard)
+ local flipped = {}
+ local numWagons = #wagon_clipboard
+ for k, v in ipairs(wagon_clipboard) do
+ local otherSide = (numWagons-k)+1
+ flipped[otherSide] = v
+ local wagon = flipped[otherSide]
+ wagon.wagon_flipped = not wagon.wagon_flipped
+ end
+ return flipped
+ end
+
+ local function is_loco(wagon_id)
+ local wagon = advtrains.wagons[wagon_id]
+ if (not wagon) then return false end
+ local wagon_proto = advtrains.wagon_prototypes[wagon.type or wagon.entity_name]
+ if wagon_proto and wagon_proto.is_locomotive then
+ return true
+ end
+ return false
+ end
+
+ -- Decide on a new 'front of train' and possibly flip the train.
+ -- Locomotive on one end = loco-hauled, that end is front;
+ -- if (advtrains.wagons[train.trainparts[1]].is_locomotive) then -- do nothing, train is already in right order
+ local numWagons = #train.trainparts
+ local backLoco = train.trainparts[numWagons]
+ backLoco = is_loco(backLoco)
+ local frontLoco = train.trainparts[1]
+ frontLoco = is_loco(frontLoco)
+ if ((backLoco) and (not frontLoco)) then
+ clipboard.wagons = flip_clipboard(clipboard.wagons)
+ --minetest.chat_send_player(user:get_player_name(), "Flipped train: Loco-hauled")
+ end
+ -- locomotives on both ends = train is push-pull / multi-unit, has no front, do nothing
+ -- no locomotives on ends = rake of wagons, front is end closest to where player copied.
+ if ((not frontLoco) and (not backLoco)) then
+
+ if (wagon.pos_in_trainparts / numWagons > 0.5) then -- towards the end of the rain
+ clipboard.wagons = flip_clipboard(clipboard.wagons)
+ --minetest.chat_send_player(user:get_player_name(), "Flipped train: Rake")
+ end
+ end
+
+ local meta = itemstack:get_meta()
+ if not meta then
+ minetest.chat_send_player(pname, attrans("The clipboard couldn't access the metadata. Copy failed."))
+ return
+ end
+ meta:set_string("clipboard", minetest.serialize(clipboard))
+ minetest.chat_send_player(user:get_player_name(), attrans("Train copied!"))
+ return itemstack
+ end
+}) \ No newline at end of file
diff --git a/advtrains/advtrains/couple.lua b/advtrains/advtrains/couple.lua
new file mode 100644
index 0000000..1b213c2
--- /dev/null
+++ b/advtrains/advtrains/couple.lua
@@ -0,0 +1,192 @@
+--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 couple_max_dist=3
+
+minetest.register_entity("advtrains:discouple", {
+ visual="sprite",
+ textures = {"advtrains_discouple.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+
+ is_discouple=true,
+ static_save = false,
+ on_activate=function(self, staticdata)
+ if staticdata=="DISCOUPLE" then
+ --couple entities have no right to exist further...
+ atprint("Discouple loaded from staticdata, destroying")
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immortal=1})
+ end,
+ get_staticdata=function() return "DISCOUPLE" end,
+ on_punch=function(self, player)
+ return advtrains.pcall(function()
+ local pname = player:get_player_name()
+ if pname and pname~="" and self.wagon then
+ if advtrains.safe_decouple_wagon(self.wagon.id, pname) then
+ self.object:remove()
+ else
+ minetest.add_entity(self.object:getpos(), "advtrains:lockmarker")
+ end
+ end
+ end)
+ end,
+ on_step=function(self, dtime)
+ return advtrains.pcall(function()
+ 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
+ if not self.wagon:train() or self.wagon:train().velocity > 0 then
+ self.object:remove()
+ return
+ end
+ end)
+ end,
+})
+
+-- advtrains:couple
+-- Couple entity
+local function lockmarker(obj)
+ minetest.add_entity(obj:get_pos(), "advtrains:lockmarker")
+ obj:remove()
+end
+
+minetest.register_entity("advtrains:couple", {
+ visual="sprite",
+ textures = {"advtrains_couple.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+
+ is_couple=true,
+ static_save = false,
+ on_activate=function(self, staticdata)
+ return advtrains.pcall(function()
+ if staticdata=="COUPLE" then
+ --couple entities have no right to exist further...
+ atprint("Couple loaded from staticdata, destroying")
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immmortal=1})
+ end)
+ end,
+ get_staticdata=function(self) return "COUPLE" end,
+ on_rightclick=function(self, clicker)
+ return advtrains.pcall(function()
+ if not self.train_id_1 or not self.train_id_2 then return end
+
+ local pname=clicker
+ if type(clicker)~="string" then pname=clicker:get_player_name() end
+
+ if advtrains.safe_couple_trains(self.train_id_1, self.train_id_2, self.t1_is_front, self.t2_is_front, pname) then
+ self.object:remove()
+ else
+ lockmarker(self.object)
+ end
+ end)
+ end,
+ on_step=function(self, dtime)
+ return advtrains.pcall(function()
+ advtrains.atprint_context_tid=self.train_id_1
+
+ if not self.train_id_1 or not self.train_id_2 then atprint("Couple: train ids not set!") self.object:remove() return end
+ local train1=advtrains.trains[self.train_id_1]
+ local train2=advtrains.trains[self.train_id_2]
+ if not train1 or not train2 then
+ atprint("Couple: trains missing, destroying")
+ self.object:remove()
+ return
+ end
+
+ --shh, silence here, this is an on-step callback!
+ if not advtrains.train_ensure_init(self.train_id_1, train1) then
+ --atwarn("Train",self.train_id_1,"is not initialized! Operation aborted!")
+ return
+ end
+ if not advtrains.train_ensure_init(self.train_id_2, train2) then
+ --atwarn("Train",self.train_id_2,"is not initialized! Operation aborted!")
+ return
+ end
+
+ if train1.velocity>0 or train2.velocity>0 then
+ if not self.position_set then --ensures that train stands a single time before check fires. Using flag below
+ return
+ end
+ atprint("Couple: train is moving, destroying")
+ self.object:remove()
+ return
+ end
+
+ if not self.position_set then
+ local tp1
+ if self.t1_is_front then
+ tp1=advtrains.path_get_interpolated(train1, train1.index)
+ else
+ tp1=advtrains.path_get_interpolated(train1, train1.end_index)
+ end
+ local tp2
+ if self.t2_is_front then
+ tp2=advtrains.path_get_interpolated(train2, train2.index)
+ else
+ tp2=advtrains.path_get_interpolated(train2, train2.end_index)
+ end
+ local pos_median=advtrains.pos_median(tp1, tp2)
+ if not vector.equals(pos_median, self.object:getpos()) then
+ self.object:setpos(pos_median)
+ end
+ self.position_set=true
+ end
+ atprintbm("couple step", t)
+ advtrains.atprint_context_tid=nil
+
+ end)
+ end,
+})
+minetest.register_entity("advtrains:lockmarker", {
+ visual="sprite",
+ textures = {"advtrains_cpl_lock.png"},
+ collisionbox = {-0.3,-0.3,-0.3, 0.3,0.3,0.3},
+ visual_size = {x=0.7, y=0.7},
+ initial_sprite_basepos = {x=0, y=0},
+
+ is_lockmarker=true,
+ static_save = false,
+ on_activate=function(self, staticdata)
+ return advtrains.pcall(function()
+ if staticdata=="COUPLE" then
+ --couple entities have no right to exist further...
+ atprint("Couple loaded from staticdata, destroying")
+ self.object:remove()
+ return
+ end
+ self.object:set_armor_groups({immmortal=1})
+ self.life=5
+ end)
+ end,
+ get_staticdata=function(self) return "COUPLE" end,
+ on_step=function(self, dtime)
+ self.life=(self.life or 5)-dtime
+ if self.life<0 then
+ self.object:remove()
+ end
+ end,
+})
diff --git a/advtrains/advtrains/craft_items.lua b/advtrains/advtrains/craft_items.lua
new file mode 100644
index 0000000..0e693eb
--- /dev/null
+++ b/advtrains/advtrains/craft_items.lua
@@ -0,0 +1,23 @@
+
+core.register_craftitem("advtrains:boiler", {
+ description = attrans("Boiler"),
+ inventory_image = "advtrains_boiler.png",
+})
+
+
+core.register_craftitem("advtrains:driver_cab", {
+ description = attrans("driver's cab"),
+ inventory_image = "advtrains_driver_cab.png",
+})
+
+
+core.register_craftitem("advtrains:wheel", {
+ description = attrans("Wheel"),
+ inventory_image = "advtrains_wheel.png",
+})
+
+
+core.register_craftitem("advtrains:chimney", {
+ description = attrans("Chimney"),
+ inventory_image = "advtrains_chimney.png",
+})
diff --git a/advtrains/advtrains/crafting.lua b/advtrains/advtrains/crafting.lua
new file mode 100644
index 0000000..cb0813c
--- /dev/null
+++ b/advtrains/advtrains/crafting.lua
@@ -0,0 +1,76 @@
+--advtrains by orwell96, see readme.txt and license.txt
+--crafting.lua
+--registers crafting recipes
+
+--tracks: see advtrains_train_track
+--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'},
+ },
+})
+
+--boiler
+minetest.register_craft({
+ output = 'advtrains:boiler',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'doors:trapdoor_steel', '', 'default:steel_ingot'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ },
+})
+
+--drivers'cab
+minetest.register_craft({
+ output = 'advtrains:driver_cab',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'', '', 'default:glass'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ },
+})
+
+--drivers'cab
+minetest.register_craft({
+ output = 'advtrains:wheel',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
+ {'', 'default:steel_ingot', ''},
+ },
+})
+
+--chimney
+minetest.register_craft({
+ output = 'advtrains:chimney',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'', 'default:steel_ingot', 'default:torch'},
+ {'', 'default:steel_ingot', ''},
+ },
+})
+
+
+--misc_nodes
+--crafts for platforms see misc_nodes.lua
diff --git a/advtrains/advtrains/debugitems.lua b/advtrains/advtrains/debugitems.lua
new file mode 100644
index 0000000..e672308
--- /dev/null
+++ b/advtrains/advtrains/debugitems.lua
@@ -0,0 +1,53 @@
+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,
+}
+)
+
+minetest.register_chatcommand("atyaw",
+ {
+ params = "angledeg conn1 conn2",
+ description = "",
+ func = function(name, param)
+ local angledegs, conn1s, conn2s = string.match(param, "^(%S+)%s(%S+)%s(%S+)$")
+ if angledegs and conn1s and conn2s then
+ local angledeg, conn1, conn2 = angledegs+0,conn1s+0,conn2s+0
+ local yaw = angledeg*math.pi/180
+ local yaw1 = advtrains.dir_to_angle(conn1)
+ local yaw2 = advtrains.dir_to_angle(conn2)
+ local adiff1 = advtrains.minAngleDiffRad(yaw, yaw1)
+ local adiff2 = advtrains.minAngleDiffRad(yaw, yaw2)
+
+ atdebug("yaw1",atfloor(yaw1*180/math.pi))
+ atdebug("yaw2",atfloor(yaw2*180/math.pi))
+ atdebug("dif1",atfloor(adiff1*180/math.pi))
+ atdebug("dif2",atfloor(adiff2*180/math.pi))
+
+ minetest.chat_send_all(advtrains.yawToAnyDir(yaw))
+ return true, advtrains.yawToDirection(yaw, conn1, conn2)
+ end
+ end,
+})
diff --git a/advtrains/advtrains/debugringbuffer.lua b/advtrains/advtrains/debugringbuffer.lua
new file mode 100644
index 0000000..704c0c5
--- /dev/null
+++ b/advtrains/advtrains/debugringbuffer.lua
@@ -0,0 +1,44 @@
+--so, some ringbuffers one for each train
+
+local ringbuflen=1000
+
+local ringbufs={}
+local ringbufcnt={}
+
+function advtrains.drb_record(tid, msg)
+ if not ringbufs[tid] then
+ ringbufs[tid]={}
+ ringbufcnt[tid]=0
+ end
+ ringbufs[tid][ringbufcnt[tid]]=msg
+ ringbufcnt[tid]=ringbufcnt[tid]+1
+ if ringbufcnt[tid] > ringbuflen then
+ ringbufcnt[tid]=0
+ end
+end
+function advtrains.drb_dump(tid)
+ atdebug("Debug ring buffer output for '"..tid.."':")
+ local stopcnt=ringbufcnt[tid]
+ if not stopcnt then
+ atdebug("ID unknown!")
+ return
+ end
+ repeat
+ atdebug(ringbufs[tid][ringbufcnt[tid]])
+ ringbufcnt[tid]=ringbufcnt[tid]+1
+ if ringbufcnt[tid] > ringbuflen then
+ ringbufcnt[tid]=0
+ end
+ until ringbufcnt[tid]==stopcnt
+end
+
+minetest.register_chatcommand("atdebug_show",
+ {
+ params = "train sid", -- Short parameter description
+ description = "Dump debug log", -- Full description
+ privs = {train_operator=true}, -- Require the "privs" privilege to run
+ func = function(name, param)
+ advtrains.drb_dump(param)
+ end, -- Called when command is run.
+ -- Returns boolean success and text output.
+ })
diff --git a/advtrains/advtrains/depends.txt b/advtrains/advtrains/depends.txt
new file mode 100644
index 0000000..1815e54
--- /dev/null
+++ b/advtrains/advtrains/depends.txt
@@ -0,0 +1,3 @@
+default
+mesecons?
+digtron? \ No newline at end of file
diff --git a/advtrains/advtrains/description.txt b/advtrains/advtrains/description.txt
new file mode 100644
index 0000000..bb13b97
--- /dev/null
+++ b/advtrains/advtrains/description.txt
@@ -0,0 +1,8 @@
+Advanced Trains v1.3.8, 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
diff --git a/advtrains/advtrains/helpers.lua b/advtrains/advtrains/helpers.lua
new file mode 100644
index 0000000..65f25ba
--- /dev/null
+++ b/advtrains/advtrains/helpers.lua
@@ -0,0 +1,447 @@
+--advtrains by orwell96, see readme.txt
+
+local dir_trans_tbl={
+ [0]={x=0, z=1, y=0},
+ [1]={x=1, z=2, y=0},
+ [2]={x=1, z=1, y=0},
+ [3]={x=2, z=1, y=0},
+ [4]={x=1, z=0, y=0},
+ [5]={x=2, z=-1, y=0},
+ [6]={x=1, z=-1, y=0},
+ [7]={x=1, z=-2, y=0},
+ [8]={x=0, z=-1, y=0},
+ [9]={x=-1, z=-2, y=0},
+ [10]={x=-1, z=-1, y=0},
+ [11]={x=-2, z=-1, y=0},
+ [12]={x=-1, z=0, y=0},
+ [13]={x=-2, z=1, y=0},
+ [14]={x=-1, z=1, y=0},
+ [15]={x=-1, z=2, y=0},
+}
+
+local dir_angle_tbl={}
+for d,v in pairs(dir_trans_tbl) do
+ local uvec = vector.normalize(v)
+ dir_angle_tbl[d] = math.atan2(-uvec.x, uvec.z)
+end
+
+
+function advtrains.dir_to_angle(dir)
+ return dir_angle_tbl[dir] or error("advtrains: in helpers.lua/dir_to_angle() given dir="..(dir or "nil"))
+end
+
+function advtrains.dirCoordSet(coord, dir)
+ return vector.add(coord, advtrains.dirToCoord(dir))
+end
+advtrains.pos_add_dir = advtrains.dirCoordSet
+
+function advtrains.pos_add_angle(pos, ang)
+ -- 0 is +Z -> meaning of sin/cos swapped
+ return vector.add(pos, {x = -math.sin(ang), y = 0, z = math.cos(ang)})
+end
+
+function advtrains.dirToCoord(dir)
+ return dir_trans_tbl[dir] or error("advtrains: in helpers.lua/dir_to_vector() given dir="..(dir or "nil"))
+end
+advtrains.dir_to_vector = advtrains.dirToCoord
+
+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
+
+function atround(number)
+ return math.floor(number+0.5)
+end
+atfloor = math.floor
+
+
+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 = advtrains.dir_to_angle(conn1)
+ local yaw2 = advtrains.dir_to_angle(conn2)
+ local adiff1 = advtrains.minAngleDiffRad(yaw, yaw1)
+ local adiff2 = advtrains.minAngleDiffRad(yaw, yaw2)
+
+ if math.abs(adiff2)<math.abs(adiff1) then
+ return conn2
+ else
+ return conn1
+ end
+end
+
+function advtrains.yawToAnyDir(yaw)
+ local min_conn, min_diff=0, 10
+ for conn, vec in pairs(advtrains.dir_trans_tbl) do
+ local yaw1 = advtrains.dir_to_angle(conn)
+ local diff = math.abs(advtrains.minAngleDiffRad(yaw, yaw1))
+ if diff < min_diff then
+ min_conn = conn
+ min_diff = diff
+ end
+ end
+ return min_conn
+end
+function advtrains.yawToClosestConn(yaw, conns)
+ local min_connid, min_diff=1, 10
+ for connid, conn in ipairs(conns) do
+ local yaw1 = advtrains.dir_to_angle(conn.c)
+ local diff = math.abs(advtrains.minAngleDiffRad(yaw, yaw1))
+ if diff < min_diff then
+ min_connid = connid
+ min_diff = diff
+ end
+ end
+ return min_connid
+end
+
+local pi, pi2 = math.pi, 2*math.pi
+function advtrains.minAngleDiffRad(r1, r2)
+ while r1>pi2 do
+ r1=r1-pi2
+ end
+ while r1<0 do
+ r1=r1+pi2
+ end
+ while r2>pi2 do
+ r2=r2-pi2
+ end
+ while r1<0 do
+ r2=r2+pi2
+ end
+ local try1=r2-r1
+ local try2=r2+pi2-r1
+ local try3=r2-pi2-r1
+
+ local minabs = math.min(math.abs(try1), math.abs(try2), math.abs(try3))
+ if minabs==math.abs(try1) then
+ return try1
+ end
+ if minabs==math.abs(try2) then
+ return try2
+ end
+ if minabs==math.abs(try3) then
+ return try3
+ end
+end
+
+
+-- Takes 2 connections (0...AT_CMAX) as argument
+-- Returns the angle median of those 2 positions from the pov
+-- of standing on the cdir1 side and looking towards cdir2
+-- cdir1 - >NODE> - cdir2
+function advtrains.conn_angle_median(cdir1, cdir2)
+ local ang1 = advtrains.dir_to_angle(advtrains.oppd(cdir1))
+ local ang2 = advtrains.dir_to_angle(cdir2)
+ return ang1 + advtrains.minAngleDiffRad(ang1, ang2)/2
+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.save_keys(tbl, keys)
+ local new={}
+ for _,key in ipairs(keys) do
+ new[key] = tbl[key]
+ end
+ return new
+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
+
+--is_protected wrapper that checks for protection_bypass privilege
+function advtrains.is_protected(pos, name)
+ if not name then
+ error("advtrains.is_protected() called without name parameter!")
+ end
+ if minetest.check_player_privs(name, {protection_bypass=true}) then
+ --player can bypass protection
+ return false
+ end
+ return minetest.is_protected(pos, name)
+end
+
+function advtrains.is_creative(name)
+ if not name then
+ error("advtrains.is_creative() called without name parameter!")
+ end
+ if minetest.check_player_privs(name, {creative=true}) then
+ return true
+ end
+ return minetest.settings:get_bool("creative_mode")
+end
+
+function advtrains.is_damage_enabled(name)
+ if not name then
+ error("advtrains.is_damage_enabled() called without name parameter!")
+ end
+ if minetest.check_player_privs(name, "train_admin") then
+ return false
+ end
+ return minetest.settings:get_bool("enable_damage")
+end
+
+function advtrains.ms_to_kmh(speed)
+ return speed * 3.6
+end
+
+-- 4 possible inputs:
+-- integer: just do that modulo calculation
+-- table with c set: rotate c
+-- table with tables: rotate each
+-- table with integers: rotate each (probably no use case)
+function advtrains.rotate_conn_by(conn, rotate)
+ if tonumber(conn) then
+ return (conn+rotate)%AT_CMAX
+ elseif conn.c then
+ return { c = (conn.c+rotate)%AT_CMAX, y = conn.y}
+ end
+ local tmp={}
+ for connid, data in ipairs(conn) do
+ tmp[connid]=advtrains.rotate_conn_by(data, rotate)
+ end
+ return tmp
+end
+
+
+function advtrains.oppd(dir)
+ return advtrains.rotate_conn_by(dir, AT_CMAX/2)
+end
+--conn_to_match like rotate_conn_by
+--other_conns have to be a table of conn tables!
+function advtrains.conn_matches_to(conn, other_conns)
+ if tonumber(conn) then
+ for connid, data in ipairs(other_conns) do
+ if advtrains.oppd(conn) == data.c then return connid end
+ end
+ return false
+ elseif conn.c then
+ for connid, data in ipairs(other_conns) do
+ local cmp = advtrains.oppd(conn)
+ if cmp.c == data.c and (cmp.y or 0) == (data.y or 0) then return connid end
+ end
+ return false
+ end
+ local tmp={}
+ for connid, data in ipairs(conn) do
+ local backmatch = advtrains.conn_matches_to(data, other_conns)
+ if backmatch then return backmatch, connid end --returns <connid of other rail> <connid of this rail>
+ end
+ return false
+end
+
+-- Going from the rail at pos (does not need to be rounded) along connection with id conn_idx, if there is a matching rail, return it and the matching connid
+-- returns: <adjacent pos>, <conn index of adjacent>, <my conn index>, <railheight of adjacent>
+-- parameter this_conns_p is connection table of this rail and is optional, is determined by get_rail_info_at if not provided.
+function advtrains.get_adjacent_rail(this_posnr, this_conns_p, conn_idx, drives_on)
+ local this_pos = advtrains.round_vector_floor_y(this_posnr)
+ local this_conns = this_conns_p
+ if not this_conns then
+ _, this_conns = advtrains.get_rail_info_at(this_pos)
+ end
+ if not conn_idx then
+ for coni, _ in ipairs(this_conns) do
+ local adj_pos, adj_conn_idx, _, nry, nco = advtrains.get_adjacent_rail(this_pos, this_conns, coni)
+ if adj_pos then return adj_pos,adj_conn_idx,coni,nry, nco end
+ end
+ return nil
+ end
+
+ local conn = this_conns[conn_idx]
+ local conn_y = conn.y or 0
+ local adj_pos = advtrains.dirCoordSet(this_pos, conn.c);
+
+ while conn_y>=1 do
+ conn_y = conn_y - 1
+ adj_pos.y = adj_pos.y + 1
+ end
+
+ local nextnode_ok, nextconns, nextrail_y=advtrains.get_rail_info_at(adj_pos, drives_on)
+ if not nextnode_ok then
+ adj_pos.y = adj_pos.y - 1
+ conn_y = conn_y + 1
+ nextnode_ok, nextconns, nextrail_y=advtrains.get_rail_info_at(adj_pos, drives_on)
+ if not nextnode_ok then
+ return nil
+ end
+ end
+ local adj_connid = advtrains.conn_matches_to({c=conn.c, y=conn_y}, nextconns)
+ if adj_connid then
+ return adj_pos, adj_connid, conn_idx, nextrail_y, nextconns
+ end
+ return nil
+end
+
+-- when a train enters a rail on connid 'conn', which connid will it go out?
+-- nconns: number of connections in connection table:
+-- 2 = straight rail; 3 = turnout, 4 = crossing, 5 = three-way turnout (5th entry is a stub)
+-- returns: connid_out
+local connlku={[2]={2,1}, [3]={2,1,1}, [4]={2,1,4,3}, [5]={2,1,1,1}}
+function advtrains.get_matching_conn(conn, nconns)
+ return connlku[nconns][conn]
+end
+
+function advtrains.random_id()
+ local idst=""
+ for i=0,5 do
+ idst=idst..(math.random(0,9))
+ end
+ return idst
+end
+-- Shorthand for pos_to_string and round_vector_floor_y
+function advtrains.roundfloorpts(pos)
+ return minetest.pos_to_string(advtrains.round_vector_floor_y(pos))
+end
+
+-- insert an element into a table if it does not yet exist there
+-- equalfunc is a function to compare equality, defaults to ==
+-- returns true if the element was inserted
+function advtrains.insert_once(tab, elem, equalfunc)
+ for _,e in pairs(tab) do
+ if equalfunc and equalfunc(elem, e) or e==elem then return false end
+ end
+ tab[#tab+1] = elem
+ return true
+end
+
+local hext = { [0]="0",[1]="1",[2]="2",[3]="3",[4]="4",[5]="5",[6]="6",[7]="7",[8]="8",[9]="9",[10]="A",[11]="B",[12]="C",[13]="D",[14]="E",[15]="F"}
+local dect = { ["0"]=0,["1"]=1,["2"]=2,["3"]=3,["4"]=4,["5"]=5,["6"]=6,["7"]=7,["8"]=8,["9"]=9,["A"]=10,["B"]=11,["C"]=12,["D"]=13,["E"]=14,["F"]=15}
+
+local f = atfloor
+
+local function hex(i)
+ local x=i+32768
+ local c4 = x % 16
+ x = f(x / 16)
+ local c3 = x % 16
+ x = f(x / 16)
+ local c2 = x % 16
+ x = f(x / 16)
+ local c1 = x % 16
+ return (hext[c1]) .. (hext[c2]) .. (hext[c3]) .. (hext[c4])
+end
+
+local function c(s,i) return dect[string.sub(s,i,i)] end
+
+local function dec(s)
+ return (c(s,1)*4096 + c(s,2)*256 + c(s,3)*16 + c(s,4))-32768
+end
+-- Takes a position vector and outputs a encoded value suitable as table index
+-- This is essentially a hexadecimal representation of the position (+32768)
+-- Order (YYY)YXXXXZZZZ
+function advtrains.encode_pos(pos)
+ return hex(pos.y) .. hex(pos.x) .. hex(pos.z)
+end
+
+-- decodes a position encoded with encode_pos
+function advtrains.decode_pos(pts)
+ if not pts or not #pts==6 then return nil end
+ local stry = string.sub(pts, 1,4)
+ local strx = string.sub(pts, 5,8)
+ local strz = string.sub(pts, 9,12)
+ return vector.new(dec(strx), dec(stry), dec(strz))
+end
+
+--[[ Benchmarking code
+local tdt = {}
+local tlt = {}
+local tet = {}
+
+for i=1,1000000 do
+ tdt[i] = vector.new(math.random(-65536, 65535), math.random(-65536, 65535), math.random(-65536, 65535))
+ if i%1000 == 0 then
+ tlt[#tlt+1] = tdt[i]
+ end
+end
+
+local t1=os.clock()
+for i=1,1000000 do
+ local pe = advtrains.encode_pos(tdt[i])
+ local pb = advtrains.decode_pos(pe)
+ tet[pe] = i
+end
+for i,v in ipairs(tlt) do
+ local lk = tet[advtrains.encode_pos(v)]
+end
+atdebug("endec",os.clock()-t1,"s")
+
+tet = {}
+
+t1=os.clock()
+for i=1,1000000 do
+ local pe = minetest.pos_to_string(tdt[i])
+ local pb = minetest.string_to_pos(pe)
+ tet[pe] = i
+end
+for i,v in ipairs(tlt) do
+ local lk = tet[minetest.pos_to_string(v)]
+end
+atdebug("pts",os.clock()-t1,"s")
+
+--Results:
+--2018-11-29 16:57:08: ACTION[Main]: [advtrains]endec 1.786451 s
+--2018-11-29 16:57:10: ACTION[Main]: [advtrains]pts 2.566377 s
+]]
+
+
diff --git a/advtrains/advtrains/init.lua b/advtrains/advtrains/init.lua
new file mode 100644
index 0000000..d6c3c92
--- /dev/null
+++ b/advtrains/advtrains/init.lua
@@ -0,0 +1,597 @@
+
+--[[
+Advanced Trains - Minetest Mod
+
+Copyright (C) 2016-2020 Moritz Blei (orwell96) and contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+]]
+
+local lot = os.clock()
+minetest.log("action", "[advtrains] Loading...")
+
+-- There is no need to support 0.4.x anymore given that the compatitability with it is already broken by 1bb1d825f46af3562554c12fba35a31b9f7973ff
+attrans = minetest.get_translator ("advtrains")
+
+--advtrains
+
+DUMP_DEBUG_SAVE = false
+GENERATE_ATRICIFIAL_LAG = false
+
+--Constant for maximum connection value/division of the circle
+AT_CMAX = 16
+
+advtrains = {trains={}, player_to_train_mapping={}}
+
+-- get wagon loading range
+advtrains.wagon_load_range = tonumber(minetest.settings:get("advtrains_wagon_load_range"))
+if not advtrains.wagon_load_range then
+ advtrains.wagon_load_range = tonumber(minetest.settings:get("active_block_range"))*16
+end
+
+--pcall
+local no_action=false
+
+local function reload_saves()
+ atwarn("Restoring saved state in 1 second...")
+ no_action=true
+ advtrains.lock_path_inval = false
+ --read last save state and continue, as if server was restarted
+ for aoi, le in pairs(minetest.luaentities) do
+ if le.is_wagon then
+ le.object:remove()
+ end
+ end
+ minetest.after(1, function()
+ advtrains.load()
+ atwarn("Reload successful!")
+ advtrains.ndb.restore_all()
+ end)
+end
+
+function advtrains.pcall(fun)
+ if no_action then return end
+
+ local succ, return1, return2, return3, return4=xpcall(fun, function(err)
+ atwarn("Lua Error occured: ", err)
+ atwarn(debug.traceback())
+ if advtrains.atprint_context_tid then
+ advtrains.path_print(advtrains.trains[advtrains.atprint_context_tid], atdebug)
+ atwarn(advtrains.trains[advtrains.atprint_context_tid].debug)
+ end
+ end)
+ if not succ then
+ reload_saves()
+ else
+ return return1, return2, return3, return4
+ end
+end
+
+
+advtrains.modpath = minetest.get_modpath("advtrains")
+
+--Advtrains dump (special treatment of pos and sigd)
+function atdump(t, intend)
+ local str
+ if type(t)=="table" then
+ if t.x and t.y and t.z then
+ str=minetest.pos_to_string(t)
+ elseif t.p and t.s then -- interlocking sigd
+ str="S["..minetest.pos_to_string(t.p).."/"..t.s.."]"
+ elseif advtrains.lines and t.s and t.m then -- RwT
+ str=advtrains.lines.rwt.to_string(t)
+ else
+ str="{"
+ local intd = (intend or "") .. " "
+ for k,v in pairs(t) do
+ if type(k)~="string" or not string.match(k, "^path[_]?") then
+ -- do not print anything path-related
+ str = str .. "\n" .. intd .. atdump(k, intd) .. " = " ..atdump(v, intd)
+ end
+ end
+ str = str .. "\n" .. (intend or "") .. "}"
+ end
+ elseif type(t)=="boolean" then
+ if t then
+ str="true"
+ else
+ str="false"
+ end
+ elseif type(t)=="function" then
+ str="<function>"
+ elseif type(t)=="userdata" then
+ str="<userdata>"
+ else
+ str=""..t
+ end
+ return str
+end
+
+function advtrains.print_concat_table(a)
+ local str=""
+ local stra=""
+ local t
+ for i=1,20 do
+ t=a[i]
+ if t==nil then
+ stra=stra.."nil "
+ else
+ str=str..stra
+ stra=""
+ str=str..atdump(t).." "
+ end
+ end
+ return str
+end
+
+atprint=function() end
+atlog=function(t, ...)
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("action", "[advtrains]"..text)
+end
+atwarn=function(t, ...)
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("warning", "[advtrains]"..text)
+ minetest.chat_send_all("[advtrains] -!- "..text)
+end
+sid=function(id) if id then return string.sub(id, -6) end end
+
+
+--ONLY use this function for temporary debugging. for consistent debug prints use atprint
+atdebug=function(t, ...)
+ local text=advtrains.print_concat_table({t, ...})
+ minetest.log("action", "[advtrains]"..text)
+ minetest.chat_send_all("[advtrains]"..text)
+end
+
+if minetest.settings:get_bool("advtrains_enable_debugging") then
+ atprint=function(t, ...)
+ local context=advtrains.atprint_context_tid or ""
+ if not context then return end
+ local text=advtrains.print_concat_table({t, ...})
+ advtrains.drb_record(context, text)
+
+ --atlog("@@",advtrains.atprint_context_tid,t,...)
+ end
+ dofile(advtrains.modpath.."/debugringbuffer.lua")
+
+end
+
+function assertt(var, typ)
+ if type(var)~=typ then
+ error("Assertion failed, variable has to be of type "..typ)
+ end
+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}}
+
+advtrains.fpath=minetest.get_worldpath().."/advtrains"
+
+dofile(advtrains.modpath.."/path.lua")
+dofile(advtrains.modpath.."/trainlogic.lua")
+dofile(advtrains.modpath.."/trainhud.lua")
+dofile(advtrains.modpath.."/trackplacer.lua")
+dofile(advtrains.modpath.."/copytool.lua")
+dofile(advtrains.modpath.."/tracks.lua")
+dofile(advtrains.modpath.."/occupation.lua")
+dofile(advtrains.modpath.."/atc.lua")
+dofile(advtrains.modpath.."/wagons.lua")
+dofile(advtrains.modpath.."/protection.lua")
+
+dofile(advtrains.modpath.."/trackdb_legacy.lua")
+dofile(advtrains.modpath.."/nodedb.lua")
+dofile(advtrains.modpath.."/couple.lua")
+
+dofile(advtrains.modpath.."/signals.lua")
+dofile(advtrains.modpath.."/misc_nodes.lua")
+dofile(advtrains.modpath.."/crafting.lua")
+dofile(advtrains.modpath.."/craft_items.lua")
+
+dofile(advtrains.modpath.."/log.lua")
+dofile(advtrains.modpath.."/passive.lua")
+if mesecon then
+ dofile(advtrains.modpath.."/p_mesecon_iface.lua")
+end
+
+
+dofile(advtrains.modpath.."/lzb.lua")
+
+
+--load/save
+
+-- backup variables, used if someone should accidentally delete a sub-mod
+local MDS_interlocking, MDS_lines
+
+
+advtrains.fpath=minetest.get_worldpath().."/advtrains"
+dofile(advtrains.modpath.."/log.lua")
+function advtrains.read_component(name)
+ local path = advtrains.fpath.."_"..name
+ minetest.log("action", "[advtrains] loading "..path)
+ local file, err = io.open(path, "r")
+ if not file then
+ minetest.log("warning", " Failed to read advtrains save data from file "..path..": "..(err or "Unknown Error"))
+ minetest.log("warning", " (this is normal when first enabling advtrains on this world)")
+ return
+ end
+ local tbl = minetest.deserialize(file:read("*a"))
+ file:close()
+ return tbl
+end
+
+function advtrains.avt_load()
+ -- check for new, split advtrains save file
+
+ local version = advtrains.read_component("version")
+ local tbl
+ if version and version == 3 then
+ -- we are dealing with the new, split-up system
+ minetest.log("action", "[advtrains] loading savefiles version 3")
+ local il_save = {
+ tcbs = true,
+ ts = true,
+ signalass = true,
+ rs_locks = true,
+ rs_callbacks = true,
+ influence_points = true,
+ npr_rails = true,
+ }
+ tbl={
+ trains = true,
+ wagon_save = true,
+ ptmap = true,
+ atc = true,
+ ndb = true,
+ lines = true,
+ version = 2,
+ }
+ for i,k in pairs(il_save) do
+ il_save[i] = advtrains.read_component("interlocking_"..i)
+ end
+ for i,k in pairs(tbl) do
+ tbl[i] = advtrains.read_component(i)
+ end
+ tbl["interlocking"] = il_save
+ else
+ local file, err = io.open(advtrains.fpath, "r")
+ if not file then
+ minetest.log("warning", " Failed to read advtrains save data from file "..advtrains.fpath..": "..(err or "Unknown Error"))
+ minetest.log("warning", " (this is normal when first enabling advtrains on this world)")
+ return
+ else
+ tbl = minetest.deserialize(file:read("*a"))
+ file:close()
+ end
+ end
+ if type(tbl) == "table" then
+ if tbl.version then
+ --congrats, we have the new save format.
+ advtrains.trains = tbl.trains
+ --Save the train id into the train table to avoid having to pass id around
+ for id, train in pairs(advtrains.trains) do
+ train.id = id
+ end
+ advtrains.wagons = tbl.wagon_save
+ advtrains.player_to_train_mapping = tbl.ptmap or {}
+ advtrains.ndb.load_data(tbl.ndb)
+ advtrains.atc.load_data(tbl.atc)
+ if advtrains.interlocking then
+ advtrains.interlocking.db.load(tbl.interlocking)
+ else
+ MDS_interlocking = tbl.interlocking
+ end
+ if advtrains.lines then
+ advtrains.lines.load(tbl.lines)
+ else
+ MDS_lines = tbl.lines
+ end
+ --remove wagon_save entries that are not part of a train
+ local todel=advtrains.merge_tables(advtrains.wagon_save)
+ for tid, train in pairs(advtrains.trains) do
+ train.id = tid
+ for _, wid in ipairs(train.trainparts) do
+ todel[wid]=nil
+ end
+ end
+ for wid, _ in pairs(todel) do
+ atwarn("Removing unused wagon", wid, "from wagon_save table.")
+ advtrains.wagon_save[wid]=nil
+ end
+ else
+ --oh no, its the old one...
+ advtrains.trains=tbl
+ --load ATC
+ advtrains.fpath_atc=minetest.get_worldpath().."/advtrains_atc"
+ local file, err = io.open(advtrains.fpath_atc, "r")
+ if not file then
+ local er=err or "Unknown Error"
+ atprint("Failed loading advtrains atc save file "..er)
+ else
+ local tbl = minetest.deserialize(file:read("*a"))
+ if type(tbl) == "table" then
+ advtrains.atc.controllers=tbl.controllers
+ end
+ file:close()
+ end
+ --load wagon saves
+ 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"
+ atprint("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
+ end
+ else
+ minetest.log("error", " Failed to deserialize advtrains save data: Not a table!")
+ end
+end
+
+advtrains.save_component = function (tbl, name)
+ -- Saves each component of the advtrains file separately
+ --
+ -- required for now to shrink the advtrains db to overcome lua
+ -- limitations.
+ local datastr = minetest.serialize(tbl)
+ if not datastr then
+ minetest.log("error", " Failed to serialize advtrains save data!")
+ return
+ end
+ local path = advtrains.fpath.."_"..name
+ local success = minetest.safe_file_write(path, datastr)
+
+ if not success then
+ minetest.log("error", " Failed to write advtrains save data to file "..path)
+ end
+
+end
+
+advtrains.avt_save = function(remove_players_from_wagons)
+ --atprint("saving")
+
+ if remove_players_from_wagons then
+ for w_id, data in pairs(advtrains.wagons) do
+ data.seatp={}
+ end
+ advtrains.player_to_train_mapping={}
+ end
+
+ local tmp_trains={}
+ for id, train in pairs(advtrains.trains) do
+ --first, deep_copy the train
+ if #train.trainparts > 0 then
+ local v=advtrains.save_keys(train, {
+ "last_pos", "last_connid", "last_frac", "velocity", "tarvelocity",
+ "trainparts", "recently_collided_with_env",
+ "atc_brake_target", "atc_wait_finish", "atc_command", "atc_delay", "door_open",
+ "text_outside", "text_inside", "line", "routingcode",
+ "il_sections", "speed_restriction", "is_shunt", "points_split", "autocouple"
+ })
+ --then save it
+ tmp_trains[id]=v
+ else
+ atwarn("Train",id,"had no wagons left because of some bug. It is being deleted. Wave it goodbye!")
+ advtrains.remove_train(id)
+ end
+ end
+
+ for id, wdata in pairs(advtrains.wagons) do
+ local _,proto = advtrains.get_wagon_prototype(wdata)
+ if proto.has_inventory then
+ local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..id})
+ if inv then -- inventory is not initialized when wagon was never loaded
+ -- TOOD: What happens with unloading rails when they don't find the inventory?
+ wdata.ser_inv=advtrains.serialize_inventory(inv)
+ end
+ end
+ -- TODO apply save-keys here too
+ -- TODO temp
+ wdata.dcpl_lock = nil
+ end
+
+ --versions:
+ -- 1 - Initial new save format.
+ -- 2 - version as of tss branch 11-2018+
+ local il_save
+ if advtrains.interlocking then
+ il_save = advtrains.interlocking.db.save()
+ else
+ il_save = MDS_interlocking
+ end
+ local ln_save
+ if advtrains.lines then
+ ln_save = advtrains.lines.save()
+ else
+ ln_save = MDS_lines
+ end
+
+ local save_tbl={
+ trains = tmp_trains,
+ wagon_save = advtrains.wagons,
+ ptmap = advtrains.player_to_train_mapping,
+ atc = advtrains.atc.save_data(),
+ ndb = advtrains.ndb.save_data(),
+ lines = ln_save,
+ version = 3,
+ }
+ for i,k in pairs(save_tbl) do
+ advtrains.save_component(k,i)
+ end
+
+ for i,k in pairs(il_save) do
+ advtrains.save_component(k,"interlocking_"..i)
+ end
+
+ if DUMP_DEBUG_SAVE then
+ local file, err = io.open(advtrains.fpath.."_DUMP", "w")
+ if err then
+ return
+ end
+ file:write(dump(save_tbl))
+ file:close()
+ end
+end
+
+--## MAIN LOOP ##--
+--Calls all subsequent main tasks of both advtrains and atlatc
+local init_load=false
+local save_interval=20
+local save_timer=save_interval
+advtrains.mainloop_runcnt=0
+
+
+local t = 0
+minetest.register_globalstep(function(dtime_mt)
+ return advtrains.pcall(function()
+ advtrains.mainloop_runcnt=advtrains.mainloop_runcnt+1
+ --atprint("Running the main loop, runcnt",advtrains.mainloop_runcnt)
+ --call load once. see advtrains.load() comment
+ if not init_load then
+ advtrains.load()
+ end
+
+ local dtime
+ if GENERATE_ATRICIFIAL_LAG then
+ dtime = 0.2
+ if os.clock()<t then
+ return
+ end
+
+ t = os.clock()+0.2
+ else
+ --limit dtime: if trains move too far in one step, automation may cause stuck and wrongly braking trains
+ dtime=dtime_mt
+ if dtime>0.2 then
+ atprint("Limiting dtime to 0.2!")
+ dtime=0.2
+ end
+ end
+
+ advtrains.mainloop_trainlogic(dtime)
+ if advtrains_itm_mainloop then
+ advtrains_itm_mainloop(dtime)
+ end
+ if atlatc then
+ atlatc.mainloop_stepcode(dtime)
+ atlatc.interrupt.mainloop(dtime)
+ end
+ if advtrains.lines then
+ advtrains.lines.step(dtime)
+ end
+
+ --trigger a save when necessary
+ save_timer=save_timer-dtime
+ if save_timer<=0 then
+ local t=os.clock()
+ --save
+ advtrains.save()
+ save_timer=save_interval
+ atprintbm("saving", t)
+ end
+ end)
+end)
+
+--if something goes wrong in these functions, there is no help. no pcall here.
+
+--## MAIN LOAD ROUTINE ##
+-- Causes the loading of everything
+-- first time called in main loop (after the init phase) because luaautomation has to initialize first.
+function advtrains.load()
+ advtrains.avt_load() --loading advtrains. includes ndb at advtrains.ndb.load_data()
+ if atlatc then
+ atlatc.load() --includes interrupts
+ end
+ if advtrains_itm_init then
+ advtrains_itm_init()
+ end
+ init_load=true
+ no_action=false
+ atlog("[load_all]Loaded advtrains save files")
+end
+
+--## MAIN SAVE ROUTINE ##
+-- Causes the saving of everything
+function advtrains.save(remove_players_from_wagons)
+ if not init_load then
+ --wait... we haven't loaded yet?!
+ atwarn("Instructed to save() but load() was never called!")
+ return
+ end
+ advtrains.avt_save(remove_players_from_wagons) --saving advtrains. includes ndb at advtrains.ndb.save_data()
+ if atlatc then
+ atlatc.save()
+ end
+ atprint("[save_all]Saved advtrains save files")
+
+ --TODO very simple yet hacky workaround for the "green signals" bug
+ advtrains.invalidate_all_paths()
+end
+minetest.register_on_shutdown(advtrains.save)
+
+-- This chat command provides a solution to the problem known on the LinuxWorks server
+-- There are many players that joined a single time, got on a train and then left forever
+-- These players still occupy seats in the trains.
+minetest.register_chatcommand("at_empty_seats",
+ {
+ params = "", -- Short parameter description
+ description = "Detach all players, especially the offline ones, from all trains. Use only when no one serious is on a train.", -- Full description
+ privs = {train_operator=true, server=true}, -- Require the "privs" privilege to run
+ func = function(name, param)
+ return advtrains.pcall(function()
+ atwarn("Data is being saved. While saving, advtrains will remove the players from trains. Save files will be reloaded afterwards!")
+ advtrains.save(true)
+ reload_saves()
+ end)
+ end,
+})
+-- This chat command solves another problem: Trains getting randomly stuck.
+minetest.register_chatcommand("at_reroute",
+ {
+ params = "",
+ description = "Delete all train routes, force them to recalculate",
+ privs = {train_operator=true}, -- Only train operator is required, since this is relatively safe.
+ func = function(name, param)
+ return advtrains.pcall(function()
+ advtrains.invalidate_all_paths()
+ return true, "Successfully invalidated train routes"
+ end)
+ end,
+})
+
+
+local tot=(os.clock()-lot)*1000
+minetest.log("action", "[advtrains] Loaded in "..tot.."ms")
+
diff --git a/advtrains/advtrains/locale/advtrains.de.tr b/advtrains/advtrains/locale/advtrains.de.tr
new file mode 100644
index 0000000..f0d797f
--- /dev/null
+++ b/advtrains/advtrains/locale/advtrains.de.tr
@@ -0,0 +1,71 @@
+# textdomain: advtrains
+This wagon is owned by @1, you can't destroy it.=Dieser Waggon gehört @1, du kannst ihn nicht abbauen.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=Warnung: Du erhältst nur etwas Stahl zurück. Wenn du sicher bist, dass du den Waggon zerstören willst, halte 'Schleichen' und klicke links.
+Show Inventory=Zeige Inventar
+Select seat:=Wähle einen Sitzplatz aus:
+ATC controller, unconfigured.=Zugbeeinflussungsschiene, nicht konfiguiert.
+ATC controller=Zugbeeinflussungsschiene
+ATC controller, mode @1@nChannel: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nKanal: @2
+ATC controller, mode @1@nCommand: @2=Zugbeeinflussungsschiene in Betriebsart "@1"@nBefehl: @2
+Command=Befehl
+Command (on)=Befehl (wenn ein)
+Digiline channel=Digiline-Kanal
+Save=Speichern
+ATC Reverse command warning: didn't reverse train, train moving!=Zugbeeinflussung - Warnung: Befehl 'R' nicht ausgeführt, Zug in Bewegung!
+ATC command syntax error: I statement not closed: @1=Zugbeeinflussung - Syntaxfehler: I-Anweisung nicht geschlossen: @1
+ATC command parse error: Unknown command: @1=Zugbeeinflussung - Fehler: Unbekannter Befehl: @1
+This position is protected!=Diese Position ist geschützt!
+You need to own at least one neighboring wagon to destroy this couple.=Du musst Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln.
+@1 Platform (low)=Niedriger @1-Bahnsteig
+@1 Platform (high)=Hoher @1-Bahnsteig
+off=aus
+on=ein
+Lampless Signal (@1)=Mechanisches Signal (@1)
+Signal (@1)=Lichtsignal (@1)
+Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=Schienenwerkzeug@n@nLinksklick: Schienentyp ändern, Rechtsklick: Objekt drehen.
+This node can't be rotated using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug drehen.
+This node can't be changed using the trackworker!=Kann diesen Block nicht mit dem Schienenwerkzeug bearbeiten.
+Can't place: not pointing at node=Kann nicht platzieren: Du zeigst nicht auf einen Block.
+Can't place: space occupied!=Kann nicht platzieren: Platz besetzt.
+Can't place: protected position!=Kann nicht platzieren: Position geschützt.
+Can't place: Not enough slope items left (@1 required)=Kann nicht platzieren: nicht genug Steigungsblöcke, es werden insgesamt @1 benötigt.
+Can't place: There's no slope of length @1=Kann nicht platzieren: Keine Steigung der Länge @1 definiert.
+Can't place: no supporting node at upper end.=Kann nicht platzieren: kein unterstützender Block am Ende der Steigung.
+Deprecated Track=ausrangierte Schiene, nicht verwenden.
+Track=Schiene
+Bumper=Prellbock
+Detector Rail=Detektorschiene
+Speed:=Geschw.:
+Target:=Zielges.:
+@1 Slope=@1 Steigung
+Can't get on: wagon full or doors closed!=Kann nicht einsteigen: Waggon voll oder Türen geschlossen.
+Use Sneak+rightclick to bypass closed doors!=Nutze Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem einzusteigen.
+Lock couples=Kupplungen sperren
+Save wagon properties=Waggon-Einstellungen speichern
+Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=Türen sind geschlossen! Sneak+Rechtsklick, um die Türnotöffnung zu aktivieren und trotzdem auszusteigen.
+Wagon properties=Waggon-Einstellungen
+Get off=Aussteigen
+Get off (forced)=Aussteigen (erzwingen)
+(Doors closed)=(Türen geschlossen)
+Access to @1=Zugang zu @1
+Default Seat=Standardsitzplatz
+Default Seat (driver stand)=Standardsitzplatz (Führerstand)
+Driver Stand=Führerstand
+Driver Stand (left)=Führerstand Links
+Driver Stand (right)=Führerstand Rechts
+Industrial Train Engine=Industrielle Lokomotive
+Industrial tank wagon=Tankwaggon
+Industrial wood wagon=Holztransportwaggon
+Japanese Train Engine=Japanische Personenzug-Lokomotive
+Japanese Train Wagon=Japanischer Personenzug-Passagierwaggon
+Steam Engine=Dampflokomotive
+Detailed Steam Engine=detaillierte Dampflokomotive
+Passenger Wagon=Passagierwaggon
+Box wagon=Güterwaggon
+Subway Passenger Wagon=U-Bahn-Waggon
+The wagon's inventory is not empty!=Das Inventar dieses Waggons ist nicht leer!
+This track can not be changed!=Diese Schiene kann nicht geändert werden!
+This track can not be rotated!=Diese Schiene kann nicht gedreht werden!
+Position is occupied by a train.=Ein Zug steht an dieser Position.
+There's a Track Circuit Break here.=Hier ist eine Gleisabschnittsgrenze (TCB).
+There's a Signal Influence Point here.=Hier ist ein Signal-Beeinflussungspunkt.
diff --git a/advtrains/advtrains/locale/advtrains.zh_CN.tr b/advtrains/advtrains/locale/advtrains.zh_CN.tr
new file mode 100644
index 0000000..ef9c99b
--- /dev/null
+++ b/advtrains/advtrains/locale/advtrains.zh_CN.tr
@@ -0,0 +1,107 @@
+# textdomain: advtrains
+
+# Advtrains Core (unorganized)
+This wagon is owned by @1, you can't destroy it.=这是@1的车厢, 你不能摧毁它.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=警告: 如果你摧毁此车厢, 你只能拿到一些钢方块. 如果你确定要摧毁这个车厢,请按潜行键并左键单击此车厢.
+ATC controller, unconfigured.=ATC控制器 (未配置)
+ATC controller=ATC控制器
+ATC controller, mode @1@nChannel: @2=ATC控制器@n模式: @1@n频道: @2
+ATC controller, mode @1@nCommand: @2=ATC控制器@n模式: @1@n命令: @2
+Command=命令
+Command (on)=命令(激活时)
+Digiline channel=Digiline 频道
+ATC Reverse command warning: didn't reverse train, train moving!=ATC警告:未执行“R”命令, 火车在移动
+ATC command syntax error: I statement not closed: @1=ATC语法错误: "I"命令不完整: @1
+ATC command parse error: Unknown command: @1=ATC语法错误: 未知命令: @1
+This position is protected!=这里已被保护.
+You need to own at least one neighboring wagon to destroy this couple.=你必须至少拥有其中一个车厢才能解耦这两个车厢.
+This node can't be rotated using the trackworker!=你不能使用铁路调整工具旋转这个方块.
+This node can't be changed using the trackworker!=你不能使用铁路调整工具调整这个方块.
+Can't place: not pointing at node=无法放置: 你没有选择任何方块.
+Can't place: space occupied!=无法放置: 此区域已被占用.
+Can't place: protected position!=无法放置: 此区域已被保护.
+Can't place: Not enough slope items left (@1 required)=无法放置: 你没有足够的铁路斜坡放置工具 (你需要@1个)
+Can't place: There's no slope of length @1=无法放置: advtrains不支持长度为@1m的斜坡.
+Can't place: no supporting node at upper end.=无法放置: 较高端没有支撑方块.
+Deprecated Track=请不要使用
+Can't get on: wagon full or doors closed!=无法上车: 车门已关闭或车厢已满
+Use Sneak+rightclick to bypass closed doors!=请使用潜行+右键上车
+Lock couples=锁定连接处
+Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=车门已关闭, 请使用潜行+右键单击下车
+Access to @1=可前往@1
+The clipboard couldn't access the metadata. Paste failed.=无法粘贴: 剪贴板无法访问元数据
+The clipboard couldn't access the metadata. Copy failed.=无法复制: 剪贴板无法访问元数据
+
+# Train HUD/Formspecs
+Speed:=速度:
+Target:=目标速度:
+Show Inventory=显示物品栏
+Select seat:=请选择座位
+Wagon properties=车厢属性
+Save wagon properties=保存车厢属性
+Text displayed outside on train=车厢外部显示
+Text displayed inside train=车厢内部显示
+Line=火车线路
+Routingcode=路由码
+Get off=下车
+Get off (forced)=强制下车
+(Doors closed)=(车门已关闭)
+
+# General
+Save=保存
+# "off" and "on" can be translated differently depending on the context and are therefore not translated.
+off=off
+on=on
+
+# Line automation
+Station Code=车站代码
+Station Name=车站名称
+Door Delay=车门关闭时间
+Departure Speed=出发速度
+Stop Time=停站时间
+
+# Items
+Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=铁路调整工具@n@n左键单击: 切换轨道类型@n右键单击: 旋转方块
+Passive Component Naming Tool@n@nRight-click to name a passive component.=被动元件命名工具@n@n右键单击命名所选元件.
+Train copy/paste tool@n@nLeft-click: copy train@nRight-click: paste train=火车复制工具@n@n左键单击: 复制@n右键单击: 粘帖
+Track=铁轨
+Perpendicular Diamond Crossing Track=垂直交叉铁轨
+45/90 Degree Diamond Crossing Track=45度交叉铁轨
+Unloading Track=卸货铁轨
+Loading Track=装货铁轨
+Bumper=保险杠
+Detector Rail=探测铁轨
+@1 Slope=@1斜坡
+@1 Platform (low)=50cm高的@1站台
+@1 Platform (high)=1m高的@1站台
+@1 Platform (45 degree)=1m高的@1站台 (45度)
+Lampless Signal (@1)=臂板信号机 (@1)
+Signal (@1)=信号灯 (@1)
+Wallmounted Signal (l)=壁挂式信号灯 (左侧)
+Wallmounted Signal (r)=壁挂式信号灯 (右侧)
+Wallmounted Signal (t)=悬挂式信号灯
+Andrew's Cross=铁路道口信号灯
+Boiler=锅炉
+driver's cab=驾驶室
+Wheel=车轮
+Chimney=烟囱
+
+# Seats
+Default Seat=默认座位
+Default Seat (driver stand)=默认座位 (司机座位)
+Driver Stand=司机座位
+Driver Stand (left)=左侧司机座位
+Driver Stand (right)=右侧司机座位
+
+# Wagon/engine types
+Industrial Train Engine=工业用火车头
+Big Industrial Train Engine=大型工业用火车头
+Industrial tank wagon=液体运输车厢
+Industrial wood wagon=木材运输车厢
+Japanese Train Engine=高速列车车头
+Japanese Train Wagon=高速列车车厢
+Steam Engine=蒸汽机车
+Detailed Steam Engine=精细的蒸汽机车
+Passenger Wagon=客车
+Box Wagon=货运车厢
+Subway Passenger Wagon=地铁车厢
diff --git a/advtrains/advtrains/log.lua b/advtrains/advtrains/log.lua
new file mode 100644
index 0000000..d7053a2
--- /dev/null
+++ b/advtrains/advtrains/log.lua
@@ -0,0 +1,17 @@
+-- Log accesses to driver stands and changes to switches
+
+advtrains.log = function() end
+
+if minetest.settings:get_bool("advtrains_enable_logging") then
+ advtrains.logfile = advtrains.fpath .. "_log"
+
+ local log = io.open(advtrains.logfile, "a+")
+
+ function advtrains.log (event, player, pos, data)
+ log:write(os.date()..": "..event.." by "..player.." at "..minetest.pos_to_string(pos).." -- "..(data or "").."\n")
+ end
+
+ minetest.register_on_shutdown(function()
+ log:close()
+ end)
+end
diff --git a/advtrains/advtrains/lzb.lua b/advtrains/advtrains/lzb.lua
new file mode 100644
index 0000000..6cbf4ab
--- /dev/null
+++ b/advtrains/advtrains/lzb.lua
@@ -0,0 +1,191 @@
+-- lzb.lua
+-- Enforced and/or automatic train override control, providing the on_train_approach callback
+
+--[[
+Documentation of train.lzb table
+train.lzb = {
+ trav = Current index that the traverser has advanced so far
+ oncoming = table containing oncoming signals, in order of appearance on the path
+ {
+ pos = position of the point
+ idx = where this is on the path
+ spd = speed allowed to pass
+ fun = function(pos, id, train, index, speed, lzbdata)
+ -- Function that determines what to do on the train in the moment it drives over that point.
+ }
+}
+each step, for every item in "oncoming", we need to determine the location to start braking (+ some safety margin)
+and, if we passed this point for at least one of the items, initiate brake.
+When speed has dropped below, say 3, decrease the margin to zero, so that trains actually stop at the signal IP.
+The spd variable and travsht need to be updated on every aspect change. it's probably best to reset everything when any aspect changes
+]]
+
+
+local params = {
+ BRAKE_SPACE = 10,
+ AWARE_ZONE = 50,
+
+ ADD_STAND = 2.5,
+ ADD_SLOW = 1.5,
+ ADD_FAST = 7,
+ ZONE_ROLL = 2,
+ ZONE_HOLD = 5, -- added on top of ZONE_ROLL
+ ZONE_VSLOW = 3, -- When speed is <2, still allow accelerating
+
+ DST_FACTOR = 1.5,
+
+ SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX,
+}
+
+function advtrains.set_lzb_param(par, val)
+ if params[par] and tonumber(val) then
+ params[par] = tonumber(val)
+ else
+ error("Inexistant param or not a number")
+ end
+end
+
+
+local function look_ahead(id, train)
+
+ local acc = advtrains.get_acceleration(train, 1)
+ local vel = train.velocity
+ local brakedst = ( -(vel*vel) / (2*acc) ) * params.DST_FACTOR
+
+ local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + params.BRAKE_SPACE)
+ --local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE)
+
+ local lzb = train.lzb
+ local trav = lzb.trav
+
+ --train.debug = lspd
+
+ while trav <= brake_i do
+ trav = trav + 1
+ local pos = advtrains.path_get(train, trav)
+ -- check offtrack
+ if trav > train.path_trk_f then
+ table.insert(lzb.oncoming, {
+ pos = pos,
+ idx = trav-1,
+ spd = 0,
+ })
+ else
+ -- run callbacks
+ -- Note: those callbacks are defined in trainlogic.lua for consistency with the other node callbacks
+ advtrains.tnc_call_approach_callback(pos, id, train, trav, lzb.data)
+
+ end
+ end
+
+ lzb.trav = trav
+
+end
+
+--[[
+Distance needed to accelerate from v0 to v1 with constant acceleration a:
+
+ v1 - v0 a / v1 - v0 \ 2 v1^2 - v0^2
+s = v0 * ------- + - * | ------- | = -----------
+ a 2 \ a / 2*a
+]]
+
+local function apply_control(id, train)
+ local lzb = train.lzb
+
+ local i = 1
+ while i<=#lzb.oncoming do
+ if lzb.oncoming[i].idx < train.index then
+ local ent = lzb.oncoming[i]
+ if ent.fun then
+ ent.fun(ent.pos, id, train, ent.idx, ent.spd, lzb.data)
+ end
+
+ table.remove(lzb.oncoming, i)
+ else
+ i = i + 1
+ end
+ end
+
+ for i, it in ipairs(lzb.oncoming) do
+ local a = advtrains.get_acceleration(train, 1) --should be negative
+ local v0 = train.velocity
+ local v1 = it.spd
+ if v1 and v1 <= v0 then
+ local s = (v1*v1 - v0*v0) / (2*a)
+
+ local st = s + params.ADD_SLOW
+ if v0 > 3 then
+ st = s + params.ADD_FAST
+ end
+ if v0<=0 then
+ st = s + params.ADD_STAND
+ end
+
+ local i = advtrains.path_get_index_by_offset(train, it.idx, -st)
+
+ --train.debug = dump({v0f=v0*f, aff=a*f*f,v0=v0, v1=v1, f=f, a=a, s=s, st=st, i=i, idx=train.index})
+ if i <= train.index then
+ -- Gotcha! Braking...
+ train.ctrl.lzb = 1
+ --train.debug = train.debug .. "BRAKE!!!"
+ return
+ end
+
+ i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_ROLL)
+ if i <= train.index and v0>1 then
+ -- roll control
+ train.ctrl.lzb = 2
+ return
+ end
+ i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_HOLD)
+ if i <= train.index and v0>1 then
+ -- hold speed
+ train.ctrl.lzb = 3
+ return
+ end
+ end
+ end
+ train.ctrl.lzb = nil
+end
+
+local function invalidate(train)
+ train.lzb = {
+ trav = atfloor(train.index),
+ data = {},
+ oncoming = {},
+ }
+end
+
+function advtrains.lzb_invalidate(train)
+ invalidate(train)
+end
+
+-- Add LZB control point
+-- udata: User-defined additional data
+function advtrains.lzb_add_checkpoint(train, index, speed, callback, udata)
+ local lzb = train.lzb
+ local pos = advtrains.path_get(train, index)
+ table.insert(lzb.oncoming, {
+ pos = pos,
+ idx = index,
+ spd = speed,
+ fun = callback,
+ udata = udata,
+ })
+end
+
+
+advtrains.te_register_on_new_path(function(id, train)
+ invalidate(train)
+ look_ahead(id, train)
+end)
+
+advtrains.te_register_on_update(function(id, train)
+ if not train.path or not train.lzb then
+ atprint("LZB run: no path on train, skip step")
+ return
+ end
+ look_ahead(id, train)
+ apply_control(id, train)
+end, true)
diff --git a/advtrains/advtrains/misc_nodes.lua b/advtrains/advtrains/misc_nodes.lua
new file mode 100644
index 0000000..93d5572
--- /dev/null
+++ b/advtrains/advtrains/misc_nodes.lua
@@ -0,0 +1,118 @@
+--all nodes that do not fit in any other category
+
+function advtrains.register_platform(modprefix, preset)
+ local ndef=minetest.registered_nodes[preset]
+ if not ndef then
+ minetest.log("warning", " 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(modprefix .. ":platform_low_"..nodename, {
+ description = attrans("@1 Platform (low)", desc),
+ 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(modprefix .. ":platform_high_"..nodename, {
+ description = attrans("@1 Platform (high)", desc),
+ 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, 0.5, 0.5, 0.5},
+ {-0.5, -0.5, 0.1 , 0.5, 0.3, 0.5}
+ },
+ },
+ paramtype2="facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ local diagonalbox = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, 0.5, -0.25, 0.5, -0.8 },
+ {-0.25, -0.5, 0.5 , 0, 0.5, -0.55},
+ {0, -0.5, 0.5 , 0.25, 0.5, -0.3 },
+ {0.25 , -0.5, 0.5, 0.5, 0.5, -0.05}
+ }
+ }
+ minetest.register_node(modprefix..":platform_45_"..nodename, {
+ description = attrans("@1 Platform (45 degree)", desc),
+ groups = {cracky = 1, not_blocking_trains = 1, platform=2},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "mesh",
+ mesh = "advtrains_platform_diag.b3d",
+ selection_box = diagonalbox,
+ collision_box = diagonalbox,
+ tiles = {btex, btex.."^advtrains_platform_diag.png"},
+ paramtype2 = "facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ local diagonalbox_low = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, 0.5, -0.25, 0, -0.8 },
+ {-0.25, -0.5, 0.5 , 0, 0, -0.55},
+ {0, -0.5, 0.5 , 0.25, 0, -0.3 },
+ {0.25 , -0.5, 0.5, 0.5, 0, -0.05}
+ }
+ }
+ minetest.register_node(modprefix..":platform_45_low_"..nodename, {
+ description = attrans("@1 Platform (low, 45 degree)", desc),
+ groups = {cracky = 1, not_blocking_trains = 1, platform=2},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "mesh",
+ mesh = "advtrains_platform_diag_low.b3d",
+ selection_box = diagonalbox_low,
+ collision_box = diagonalbox_low,
+ tiles = {btex, btex.."^advtrains_platform_diag.png"},
+ paramtype2 = "facedir",
+ paramtype = "light",
+ sunlight_propagates = true,
+ })
+ minetest.register_craft({
+ type="shapeless",
+ output = modprefix .. ":platform_high_"..nodename.." 4",
+ recipe = {
+ "dye:yellow", preset, preset
+ },
+ })
+ minetest.register_craft({
+ type="shapeless",
+ output = modprefix .. ":platform_low_"..nodename.." 4",
+ recipe = {
+ "dye:yellow", preset
+ },
+ })
+ minetest.register_craft({
+ type="shapeless",
+ output = modprefix .. ":platform_45_"..nodename.." 2",
+ recipe = {
+ "dye:yellow", preset, preset, preset
+ }
+ })
+end
+
+
+advtrains.register_platform("advtrains", "default:stonebrick")
+advtrains.register_platform("advtrains", "default:sandstonebrick")
diff --git a/advtrains/advtrains/models/advtrains_across.obj b/advtrains/advtrains/models/advtrains_across.obj
new file mode 100644
index 0000000..4ebf393
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_across.obj
@@ -0,0 +1,537 @@
+# Blender v2.78 (sub 0) OBJ File: 'andreaskreuz.blend'
+# www.blender.org
+o Cube
+v 0.183133 0.500062 -0.365883
+v 0.300122 0.552646 -0.365883
+v 0.300122 0.552646 -0.337392
+v 0.183133 0.500062 -0.337392
+v -0.300121 1.575195 -0.365883
+v -0.183133 1.627780 -0.365883
+v -0.183133 1.627780 -0.337392
+v -0.300121 1.575195 -0.337392
+v -0.035079 -0.503415 -0.299723
+v -0.035079 1.055075 -0.299723
+v -0.024805 -0.503415 -0.324528
+v -0.024805 1.055075 -0.324528
+v -0.000000 -0.503415 -0.334802
+v -0.000000 1.055075 -0.334802
+v 0.024805 -0.503415 -0.324528
+v 0.024805 1.055075 -0.324528
+v 0.035079 -0.503415 -0.299723
+v 0.035079 1.055075 -0.299723
+v 0.024805 -0.503415 -0.274918
+v 0.024805 1.055075 -0.274918
+v -0.000000 -0.503415 -0.264644
+v -0.000000 1.055075 -0.264644
+v -0.024805 -0.503415 -0.274918
+v -0.024805 1.055075 -0.274918
+v -0.000000 -0.698893 -0.299723
+v -0.032318 0.979391 -0.365883
+v -0.084671 1.095865 -0.365883
+v 0.084671 1.031976 -0.365883
+v 0.032318 1.148450 -0.365883
+v 0.084671 1.031976 -0.337392
+v 0.032318 1.148450 -0.337392
+v -0.032318 0.979391 -0.337392
+v -0.084671 1.095865 -0.337392
+v -0.133841 1.055075 -0.323880
+v -0.096352 1.055075 -0.376499
+v -0.115909 0.988154 -0.323880
+v -0.083444 1.006899 -0.376499
+v -0.066920 0.939165 -0.323880
+v -0.048176 0.971631 -0.376499
+v -0.000000 0.921234 -0.323880
+v -0.000000 0.958722 -0.376499
+v 0.066920 0.939165 -0.323880
+v 0.048176 0.971631 -0.376499
+v 0.115909 0.988154 -0.323880
+v 0.083443 1.006899 -0.376499
+v 0.133841 1.055075 -0.323880
+v 0.096352 1.055075 -0.376499
+v 0.115909 1.121995 -0.323880
+v 0.083443 1.103251 -0.376499
+v 0.066920 1.170984 -0.323880
+v 0.048176 1.138518 -0.376499
+v 0.000000 1.188915 -0.323880
+v 0.000000 1.151427 -0.376499
+v -0.066920 1.170984 -0.323880
+v -0.048176 1.138518 -0.376499
+v -0.115909 1.121995 -0.323880
+v -0.083444 1.103251 -0.376499
+v -0.115909 0.988154 -0.376499
+v -0.133841 1.055075 -0.376499
+v -0.066920 0.939165 -0.376499
+v -0.000000 0.921234 -0.376499
+v 0.066920 0.939165 -0.376499
+v 0.115909 0.988154 -0.376499
+v 0.133841 1.055075 -0.376499
+v 0.115909 1.121995 -0.376499
+v 0.066920 1.170984 -0.376499
+v 0.000000 1.188915 -0.376499
+v -0.066920 1.170984 -0.376499
+v -0.115909 1.121995 -0.376499
+v -0.094673 1.000415 -0.376499
+v -0.109318 1.055075 -0.376499
+v -0.054659 0.960402 -0.376499
+v -0.000000 0.945756 -0.376499
+v 0.054659 0.960402 -0.376499
+v 0.094672 1.000415 -0.376499
+v 0.109318 1.055075 -0.376499
+v 0.094672 1.109734 -0.376499
+v 0.054659 1.149747 -0.376499
+v 0.000000 1.164393 -0.376499
+v -0.054659 1.149747 -0.376499
+v -0.094672 1.109734 -0.376499
+v -0.094673 1.000415 -0.397361
+v -0.109318 1.055075 -0.397361
+v -0.054659 0.960402 -0.397361
+v -0.000000 0.945756 -0.397361
+v 0.054659 0.960402 -0.397361
+v 0.094672 1.000415 -0.397361
+v 0.109318 1.055075 -0.397361
+v 0.094672 1.109734 -0.459571
+v 0.054659 1.149747 -0.459571
+v 0.000000 1.164393 -0.459571
+v -0.054659 1.149747 -0.459571
+v -0.094672 1.109734 -0.459571
+v -0.083444 1.006899 -0.397361
+v -0.096352 1.055075 -0.397361
+v -0.048176 0.971631 -0.397361
+v -0.000000 0.958722 -0.397361
+v 0.048176 0.971631 -0.397361
+v 0.083443 1.006899 -0.397361
+v 0.096352 1.055075 -0.397361
+v 0.083443 1.103251 -0.459571
+v 0.048176 1.138518 -0.459571
+v 0.000000 1.151427 -0.459571
+v -0.048176 1.138518 -0.459571
+v -0.083444 1.103251 -0.459571
+v 0.084671 1.095865 -0.337392
+v 0.032318 0.979391 -0.337392
+v -0.032318 1.148450 -0.337392
+v -0.084671 1.031976 -0.337392
+v -0.032318 1.148450 -0.365883
+v -0.084671 1.031976 -0.365883
+v 0.084671 1.095865 -0.365883
+v 0.032318 0.979391 -0.365883
+v 0.300122 1.575195 -0.337392
+v 0.183133 1.627780 -0.337392
+v 0.183133 1.627780 -0.365883
+v 0.300122 1.575195 -0.365883
+v -0.183133 0.500062 -0.337392
+v -0.300121 0.552646 -0.337392
+v -0.300121 0.552646 -0.365883
+v -0.183133 0.500062 -0.365883
+vt 0.9201 0.4239
+vt 0.9201 0.4892
+vt 0.9044 0.4892
+vt 0.9044 0.4239
+vt 0.1944 0.7581
+vt 0.2101 0.7581
+vt 0.2101 0.8279
+vt 0.1944 0.8279
+vt 0.2539 0.3060
+vt 0.2539 0.0160
+vt 0.3247 0.0160
+vt 0.3247 0.3060
+vt 0.4596 0.8350
+vt 0.7496 0.8350
+vt 0.7496 0.8507
+vt 0.4596 0.8507
+vt 0.2539 0.6281
+vt 0.2539 0.3381
+vt 0.3247 0.3381
+vt 0.3247 0.6281
+vt 0.7609 0.4251
+vt 0.7609 0.1508
+vt 0.7767 0.1508
+vt 0.7767 0.4251
+vt 0.2081 0.7222
+vt 0.2081 0.0160
+vt 0.2218 0.0199
+vt 0.2218 0.7261
+vt 0.0434 0.0160
+vt 0.0434 0.9840
+vt 0.0297 0.9840
+vt 0.0297 0.0160
+vt 0.0160 0.9840
+vt 0.0160 0.0160
+vt 0.1623 0.0183
+vt 0.1623 0.9082
+vt 0.1486 0.9060
+vt 0.1486 0.0160
+vt 0.1350 0.9082
+vt 0.1350 0.0183
+vt 0.0755 0.9840
+vt 0.0755 0.0160
+vt 0.0892 0.0160
+vt 0.0892 0.9840
+vt 0.7932 0.9090
+vt 0.7830 0.8984
+vt 0.7830 0.8836
+vt 0.7932 0.8734
+vt 0.8076 0.8737
+vt 0.8178 0.8844
+vt 0.8178 0.8991
+vt 0.8076 0.9093
+vt 0.1029 0.0160
+vt 0.1029 0.9840
+vt 0.1944 0.7261
+vt 0.1944 0.0199
+vt 0.2199 0.8822
+vt 0.2124 0.8943
+vt 0.2019 0.8972
+vt 0.1944 0.8892
+vt 0.1944 0.8750
+vt 0.2019 0.8629
+vt 0.2124 0.8600
+vt 0.2199 0.8680
+vt 0.8087 0.4251
+vt 0.8087 0.1508
+vt 0.8245 0.1508
+vt 0.8245 0.4251
+vt 0.4275 0.3381
+vt 0.4275 0.6281
+vt 0.3567 0.6281
+vt 0.3567 0.3381
+vt 0.6653 0.4408
+vt 0.6653 0.1508
+vt 0.6811 0.1508
+vt 0.6811 0.4408
+vt 0.5625 0.3060
+vt 0.5625 0.0160
+vt 0.6333 0.0160
+vt 0.6333 0.3060
+vt 0.7433 0.4931
+vt 0.7723 0.4931
+vt 0.7723 0.5268
+vt 0.7433 0.5268
+vt 0.7723 0.5650
+vt 0.7433 0.5650
+vt 0.7723 0.5975
+vt 0.7433 0.5975
+vt 0.9044 0.2874
+vt 0.9334 0.2874
+vt 0.9334 0.3198
+vt 0.9044 0.3198
+vt 0.9334 0.3581
+vt 0.9044 0.3581
+vt 0.9334 0.3918
+vt 0.9044 0.3918
+vt 0.8566 0.8329
+vt 0.8856 0.8329
+vt 0.8856 0.8708
+vt 0.8566 0.8708
+vt 0.8856 0.9063
+vt 0.8566 0.9063
+vt 0.9334 0.2553
+vt 0.9044 0.2553
+vt 0.9044 0.2220
+vt 0.9334 0.2220
+vt 0.9044 0.1838
+vt 0.9334 0.1838
+vt 0.7029 0.1188
+vt 0.6791 0.1050
+vt 0.6653 0.0812
+vt 0.6653 0.0536
+vt 0.6791 0.0298
+vt 0.7029 0.0160
+vt 0.7305 0.0160
+vt 0.7543 0.0298
+vt 0.7681 0.0536
+vt 0.7681 0.0812
+vt 0.7543 0.1050
+vt 0.7305 0.1188
+vt 0.9044 0.1508
+vt 0.9334 0.1508
+vt 0.7433 0.4729
+vt 0.7723 0.4729
+vt 0.4596 0.7507
+vt 0.4596 0.7124
+vt 0.4787 0.6793
+vt 0.5118 0.6602
+vt 0.5501 0.6602
+vt 0.5832 0.6793
+vt 0.6023 0.7124
+vt 0.6023 0.7507
+vt 0.5832 0.7838
+vt 0.5501 0.8029
+vt 0.5118 0.8029
+vt 0.4787 0.7838
+vt 0.3408 0.6733
+vt 0.3096 0.6733
+vt 0.3061 0.6602
+vt 0.3443 0.6602
+vt 0.2826 0.6889
+vt 0.2730 0.6793
+vt 0.2669 0.7160
+vt 0.2539 0.7124
+vt 0.2669 0.7472
+vt 0.2539 0.7507
+vt 0.2826 0.7742
+vt 0.2730 0.7838
+vt 0.3096 0.7898
+vt 0.3061 0.8029
+vt 0.3408 0.7898
+vt 0.3443 0.8029
+vt 0.3679 0.7742
+vt 0.3774 0.7838
+vt 0.3835 0.7472
+vt 0.3966 0.7507
+vt 0.3835 0.7160
+vt 0.3966 0.7124
+vt 0.3679 0.6889
+vt 0.3774 0.6793
+vt 0.8044 0.4994
+vt 0.8044 0.4729
+vt 0.8159 0.4729
+vt 0.8159 0.4994
+vt 0.9044 0.6442
+vt 0.9044 0.6187
+vt 0.9159 0.6187
+vt 0.9159 0.6442
+vt 0.8460 0.0160
+vt 0.8460 0.0429
+vt 0.8001 0.0429
+vt 0.8001 0.0160
+vt 0.2773 0.8808
+vt 0.2539 0.8808
+vt 0.2539 0.8350
+vt 0.2773 0.8350
+vt 0.7112 0.4729
+vt 0.7112 0.4994
+vt 0.6997 0.4994
+vt 0.6997 0.4729
+vt 0.9044 0.6715
+vt 0.9159 0.6715
+vt 0.8460 0.0742
+vt 0.8001 0.0742
+vt 0.3048 0.8808
+vt 0.3048 0.8350
+vt 0.7112 0.5306
+vt 0.6997 0.5306
+vt 0.8460 0.1014
+vt 0.8001 0.1014
+vt 0.3290 0.8808
+vt 0.3290 0.8693
+vt 0.7112 0.5582
+vt 0.6997 0.5582
+vt 0.7302 0.7561
+vt 0.7440 0.7323
+vt 0.7509 0.7341
+vt 0.7353 0.7611
+vt 0.7440 0.7047
+vt 0.7509 0.7029
+vt 0.7302 0.6809
+vt 0.7353 0.6758
+vt 0.7064 0.6671
+vt 0.7083 0.6602
+vt 0.6789 0.6671
+vt 0.6770 0.6602
+vt 0.6550 0.6809
+vt 0.6500 0.6758
+vt 0.6413 0.7047
+vt 0.6344 0.7029
+vt 0.6413 0.7323
+vt 0.6344 0.7341
+vt 0.6550 0.7561
+vt 0.6500 0.7611
+vt 0.6789 0.7699
+vt 0.6770 0.7768
+vt 0.7064 0.7699
+vt 0.7083 0.7768
+vt 0.9024 0.7257
+vt 0.9024 0.7491
+vt 0.8566 0.7491
+vt 0.8566 0.7257
+vt 0.7112 0.5746
+vt 0.6653 0.5746
+vt 0.8896 0.0160
+vt 0.8896 0.0400
+vt 0.8781 0.0400
+vt 0.8781 0.0160
+vt 0.8044 0.5306
+vt 0.8159 0.5306
+vt 0.9024 0.7766
+vt 0.8566 0.7766
+vt 0.8896 0.0675
+vt 0.8781 0.0675
+vt 0.8044 0.5582
+vt 0.8159 0.5582
+vt 0.9024 0.8008
+vt 0.8909 0.8008
+vt 0.8896 0.0912
+vt 0.8781 0.0912
+vt 0.3756 0.8659
+vt 0.3756 0.8350
+vt 0.3872 0.8350
+vt 0.4215 0.8659
+vt 0.3436 0.8808
+vt 0.3436 0.8693
+vt 0.3756 0.8949
+vt 0.4215 0.8949
+vt 0.7987 0.8413
+vt 0.7830 0.8413
+vt 0.7830 0.6602
+vt 0.7987 0.6602
+vt 0.4596 0.0160
+vt 0.5304 0.0160
+vt 0.5304 0.3060
+vt 0.4596 0.3060
+vt 0.8723 0.6936
+vt 0.8566 0.6936
+vt 0.8566 0.5125
+vt 0.8723 0.5125
+vt 0.8723 0.4572
+vt 0.8566 0.4572
+vt 0.9044 0.5213
+vt 0.9201 0.5213
+vt 0.9201 0.5866
+vt 0.9044 0.5866
+vt 0.5304 0.6281
+vt 0.4596 0.6281
+vt 0.4596 0.3381
+vt 0.5304 0.3381
+vt 0.3567 0.0160
+vt 0.4275 0.0160
+vt 0.4275 0.3060
+vt 0.3567 0.3060
+vt 0.8723 0.4251
+vt 0.8566 0.4251
+vt 0.8566 0.1508
+vt 0.8723 0.1508
+vt 0.7289 0.4251
+vt 0.7131 0.4251
+vt 0.7131 0.1508
+vt 0.7289 0.1508
+vt 0.6333 0.6281
+vt 0.5625 0.6281
+vt 0.5625 0.3381
+vt 0.6333 0.3381
+vn 0.4100 -0.9121 0.0000
+vn -0.4100 0.9121 0.0000
+vn 0.0000 0.0000 -1.0000
+vn 0.9121 0.4100 0.0000
+vn 0.0000 0.0000 1.0000
+vn -0.9121 -0.4100 0.0000
+vn -0.9239 0.0000 -0.3827
+vn -0.3827 0.0000 -0.9239
+vn 0.3827 0.0000 -0.9239
+vn 0.9239 0.0000 -0.3827
+vn 0.9239 0.0000 0.3827
+vn 0.3827 0.0000 0.9239
+vn 0.0000 1.0000 0.0000
+vn -0.3827 0.0000 0.9239
+vn -0.9239 0.0000 0.3827
+vn 0.0000 -1.0000 0.0000
+vn -0.9659 -0.2588 0.0000
+vn -0.7071 -0.7071 0.0000
+vn -0.2588 -0.9659 -0.0000
+vn 0.2588 -0.9659 0.0000
+vn 0.7071 -0.7071 0.0000
+vn 0.9659 -0.2588 0.0000
+vn 0.9659 0.2588 0.0000
+vn 0.7071 0.7071 0.0000
+vn 0.2588 0.9659 0.0000
+vn -0.2588 0.9659 -0.0000
+vn -0.7071 0.7071 0.0000
+vn -0.9659 0.2588 0.0000
+vn 0.1966 -0.7339 -0.6502
+vn -0.1967 -0.7339 -0.6502
+vn -0.9121 0.4100 0.0000
+vn 0.4100 0.9121 0.0000
+vn -0.4100 -0.9121 0.0000
+vn 0.9121 -0.4100 -0.0000
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 5/5/2 8/6/2 7/7/2 6/8/2
+f 27/9/3 5/10/3 6/11/3 29/12/3
+f 29/13/4 6/14/4 7/15/4 31/16/4
+f 31/17/5 7/18/5 8/19/5 33/20/5
+f 26/21/6 1/22/6 4/23/6 32/24/6
+f 9/25/7 10/26/7 12/27/7 11/28/7
+f 11/29/8 12/30/8 14/31/8 13/32/8
+f 13/32/9 14/31/9 16/33/9 15/34/9
+f 15/35/10 16/36/10 18/37/10 17/38/10
+f 17/38/11 18/37/11 20/39/11 19/40/11
+f 19/41/12 20/42/12 22/43/12 21/44/12
+f 12/45/13 10/46/13 24/47/13 22/48/13 20/49/13 18/50/13 16/51/13 14/52/13
+f 21/44/14 22/43/14 24/53/14 23/54/14
+f 23/55/15 24/56/15 10/26/15 9/25/15
+f 9/57/16 11/58/16 13/59/16 15/60/16 17/61/16 19/62/16 21/63/16 23/64/16
+f 5/65/6 27/66/6 33/67/6 8/68/6
+f 3/69/5 30/70/5 32/71/5 4/72/5
+f 2/73/4 28/74/4 30/75/4 3/76/4
+f 1/77/3 26/78/3 28/79/3 2/80/3
+f 34/81/17 59/82/17 58/83/17 36/84/17
+f 36/84/18 58/83/18 60/85/18 38/86/18
+f 38/86/19 60/85/19 61/87/19 40/88/19
+f 40/89/20 61/90/20 62/91/20 42/92/20
+f 42/92/21 62/91/21 63/93/21 44/94/21
+f 44/94/22 63/93/22 64/95/22 46/96/22
+f 46/97/23 64/98/23 65/99/23 48/100/23
+f 48/100/24 65/99/24 66/101/24 50/102/24
+f 50/103/25 66/104/25 67/105/25 52/106/25
+f 52/106/26 67/105/26 68/107/26 54/108/26
+f 37/109/3 35/110/3 57/111/3 55/112/3 53/113/3 51/114/3 49/115/3 47/116/3 45/117/3 43/118/3 41/119/3 39/120/3
+f 54/108/27 68/107/27 69/121/27 56/122/27
+f 56/123/28 69/124/28 59/82/28 34/81/28
+f 34/125/5 36/126/5 38/127/5 40/128/5 42/129/5 44/130/5 46/131/5 48/132/5 50/133/5 52/134/5 54/135/5 56/136/5
+f 71/137/3 70/138/3 58/139/3 59/140/3
+f 70/138/3 72/141/3 60/142/3 58/139/3
+f 72/141/3 73/143/3 61/144/3 60/142/3
+f 73/143/3 74/145/3 62/146/3 61/144/3
+f 74/145/3 75/147/3 63/148/3 62/146/3
+f 75/147/3 76/149/3 64/150/3 63/148/3
+f 76/149/3 77/151/3 65/152/3 64/150/3
+f 77/151/3 78/153/3 66/154/3 65/152/3
+f 78/153/3 79/155/3 67/156/3 66/154/3
+f 79/155/3 80/157/3 68/158/3 67/156/3
+f 80/157/3 81/159/3 69/160/3 68/158/3
+f 81/159/3 71/137/3 59/140/3 69/160/3
+f 74/161/20 73/162/20 85/163/20 86/164/20
+f 37/165/24 39/166/24 96/167/24 94/168/24
+f 81/169/27 80/170/27 92/171/27 93/172/27
+f 51/173/19 53/174/19 103/175/19 102/176/19
+f 73/177/19 72/178/19 84/179/19 85/180/19
+f 35/181/23 37/165/23 94/168/23 95/182/23
+f 80/170/26 79/183/26 91/184/26 92/171/26
+f 49/185/18 51/173/18 102/176/18 101/186/18
+f 72/178/18 70/187/18 82/188/18 84/179/18
+f 79/183/25 78/189/25 90/190/25 91/184/25
+f 47/191/17 49/185/17 101/186/17 100/192/17
+f 70/187/17 71/193/17 83/194/17 82/188/17
+f 95/195/3 94/196/3 82/197/3 83/198/3
+f 94/196/3 96/199/3 84/200/3 82/197/3
+f 96/199/3 97/201/3 85/202/3 84/200/3
+f 97/201/3 98/203/3 86/204/3 85/202/3
+f 98/203/3 99/205/3 87/206/3 86/204/3
+f 99/205/3 100/207/3 88/208/3 87/206/3
+f 100/207/29 101/209/29 89/210/29 88/208/29
+f 101/209/3 102/211/3 90/212/3 89/210/3
+f 102/211/3 103/213/3 91/214/3 90/212/3
+f 103/213/3 104/215/3 92/216/3 91/214/3
+f 104/215/3 105/217/3 93/218/3 92/216/3
+f 105/217/30 95/195/30 83/198/30 93/218/30
+f 53/219/20 55/220/20 104/221/20 103/222/20
+f 71/193/28 81/223/28 93/224/28 83/194/28
+f 39/225/25 41/226/25 97/227/25 96/228/25
+f 75/229/21 74/161/21 86/164/21 87/230/21
+f 55/220/21 57/231/21 105/232/21 104/221/21
+f 41/226/26 43/233/26 98/234/26 97/227/26
+f 76/235/22 75/229/22 87/230/22 88/236/22
+f 57/231/22 35/237/22 95/238/22 105/232/22
+f 43/233/27 45/239/27 99/240/27 98/234/27
+f 77/241/23 76/242/23 88/243/23 89/244/23
+f 45/245/28 47/191/28 100/192/28 99/246/28
+f 78/247/24 77/241/24 89/244/24 90/248/24
+f 120/249/31 119/250/31 109/251/31 111/252/31
+f 112/253/3 110/254/3 116/255/3 117/256/3
+f 110/257/31 108/258/31 115/259/31 116/260/31
+f 117/261/32 116/260/32 115/259/32 114/262/32
+f 121/263/33 118/264/33 119/265/33 120/266/33
+f 119/267/5 118/268/5 107/269/5 109/270/5
+f 108/271/5 106/272/5 114/273/5 115/274/5
+f 113/275/34 107/276/34 118/277/34 121/278/34
+f 117/279/34 114/280/34 106/281/34 112/282/34
+f 121/283/3 120/284/3 111/285/3 113/286/3
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3d
new file mode 100644
index 0000000..a6d9745
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3d
new file mode 100644
index 0000000..5f5b3f4
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3d
new file mode 100644
index 0000000..f13ae75
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3d
new file mode 100644
index 0000000..59a2285
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_bumper_st_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr.b3d
new file mode 100644
index 0000000..c708292
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr_30.b3d
new file mode 100644
index 0000000..7ca0bda
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr_45.b3d
new file mode 100644
index 0000000..b22ea0d
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_cr_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_cr_60.b3d
new file mode 100644
index 0000000..e9b16d6
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_cr_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st.b3d b/advtrains/advtrains/models/advtrains_dtrack_st.b3d
new file mode 100644
index 0000000..c240416
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_st_30.b3d
new file mode 100644
index 0000000..fd77e66
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_st_45.b3d
new file mode 100644
index 0000000..af3afb1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_st_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_st_60.b3d
new file mode 100644
index 0000000..6cb19e6
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_st_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr.b3d
new file mode 100644
index 0000000..8b1ac0e
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3d
new file mode 100644
index 0000000..6def7ab
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3d
new file mode 100644
index 0000000..cc874ca
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3d
new file mode 100644
index 0000000..1472a00
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlcr_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst.b3d
new file mode 100644
index 0000000..ecdb326
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3d
new file mode 100644
index 0000000..fd6e91d
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3d
new file mode 100644
index 0000000..dae694e
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3d
new file mode 100644
index 0000000..8f2b0e2
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swlst_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr.b3d
new file mode 100644
index 0000000..4610826
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3d
new file mode 100644
index 0000000..71b87f3
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3d
new file mode 100644
index 0000000..5457972
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3d
new file mode 100644
index 0000000..167a3ff
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrcr_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst.b3d
new file mode 100644
index 0000000..69b6996
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3d
new file mode 100644
index 0000000..19ee483
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3d
new file mode 100644
index 0000000..70d051f
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3d b/advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3d
new file mode 100644
index 0000000..69a58fb
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_swrst_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst1.obj b/advtrains/advtrains/models/advtrains_dtrack_vst1.obj
new file mode 100644
index 0000000..33d9bf3
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst1.obj
@@ -0,0 +1,348 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst1_Cube.031
+v 0.753760 -0.500000 -0.500000
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.000000 0.500000
+v -0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.000000 0.500000
+v 0.329165 -0.196108 0.171599
+v 0.329165 -0.032047 0.171599
+v 0.329165 -0.367707 -0.171599
+v 0.329165 -0.203646 -0.171599
+v 0.462280 -0.196108 0.171599
+v 0.462280 -0.032047 0.171599
+v 0.462280 -0.367707 -0.171599
+v 0.462280 -0.203646 -0.171599
+v 0.412289 0.040000 0.500000
+v 0.412289 -0.460000 -0.500000
+v 0.560528 -0.460000 -0.500000
+v 0.560528 0.040000 0.500000
+v 0.474055 0.060000 0.500000
+v 0.474055 -0.440000 -0.500000
+v 0.498762 -0.440000 -0.500000
+v 0.498762 0.060000 0.500000
+v 0.474055 0.110000 0.500000
+v 0.474055 -0.390000 -0.500000
+v 0.498762 -0.390000 -0.500000
+v 0.498762 0.110000 0.500000
+v 0.529645 -0.385000 -0.500000
+v 0.529645 0.115000 0.500000
+v 0.443172 0.115000 0.500000
+v 0.443172 -0.385000 -0.500000
+v 0.529645 -0.360000 -0.500000
+v 0.529645 0.140000 0.500000
+v 0.443172 0.140000 0.500000
+v 0.443172 -0.360000 -0.500000
+v 0.741194 -0.042500 0.435000
+v -0.741194 -0.042500 0.435000
+v -0.741194 -0.102500 0.315000
+v 0.741194 -0.102500 0.315000
+v 0.741193 0.007500 0.435000
+v -0.741194 0.007500 0.435000
+v -0.741194 -0.052500 0.315000
+v 0.741194 -0.052500 0.315000
+v -0.011733 2.879186 0.500000
+v -0.011732 2.379186 -0.500001
+v -0.011733 2.900814 0.500000
+v -0.011732 2.400814 -0.500000
+v 0.011732 2.379186 -0.500000
+v 0.011732 2.879186 0.500000
+v 0.011732 2.400814 -0.500000
+v 0.011732 2.900814 0.500000
+v -0.412289 -0.460000 -0.500000
+v -0.412289 0.040000 0.500000
+v -0.560528 0.040000 0.500000
+v -0.560528 -0.460000 -0.500000
+v -0.474055 -0.440000 -0.500000
+v -0.474055 0.060000 0.500000
+v -0.498762 0.060000 0.500000
+v -0.498762 -0.440000 -0.500000
+v -0.474055 -0.390000 -0.500000
+v -0.474055 0.110000 0.500000
+v -0.498762 0.110000 0.500000
+v -0.498762 -0.390000 -0.500000
+v -0.529645 0.115000 0.500000
+v -0.529645 -0.385000 -0.500000
+v -0.443172 -0.385000 -0.500000
+v -0.443172 0.115000 0.500000
+v -0.529645 0.140000 0.500000
+v -0.529645 -0.360000 -0.500000
+v -0.443172 -0.360000 -0.500000
+v -0.443172 0.140000 0.500000
+v -0.741194 -0.477500 -0.435000
+v 0.741194 -0.477500 -0.435000
+v 0.741194 -0.417500 -0.315000
+v -0.741194 -0.417500 -0.315000
+v -0.741193 -0.427500 -0.435000
+v 0.741194 -0.427500 -0.435000
+v 0.741194 -0.367500 -0.315000
+v -0.741194 -0.367500 -0.315000
+v 0.741194 -0.166069 0.187862
+v -0.741194 -0.166069 0.187862
+v -0.741194 -0.226069 0.067862
+v 0.741194 -0.226069 0.067862
+v 0.741193 -0.116069 0.187862
+v -0.741194 -0.116069 0.187862
+v -0.741194 -0.176069 0.067862
+v 0.741194 -0.176069 0.067862
+v -0.741194 -0.353931 -0.187862
+v 0.741194 -0.353931 -0.187862
+v 0.741194 -0.293931 -0.067862
+v -0.741194 -0.293931 -0.067862
+v -0.741193 -0.303931 -0.187862
+v 0.741194 -0.303931 -0.187862
+v 0.741194 -0.243931 -0.067862
+v -0.741194 -0.243931 -0.067862
+v -0.329165 -0.196108 0.171599
+v -0.329165 -0.032047 0.171599
+v -0.329165 -0.367707 -0.171599
+v -0.329165 -0.203646 -0.171599
+v -0.462280 -0.196108 0.171599
+v -0.462280 -0.032047 0.171599
+v -0.462280 -0.367707 -0.171599
+v -0.462280 -0.203646 -0.171599
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2064 -0.1190
+vt -0.2978 -0.1190
+vt -0.2978 -0.6179
+vt 1.2064 -0.6179
+vt -0.2924 0.9963
+vt -0.2924 -0.0015
+vt 1.2117 -0.0015
+vt 1.2117 0.9963
+vt 1.2064 0.9965
+vt 1.6526 0.1041
+vt -0.2978 0.9965
+vt -0.7440 0.1041
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.8944 -0.4472
+vn 1.0000 0.0000 0.0000
+vn -0.2782 0.8591 -0.4296
+vn 0.2782 0.8591 -0.4296
+vn 0.1433 -0.8852 0.4426
+vn -0.1433 -0.8852 0.4426
+vn 0.0000 -0.8944 0.4472
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst1_Cube.031_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst1_Cube.031_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 1/155/11 2/156/11 5/157/11 4/158/11
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj b/advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj
new file mode 100644
index 0000000..8ff8343
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst1_45.obj
@@ -0,0 +1,434 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst1_45_Cube.033
+v 0.111416 -0.221340 0.354093
+v 0.111416 -0.057279 0.354093
+v 0.354093 -0.342660 0.111416
+v 0.354093 -0.178600 0.111416
+v 0.205542 -0.221340 0.448220
+v 0.205542 -0.057279 0.448220
+v 0.448220 -0.342660 0.205543
+v 0.448220 -0.178600 0.205543
+v -0.208358 0.039814 0.791422
+v 0.791423 -0.460000 -0.208357
+v 0.896243 -0.460000 -0.103536
+v -0.103538 0.039814 0.896242
+v -0.164683 0.059814 0.835097
+v 0.835098 -0.440000 -0.164682
+v 0.852568 -0.440000 -0.147212
+v -0.147213 0.059814 0.852567
+v -0.164683 0.109814 0.835097
+v 0.835098 -0.390000 -0.164682
+v 0.852568 -0.390000 -0.147212
+v -0.147213 0.109814 0.852567
+v 0.874406 -0.385000 -0.125374
+v -0.125375 0.114814 0.874405
+v -0.186520 0.114814 0.813259
+v 0.813260 -0.385000 -0.186519
+v 0.874406 -0.360000 -0.125374
+v -0.125375 0.139814 0.874405
+v -0.186520 0.139814 0.813259
+v 0.813260 -0.360000 -0.186519
+v 0.476117 -0.186104 0.572089
+v -0.572088 -0.186104 -0.476117
+v -0.656942 -0.143684 -0.391265
+v 0.391264 -0.143684 0.656941
+v 0.476117 -0.236104 0.572089
+v -0.572088 -0.236104 -0.476117
+v -0.656941 -0.193684 -0.391265
+v 0.391264 -0.193684 0.656942
+v -0.508186 2.879001 0.491594
+v 0.491594 2.379186 -0.508186
+v -0.508186 2.900629 0.491593
+v 0.491594 2.400814 -0.508186
+v 0.508186 2.379186 -0.491594
+v -0.491594 2.879001 0.508186
+v 0.508186 2.400814 -0.491594
+v -0.491594 2.900629 0.508186
+v 0.208358 -0.460000 -0.791421
+v -0.791423 0.039814 0.208357
+v -0.896244 0.039814 0.103537
+v 0.103537 -0.460000 -0.896242
+v 0.164682 -0.440000 -0.835097
+v -0.835099 0.059815 0.164682
+v -0.852568 0.059814 0.147212
+v 0.147212 -0.440000 -0.852567
+v 0.164682 -0.390000 -0.835097
+v -0.835099 0.109815 0.164682
+v -0.852568 0.109814 0.147212
+v 0.147212 -0.390000 -0.852567
+v -0.874406 0.114814 0.125374
+v 0.125375 -0.385000 -0.874404
+v 0.186520 -0.385000 -0.813259
+v -0.813261 0.114815 0.186520
+v -0.874406 0.139814 0.125374
+v 0.125375 -0.360000 -0.874404
+v 0.186520 -0.360000 -0.813259
+v -0.813261 0.139814 0.186520
+v -0.230055 -0.407095 -0.818151
+v 0.818151 -0.407095 0.230055
+v 0.733298 -0.364675 0.314908
+v -0.314908 -0.364675 -0.733299
+v -0.230055 -0.357095 -0.818151
+v 0.818151 -0.357095 0.230056
+v 0.733298 -0.314675 0.314908
+v -0.314908 -0.314675 -0.733298
+v 0.314908 -0.105511 0.733298
+v -0.733298 -0.105511 -0.314908
+v -0.818151 -0.063091 -0.230056
+v 0.230055 -0.063091 0.818151
+v 0.314908 -0.155511 0.733298
+v -0.733298 -0.155511 -0.314908
+v -0.818151 -0.113091 -0.230055
+v 0.230055 -0.113091 0.818151
+v -0.391264 -0.326502 -0.656942
+v 0.656941 -0.326502 0.391265
+v 0.572089 -0.284082 0.476118
+v -0.476117 -0.284082 -0.572089
+v -0.391264 -0.276502 -0.656941
+v 0.656942 -0.276502 0.391265
+v 0.572088 -0.234082 0.476117
+v -0.476117 -0.234082 -0.572089
+v -0.354093 -0.221340 -0.111416
+v -0.354093 -0.057279 -0.111416
+v -0.111416 -0.342660 -0.354093
+v -0.111416 -0.178600 -0.354093
+v -0.448220 -0.221340 -0.205543
+v -0.448220 -0.057279 -0.205543
+v -0.205543 -0.342660 -0.448220
+v -0.205543 -0.178600 -0.448220
+v -0.069408 -0.487406 -0.978798
+v 0.978798 -0.487406 0.069409
+v 0.893945 -0.444986 0.154261
+v -0.154261 -0.444986 -0.893945
+v -0.069408 -0.437406 -0.978798
+v 0.978798 -0.437406 0.069409
+v 0.893945 -0.394986 0.154261
+v -0.154261 -0.394986 -0.893945
+v 0.069408 -0.032780 0.978798
+v -0.978798 -0.032780 -0.069409
+v -0.893945 -0.075200 -0.154261
+v 0.154261 -0.075200 0.893945
+v 0.069408 0.017220 0.978797
+v -0.978798 0.017220 -0.069409
+v -0.893945 -0.025200 -0.154261
+v 0.154261 -0.025200 0.893945
+v -0.029561 -0.500000 -1.029558
+v 1.029558 -0.500000 0.029561
+v -1.029558 -0.500000 -0.029561
+v -1.029558 0.000000 -0.029561
+v 0.029561 -0.500000 1.029558
+v 0.029561 0.000000 1.029558
+v -0.500000 0.000000 1.559119
+v -1.559119 0.000000 0.500000
+v -0.499999 0.000000 0.499999
+v -1.559120 -0.500000 0.500000
+v -0.500000 -0.500000 1.559119
+v -0.500003 -0.500000 0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt -0.3235 0.5003
+vt 0.6181 0.0296
+vt 0.6181 0.5003
+vt 0.6188 0.9848
+vt -0.3228 0.5141
+vt 0.6188 0.5141
+vt 0.0669 1.0031
+vt 0.0669 0.5045
+vt 0.0669 0.0059
+vt 1.1195 0.0059
+vt 1.1195 1.0031
+vt 0.1925 0.0071
+vt 0.1925 0.5057
+vt -0.3061 0.0071
+vt -0.4317 1.0031
+vt -0.4317 0.0059
+vt 1.1341 0.0071
+vt 1.1341 1.0043
+vt 0.1925 1.0043
+vt 1.1202 0.9906
+vt 0.4151 0.9906
+vt 0.4151 0.5199
+vt 1.1202 0.5199
+vt 0.4050 0.0285
+vt 1.1101 0.0285
+vt 1.1101 0.4992
+vt 0.4050 0.4992
+vt -0.3061 1.0043
+vt 1.1174 0.5141
+vt 1.1174 0.9848
+vt 1.1167 0.0296
+vt 1.1167 0.5003
+vn -0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 -0.7071
+vn -0.7071 0.0000 0.7071
+vn 0.2357 0.9428 -0.2357
+vn 0.7071 0.0000 0.7071
+vn 0.0189 0.9017 -0.4319
+vn 0.4319 0.9017 -0.0189
+vn -0.1263 -0.9320 0.3397
+vn -0.3397 -0.9320 0.1263
+vn -0.2357 -0.9428 0.2357
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn 0.0000 0.0000 1.0000
+vn -1.0000 0.0000 0.0000
+g dtrack_vst1_45_Cube.033_SlopeRailMaterial
+s off
+f 2/1/1 4/2/1 3/3/1 1/4/1
+f 4/2/2 8/5/2 7/6/2 3/7/2
+f 6/8/3 2/1/3 1/9/3 5/10/3
+f 6/8/4 8/5/4 4/2/4 2/1/4
+f 16/11/5 15/12/5 19/13/5 20/14/5
+f 9/15/6 13/16/6 14/17/6 10/18/6
+f 10/19/2 14/20/2 15/21/2 11/22/2
+f 11/23/7 15/12/7 16/11/7 12/24/7
+f 13/25/3 9/26/3 12/27/3 16/28/3
+f 20/29/3 17/30/3 13/25/3 16/28/3
+f 13/16/1 17/31/1 18/32/1 14/17/1
+f 15/21/2 14/20/2 18/33/2 19/34/2
+f 20/14/8 19/13/8 21/35/8 22/36/8
+f 18/32/9 17/31/9 23/37/9 24/38/9
+f 22/36/5 21/35/5 25/39/5 26/40/5
+f 24/38/1 23/37/1 27/41/1 28/42/1
+f 25/39/4 28/42/4 27/41/4 26/40/4
+f 17/30/3 20/29/3 22/43/3 26/40/3 27/41/3 23/44/3
+f 18/33/2 24/45/2 28/42/2 25/39/2 21/46/2 19/34/2
+f 32/47/5 36/48/5 33/49/5 29/50/5
+f 34/51/2 30/52/2 29/50/2 33/53/2
+f 35/54/1 31/55/1 30/52/1 34/56/1
+f 36/57/3 32/47/3 31/55/3 35/58/3
+f 32/47/4 29/50/4 30/52/4 31/55/4
+f 37/59/1 39/60/1 40/61/1 38/62/1
+f 41/63/5 43/64/5 44/65/5 42/66/5
+f 37/67/10 38/68/10 41/63/10 42/66/10
+f 39/60/4 44/65/4 43/64/4 40/61/4
+f 52/69/1 51/70/1 55/71/1 56/72/1
+f 45/73/7 49/74/7 50/75/7 46/76/7
+f 46/77/3 50/78/3 51/79/3 47/80/3
+f 47/81/6 51/70/6 52/69/6 48/82/6
+f 49/83/2 45/84/2 48/85/2 52/86/2
+f 56/87/2 53/88/2 49/83/2 52/86/2
+f 49/74/5 53/89/5 54/90/5 50/75/5
+f 51/79/3 50/78/3 54/91/3 55/92/3
+f 56/72/9 55/71/9 57/93/9 58/94/9
+f 54/90/8 53/89/8 59/95/8 60/96/8
+f 58/94/1 57/93/1 61/97/1 62/98/1
+f 60/96/5 59/95/5 63/99/5 64/100/5
+f 61/97/4 64/100/4 63/99/4 62/98/4
+f 53/88/2 56/87/2 58/101/2 62/98/2 63/99/2 59/102/2
+f 54/91/3 60/103/3 64/100/3 61/97/3 57/104/3 55/92/3
+f 69/105/4 72/106/4 71/107/4 70/108/4
+f 65/109/2 69/105/2 70/108/2 66/110/2
+f 66/111/5 70/108/5 71/107/5 67/112/5
+f 67/113/3 71/107/3 72/106/3 68/114/3
+f 69/105/1 65/115/1 68/116/1 72/106/1
+f 76/117/5 80/118/5 77/119/5 73/120/5
+f 78/121/2 74/122/2 73/120/2 77/123/2
+f 79/124/1 75/125/1 74/122/1 78/126/1
+f 80/127/3 76/117/3 75/125/3 79/128/3
+f 76/117/4 73/120/4 74/122/4 75/125/4
+f 85/129/4 88/130/4 87/131/4 86/132/4
+f 81/133/2 85/129/2 86/132/2 82/134/2
+f 82/135/5 86/132/5 87/131/5 83/136/5
+f 83/137/3 87/131/3 88/130/3 84/138/3
+f 85/129/1 81/139/1 84/140/1 88/130/1
+f 90/141/5 89/142/5 91/143/5 92/144/5
+f 92/144/2 91/145/2 95/146/2 96/147/2
+f 94/148/3 93/149/3 89/150/3 90/141/3
+f 94/148/4 90/141/4 92/144/4 96/147/4
+f 101/151/4 104/152/4 103/153/4 102/154/4
+f 97/155/2 101/151/2 102/154/2 98/156/2
+f 98/157/5 102/154/5 103/153/5 99/158/5
+f 99/159/3 103/153/3 104/152/3 100/160/3
+f 101/151/1 97/161/1 100/162/1 104/152/1
+f 109/163/4 112/164/4 111/165/4 110/166/4
+f 105/167/3 109/163/3 110/166/3 106/168/3
+f 106/169/1 110/166/1 111/165/1 107/170/1
+f 107/171/2 111/165/2 112/164/2 108/172/2
+f 109/163/5 105/173/5 108/174/5 112/164/5
+g dtrack_vst1_45_Cube.033_SlopeGravelMaterial
+f 114/175/5 118/176/5 117/177/5
+f 116/178/1 113/179/1 115/180/1
+f 116/181/4 121/182/4 118/183/4 114/184/4 113/185/4
+f 115/186/11 124/187/11 122/188/11
+f 116/181/12 120/189/12 121/182/12
+f 118/183/12 121/182/12 119/190/12
+f 113/191/11 114/192/11 117/193/11 124/187/11 115/186/11
+f 121/194/13 120/195/13 122/196/13 124/197/13
+f 119/198/14 121/199/14 124/200/14 123/201/14
+f 123/202/11 124/187/11 117/193/11
+f 116/178/1 115/180/1 122/203/1 120/204/1
+f 117/177/5 118/176/5 119/205/5 123/206/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst2.obj b/advtrains/advtrains/models/advtrains_dtrack_vst2.obj
new file mode 100644
index 0000000..444ce42
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst2.obj
@@ -0,0 +1,372 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst2_Cube.032
+v 0.753760 0.000000 -0.500000
+v 0.753760 0.000000 0.500000
+v 0.753760 0.500000 0.500000
+v -0.753760 0.000000 -0.500000
+v -0.753760 0.000000 0.500000
+v -0.753760 0.500000 0.500000
+v 0.329165 0.303892 0.171599
+v 0.329165 0.467953 0.171599
+v 0.329165 0.132293 -0.171599
+v 0.329165 0.296354 -0.171599
+v 0.462280 0.303892 0.171599
+v 0.462280 0.467953 0.171599
+v 0.462280 0.132293 -0.171599
+v 0.462280 0.296354 -0.171599
+v 0.412289 0.540000 0.500000
+v 0.412289 0.040000 -0.500000
+v 0.560528 0.040000 -0.500000
+v 0.560528 0.540000 0.500000
+v 0.474055 0.560000 0.500000
+v 0.474055 0.060000 -0.500000
+v 0.498762 0.060000 -0.500000
+v 0.498762 0.560000 0.500000
+v 0.474055 0.610000 0.500000
+v 0.474055 0.110000 -0.500000
+v 0.498762 0.110000 -0.500000
+v 0.498762 0.610000 0.500000
+v 0.529645 0.115000 -0.500000
+v 0.529645 0.615000 0.500000
+v 0.443172 0.615000 0.500000
+v 0.443172 0.115000 -0.500000
+v 0.529645 0.140000 -0.500000
+v 0.529645 0.640000 0.500000
+v 0.443172 0.640000 0.500000
+v 0.443172 0.140000 -0.500000
+v 0.741194 0.457500 0.435000
+v -0.741194 0.457500 0.435000
+v -0.741194 0.397500 0.315000
+v 0.741194 0.397500 0.315000
+v 0.741193 0.507500 0.435000
+v -0.741194 0.507500 0.435000
+v -0.741194 0.447500 0.315000
+v 0.741194 0.447500 0.315000
+v -0.011733 3.379186 0.500000
+v -0.011732 2.879186 -0.500001
+v -0.011733 3.400814 0.500000
+v -0.011732 2.900814 -0.500000
+v 0.011732 2.879186 -0.500000
+v 0.011732 3.379186 0.500000
+v 0.011732 2.900814 -0.500000
+v 0.011732 3.400814 0.500000
+v -0.412289 0.040000 -0.500000
+v -0.412289 0.540000 0.500000
+v -0.560528 0.540000 0.500000
+v -0.560528 0.040000 -0.500000
+v -0.474055 0.060000 -0.500000
+v -0.474055 0.560000 0.500000
+v -0.498762 0.560000 0.500000
+v -0.498762 0.060000 -0.500000
+v -0.474055 0.110000 -0.500000
+v -0.474055 0.610000 0.500000
+v -0.498762 0.610000 0.500000
+v -0.498762 0.110000 -0.500000
+v -0.529645 0.615000 0.500000
+v -0.529645 0.115000 -0.500000
+v -0.443172 0.115000 -0.500000
+v -0.443172 0.615000 0.500000
+v -0.529645 0.640000 0.500000
+v -0.529645 0.140000 -0.500000
+v -0.443172 0.140000 -0.500000
+v -0.443172 0.640000 0.500000
+v -0.741194 0.022500 -0.435000
+v 0.741194 0.022500 -0.435000
+v 0.741194 0.082500 -0.315000
+v -0.741194 0.082500 -0.315000
+v -0.741193 0.072500 -0.435000
+v 0.741194 0.072500 -0.435000
+v 0.741194 0.132500 -0.315000
+v -0.741194 0.132500 -0.315000
+v 0.741194 0.333931 0.187862
+v -0.741194 0.333931 0.187862
+v -0.741194 0.273931 0.067862
+v 0.741194 0.273931 0.067862
+v 0.741193 0.383931 0.187862
+v -0.741194 0.383931 0.187862
+v -0.741194 0.323931 0.067862
+v 0.741194 0.323931 0.067862
+v -0.741194 0.146069 -0.187862
+v 0.741194 0.146069 -0.187862
+v 0.741194 0.206069 -0.067862
+v -0.741194 0.206069 -0.067862
+v -0.741193 0.196069 -0.187862
+v 0.741194 0.196069 -0.187862
+v 0.741194 0.256069 -0.067862
+v -0.741194 0.256069 -0.067862
+v -0.329165 0.303892 0.171599
+v -0.329165 0.467953 0.171599
+v -0.329165 0.132293 -0.171599
+v -0.329165 0.296354 -0.171599
+v -0.462280 0.303892 0.171599
+v -0.462280 0.467953 0.171599
+v -0.462280 0.132293 -0.171599
+v -0.462280 0.296354 -0.171599
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.500000 -0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2113 -0.1167
+vt -0.2846 -0.1167
+vt -0.2846 -0.6128
+vt 1.2113 -0.6128
+vt -0.2852 0.4989
+vt 1.2107 0.4989
+vt 1.2107 0.9950
+vt -0.2852 0.9950
+vt 1.2113 0.9927
+vt 1.6551 0.1052
+vt -0.2846 0.9927
+vt -0.7284 0.1052
+vt -0.2873 0.9952
+vt -0.2873 0.0029
+vt 1.2086 0.0029
+vt 1.2086 0.9952
+vt 0.7066 0.9945
+vt -0.2857 0.9945
+vt -0.2857 0.4984
+vt 0.7066 0.4984
+vt 1.2107 0.9918
+vt -0.2852 0.9918
+vt -0.2852 0.4956
+vt 1.2107 0.4956
+vt 0.7071 0.9996
+vt -0.2852 0.9996
+vt -0.2852 0.5034
+vt 0.7071 0.5034
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.8944 -0.4472
+vn 1.0000 0.0000 0.0000
+vn -0.2782 0.8591 -0.4296
+vn 0.2782 0.8591 -0.4296
+vn 0.1433 -0.8852 0.4426
+vn -0.1433 -0.8852 0.4426
+vn 0.0000 -0.8944 0.4472
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst2_Cube.032_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst2_Cube.032_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 4/155/2 1/156/2 104/157/2 106/158/2
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
+f 104/163/11 103/164/11 105/165/11 106/166/11
+f 5/167/1 4/168/1 106/169/1 105/170/1
+f 2/171/3 5/172/3 105/173/3 103/174/3
+f 1/175/5 2/176/5 103/177/5 104/178/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj b/advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj
new file mode 100644
index 0000000..5dc708b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst2_45.obj
@@ -0,0 +1,462 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst2_45_Cube.035
+v 0.111416 0.278660 0.354093
+v 0.111416 0.442721 0.354093
+v 0.354093 0.157340 0.111416
+v 0.354093 0.321400 0.111416
+v 0.205542 0.278660 0.448220
+v 0.205542 0.442721 0.448220
+v 0.448220 0.157340 0.205543
+v 0.448220 0.321400 0.205543
+v -0.208358 0.539814 0.791422
+v 0.791423 0.040000 -0.208357
+v 0.896243 0.040000 -0.103536
+v -0.103538 0.539814 0.896242
+v -0.164683 0.559814 0.835097
+v 0.835098 0.060000 -0.164682
+v 0.852568 0.060000 -0.147212
+v -0.147213 0.559814 0.852567
+v -0.164683 0.609814 0.835097
+v 0.835098 0.110000 -0.164682
+v 0.852568 0.110000 -0.147212
+v -0.147213 0.609814 0.852567
+v 0.874406 0.115000 -0.125374
+v -0.125375 0.614814 0.874405
+v -0.186520 0.614814 0.813259
+v 0.813260 0.115000 -0.186519
+v 0.874406 0.140000 -0.125374
+v -0.125375 0.639814 0.874405
+v -0.186520 0.639814 0.813259
+v 0.813260 0.140000 -0.186519
+v 0.476117 0.313896 0.572089
+v -0.572088 0.313896 -0.476117
+v -0.656942 0.356316 -0.391265
+v 0.391264 0.356316 0.656941
+v 0.476117 0.263896 0.572089
+v -0.572088 0.263896 -0.476117
+v -0.656941 0.306316 -0.391265
+v 0.391264 0.306316 0.656942
+v -0.508186 3.379001 0.491594
+v 0.491594 2.879186 -0.508186
+v -0.508186 3.400629 0.491593
+v 0.491594 2.900814 -0.508186
+v 0.508186 2.879186 -0.491594
+v -0.491594 3.379001 0.508186
+v 0.508186 2.900814 -0.491594
+v -0.491594 3.400629 0.508186
+v 0.208358 0.040000 -0.791421
+v -0.791423 0.539814 0.208357
+v -0.896244 0.539814 0.103537
+v 0.103537 0.040000 -0.896242
+v 0.164682 0.060000 -0.835097
+v -0.835099 0.559815 0.164682
+v -0.852568 0.559814 0.147212
+v 0.147212 0.060000 -0.852567
+v 0.164682 0.110000 -0.835097
+v -0.835099 0.609815 0.164682
+v -0.852568 0.609814 0.147212
+v 0.147212 0.110000 -0.852567
+v -0.874406 0.614814 0.125374
+v 0.125375 0.115000 -0.874404
+v 0.186520 0.115000 -0.813259
+v -0.813261 0.614815 0.186520
+v -0.874406 0.639814 0.125374
+v 0.125375 0.140000 -0.874404
+v 0.186520 0.140000 -0.813259
+v -0.813261 0.639814 0.186520
+v -0.230055 0.092905 -0.818151
+v 0.818151 0.092905 0.230055
+v 0.733298 0.135325 0.314908
+v -0.314908 0.135325 -0.733299
+v -0.230055 0.142905 -0.818151
+v 0.818151 0.142905 0.230056
+v 0.733298 0.185325 0.314908
+v -0.314908 0.185325 -0.733298
+v 0.314908 0.394489 0.733298
+v -0.733298 0.394489 -0.314908
+v -0.818151 0.436909 -0.230056
+v 0.230055 0.436909 0.818151
+v 0.314908 0.344489 0.733298
+v -0.733298 0.344489 -0.314908
+v -0.818151 0.386909 -0.230055
+v 0.230055 0.386909 0.818151
+v -0.391264 0.173498 -0.656942
+v 0.656941 0.173498 0.391265
+v 0.572089 0.215918 0.476118
+v -0.476117 0.215918 -0.572089
+v -0.391264 0.223498 -0.656941
+v 0.656942 0.223498 0.391265
+v 0.572088 0.265918 0.476117
+v -0.476117 0.265918 -0.572089
+v -0.354093 0.278660 -0.111416
+v -0.354093 0.442721 -0.111416
+v -0.111416 0.157340 -0.354093
+v -0.111416 0.321400 -0.354093
+v -0.448220 0.278660 -0.205543
+v -0.448220 0.442721 -0.205543
+v -0.205543 0.157340 -0.448220
+v -0.205543 0.321400 -0.448220
+v -0.069408 0.012594 -0.978798
+v 0.978798 0.012594 0.069409
+v 0.893945 0.055014 0.154261
+v -0.154261 0.055014 -0.893945
+v -0.069408 0.062594 -0.978798
+v 0.978798 0.062594 0.069409
+v 0.893945 0.105014 0.154261
+v -0.154261 0.105014 -0.893945
+v 0.069408 0.467220 0.978798
+v -0.978798 0.467220 -0.069409
+v -0.893945 0.424800 -0.154261
+v 0.154261 0.424800 0.893945
+v 0.069408 0.517220 0.978797
+v -0.978798 0.517220 -0.069409
+v -0.893945 0.474800 -0.154261
+v 0.154261 0.474800 0.893945
+v -0.029561 -0.000000 -1.029558
+v 1.029558 0.000000 0.029561
+v -1.029558 -0.000000 -0.029561
+v -1.029558 0.500000 -0.029561
+v 0.029561 0.000000 1.029558
+v 0.029561 0.500000 1.029558
+v -0.500000 0.500000 1.559119
+v -1.559119 0.500000 0.500000
+v -0.499999 0.500000 0.499999
+v -1.559120 -0.000000 0.500000
+v -0.500000 0.000000 1.559119
+v -0.500003 0.000000 0.500000
+v 1.029558 -0.500000 0.029561
+v -0.029561 -0.500000 -1.029558
+v 0.029561 -0.500000 1.029558
+v -1.029558 -0.500000 -0.029561
+v -0.500003 -0.500000 0.500000
+v -0.500000 -0.500000 1.559119
+v -1.559120 -0.500000 0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.8837 0.9625
+vt 0.8524 0.0348
+vt 0.8837 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.0035
+vt 0.9588 0.0348
+vt 0.8837 0.0035
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt -0.2938 0.5095
+vt 0.6540 0.0358
+vt 0.6540 0.5096
+vt 0.6549 0.9852
+vt -0.2928 0.5114
+vt 0.6549 0.5114
+vt 0.1047 0.9953
+vt 0.1047 0.4934
+vt 0.1047 -0.0085
+vt 1.1643 -0.0085
+vt 1.1643 0.9953
+vt 1.1568 0.5114
+vt 0.6549 0.0377
+vt 1.1568 0.0377
+vt -0.3972 0.9953
+vt -0.3972 -0.0085
+vt 1.1431 0.5009
+vt 0.4334 0.5009
+vt 0.4334 0.0272
+vt 1.1431 0.0272
+vt 1.1431 0.9747
+vt 0.4334 0.9747
+vt 0.7633 0.9654
+vt 0.0536 0.9654
+vt 0.0536 0.4916
+vt 0.7633 0.4916
+vt 1.1559 0.5096
+vt 1.1559 0.9833
+vt 0.6540 0.9833
+vt 0.1053 -0.0176
+vt 0.1052 0.4843
+vt -0.3966 -0.0176
+vt 1.0530 -0.0176
+vt 1.0530 0.9861
+vt 0.1053 0.9861
+vt -0.3966 0.9861
+vt 0.0536 0.0179
+vt 0.7633 0.0179
+vt -0.2928 0.0377
+vt -0.2938 0.9833
+vt 0.0455 0.1273
+vt 1.0492 0.1273
+vt 1.0492 0.6011
+vt 0.0455 0.6011
+vt 1.1568 0.9852
+vt 1.1559 0.0358
+vn -0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 -0.7071
+vn -0.7071 0.0000 0.7071
+vn 0.2357 0.9428 -0.2357
+vn 0.7071 0.0000 0.7071
+vn 0.0189 0.9017 -0.4319
+vn 0.4319 0.9017 -0.0189
+vn -0.1263 -0.9320 0.3397
+vn -0.3397 -0.9320 0.1263
+vn -0.2357 -0.9428 0.2357
+vn 0.0000 1.0000 0.0000
+vn -0.0000 0.0000 1.0000
+vn -1.0000 0.0000 0.0000
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst2_45_Cube.035_SlopeRailMaterial
+s off
+f 2/1/1 4/2/1 3/3/1 1/4/1
+f 4/2/2 8/5/2 7/6/2 3/7/2
+f 6/8/3 2/1/3 1/9/3 5/10/3
+f 6/8/4 8/5/4 4/2/4 2/1/4
+f 16/11/5 15/12/5 19/13/5 20/14/5
+f 9/15/6 13/16/6 14/17/6 10/18/6
+f 10/19/2 14/20/2 15/21/2 11/22/2
+f 11/23/7 15/12/7 16/11/7 12/24/7
+f 13/25/3 9/26/3 12/27/3 16/28/3
+f 20/29/3 17/30/3 13/25/3 16/28/3
+f 13/16/1 17/31/1 18/32/1 14/17/1
+f 15/21/2 14/20/2 18/33/2 19/34/2
+f 20/14/8 19/13/8 21/35/8 22/36/8
+f 18/32/9 17/31/9 23/37/9 24/38/9
+f 22/36/5 21/35/5 25/39/5 26/40/5
+f 24/38/1 23/37/1 27/41/1 28/42/1
+f 25/39/4 28/42/4 27/41/4 26/40/4
+f 17/30/3 20/29/3 22/43/3 26/40/3 27/41/3 23/44/3
+f 18/33/2 24/45/2 28/42/2 25/39/2 21/46/2 19/34/2
+f 32/47/5 36/48/5 33/49/5 29/50/5
+f 34/51/2 30/52/2 29/50/2 33/53/2
+f 35/54/1 31/55/1 30/52/1 34/56/1
+f 36/57/3 32/47/3 31/55/3 35/58/3
+f 32/47/4 29/50/4 30/52/4 31/55/4
+f 37/59/1 39/60/1 40/61/1 38/62/1
+f 41/63/5 43/64/5 44/65/5 42/66/5
+f 37/67/10 38/68/10 41/63/10 42/66/10
+f 39/60/4 44/65/4 43/64/4 40/61/4
+f 52/69/1 51/70/1 55/71/1 56/72/1
+f 45/73/7 49/74/7 50/75/7 46/76/7
+f 46/77/3 50/78/3 51/79/3 47/80/3
+f 47/81/6 51/70/6 52/69/6 48/82/6
+f 49/83/2 45/84/2 48/85/2 52/86/2
+f 56/87/2 53/88/2 49/83/2 52/86/2
+f 49/74/5 53/89/5 54/90/5 50/75/5
+f 51/79/3 50/78/3 54/91/3 55/92/3
+f 56/72/9 55/71/9 57/93/9 58/94/9
+f 54/90/8 53/89/8 59/95/8 60/96/8
+f 58/94/1 57/93/1 61/97/1 62/98/1
+f 60/96/5 59/95/5 63/99/5 64/100/5
+f 61/97/4 64/100/4 63/99/4 62/98/4
+f 53/88/2 56/87/2 58/101/2 62/98/2 63/99/2 59/102/2
+f 54/91/3 60/103/3 64/100/3 61/97/3 57/104/3 55/92/3
+f 69/105/4 72/106/4 71/107/4 70/108/4
+f 65/109/2 69/105/2 70/108/2 66/110/2
+f 66/111/5 70/108/5 71/107/5 67/112/5
+f 67/113/3 71/107/3 72/106/3 68/114/3
+f 69/105/1 65/115/1 68/116/1 72/106/1
+f 76/117/5 80/118/5 77/119/5 73/120/5
+f 78/121/2 74/122/2 73/120/2 77/123/2
+f 79/124/1 75/125/1 74/122/1 78/126/1
+f 80/127/3 76/117/3 75/125/3 79/128/3
+f 76/117/4 73/120/4 74/122/4 75/125/4
+f 85/129/4 88/130/4 87/131/4 86/132/4
+f 81/133/2 85/129/2 86/132/2 82/134/2
+f 82/135/5 86/132/5 87/131/5 83/136/5
+f 83/137/3 87/131/3 88/130/3 84/138/3
+f 85/129/1 81/139/1 84/140/1 88/130/1
+f 90/141/5 89/142/5 91/143/5 92/144/5
+f 92/144/2 91/145/2 95/146/2 96/147/2
+f 94/148/3 93/149/3 89/150/3 90/141/3
+f 94/148/4 90/141/4 92/144/4 96/147/4
+f 101/151/4 104/152/4 103/153/4 102/154/4
+f 97/155/2 101/151/2 102/154/2 98/156/2
+f 98/157/5 102/154/5 103/153/5 99/158/5
+f 99/159/3 103/153/3 104/152/3 100/160/3
+f 101/151/1 97/161/1 100/162/1 104/152/1
+f 109/163/4 112/164/4 111/165/4 110/166/4
+f 105/167/3 109/163/3 110/166/3 106/168/3
+f 106/169/1 110/166/1 111/165/1 107/170/1
+f 107/171/2 111/165/2 112/164/2 108/172/2
+f 109/163/5 105/173/5 108/174/5 112/164/5
+g dtrack_vst2_45_Cube.035_SlopeGravelMaterial
+f 114/175/5 118/176/5 117/177/5
+f 116/178/1 113/179/1 115/180/1
+f 116/181/4 121/182/4 118/183/4 114/184/4 113/185/4
+f 122/186/1 115/180/1 128/187/1 131/188/1
+f 116/181/11 120/189/11 121/182/11
+f 118/183/11 121/182/11 119/190/11
+f 124/191/12 122/192/12 131/193/12 129/194/12
+f 121/195/12 120/196/12 122/192/12 124/191/12
+f 119/197/13 121/198/13 124/199/13 123/200/13
+f 117/177/5 123/201/5 130/202/5 127/203/5
+f 128/204/14 129/205/14 131/206/14
+f 126/207/14 125/208/14 127/209/14 129/205/14 128/204/14
+f 130/210/14 129/205/14 127/209/14
+f 123/200/13 124/199/13 129/211/13 130/212/13
+f 115/180/1 113/179/1 126/213/1 128/187/1
+f 114/175/5 117/177/5 127/203/5 125/214/5
+f 113/215/2 114/216/2 125/217/2 126/218/2
+f 116/178/1 115/180/1 122/186/1 120/219/1
+f 117/177/5 118/176/5 119/220/5 123/201/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst31.obj b/advtrains/advtrains/models/advtrains_dtrack_vst31.obj
new file mode 100644
index 0000000..c4cb84f
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst31.obj
@@ -0,0 +1,348 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst31_Cube.000
+v 0.753760 -0.500000 -0.500000
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.166667 0.500000
+v -0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.166667 0.500000
+v 0.329165 -0.308041 0.171599
+v 0.329165 -0.143980 0.171599
+v 0.329165 -0.422440 -0.171599
+v 0.329165 -0.258379 -0.171599
+v 0.462280 -0.308041 0.171599
+v 0.462280 -0.143980 0.171599
+v 0.462280 -0.422440 -0.171599
+v 0.462280 -0.258379 -0.171599
+v 0.412289 -0.126667 0.500000
+v 0.412289 -0.460000 -0.500000
+v 0.560528 -0.460000 -0.500000
+v 0.560528 -0.126667 0.500000
+v 0.474055 -0.106667 0.500000
+v 0.474055 -0.440000 -0.500000
+v 0.498762 -0.440000 -0.500000
+v 0.498762 -0.106667 0.500000
+v 0.474055 -0.056667 0.500000
+v 0.474055 -0.390000 -0.500000
+v 0.498762 -0.390000 -0.500000
+v 0.498762 -0.056667 0.500000
+v 0.529645 -0.385000 -0.500000
+v 0.529645 -0.051667 0.500000
+v 0.443172 -0.051667 0.500000
+v 0.443172 -0.385000 -0.500000
+v 0.529645 -0.360000 -0.500000
+v 0.529645 -0.026667 0.500000
+v 0.443172 -0.026667 0.500000
+v 0.443172 -0.360000 -0.500000
+v 0.741194 -0.198333 0.435000
+v -0.741194 -0.198333 0.435000
+v -0.741194 -0.238333 0.315000
+v 0.741194 -0.238333 0.315000
+v 0.741193 -0.148333 0.435000
+v -0.741194 -0.148333 0.435000
+v -0.741194 -0.188333 0.315000
+v 0.741194 -0.188333 0.315000
+v -0.011733 2.712519 0.500000
+v -0.011732 2.379186 -0.500001
+v -0.011733 2.734147 0.500000
+v -0.011732 2.400814 -0.500000
+v 0.011732 2.379186 -0.500000
+v 0.011732 2.712519 0.500000
+v 0.011732 2.400814 -0.500000
+v 0.011732 2.734148 0.500000
+v -0.412289 -0.460000 -0.500000
+v -0.412289 -0.126667 0.500000
+v -0.560528 -0.126667 0.500000
+v -0.560528 -0.460000 -0.500000
+v -0.474055 -0.440000 -0.500000
+v -0.474055 -0.106666 0.500000
+v -0.498762 -0.106667 0.500000
+v -0.498762 -0.440000 -0.500000
+v -0.474055 -0.390000 -0.500000
+v -0.474055 -0.056666 0.500000
+v -0.498762 -0.056667 0.500000
+v -0.498762 -0.390000 -0.500000
+v -0.529645 -0.051667 0.500000
+v -0.529645 -0.385000 -0.500000
+v -0.443172 -0.385000 -0.500000
+v -0.443172 -0.051666 0.500000
+v -0.529645 -0.026667 0.500000
+v -0.529645 -0.360000 -0.500000
+v -0.443172 -0.360000 -0.500000
+v -0.443172 -0.026666 0.500000
+v -0.741194 -0.488333 -0.435000
+v 0.741194 -0.488333 -0.435000
+v 0.741194 -0.448333 -0.315000
+v -0.741194 -0.448333 -0.315000
+v -0.741193 -0.438333 -0.435000
+v 0.741194 -0.438333 -0.435000
+v 0.741194 -0.398333 -0.315000
+v -0.741194 -0.398333 -0.315000
+v 0.741194 -0.280713 0.187862
+v -0.741194 -0.280713 0.187862
+v -0.741194 -0.320713 0.067862
+v 0.741194 -0.320713 0.067862
+v 0.741193 -0.230713 0.187862
+v -0.741194 -0.230713 0.187862
+v -0.741194 -0.270713 0.067862
+v 0.741194 -0.270713 0.067862
+v -0.741194 -0.405954 -0.187862
+v 0.741194 -0.405954 -0.187862
+v 0.741194 -0.365954 -0.067862
+v -0.741194 -0.365954 -0.067862
+v -0.741193 -0.355954 -0.187862
+v 0.741194 -0.355954 -0.187862
+v 0.741194 -0.315954 -0.067862
+v -0.741194 -0.315954 -0.067862
+v -0.329165 -0.308041 0.171599
+v -0.329165 -0.143980 0.171599
+v -0.329165 -0.422440 -0.171599
+v -0.329165 -0.258379 -0.171599
+v -0.462280 -0.308041 0.171599
+v -0.462280 -0.143980 0.171599
+v -0.462280 -0.422440 -0.171599
+v -0.462280 -0.258379 -0.171599
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.1949 -0.0470
+vt -0.3152 -0.0470
+vt -0.3152 -0.3809
+vt 1.1949 -0.3809
+vt -0.3120 1.0015
+vt -0.3120 -0.0002
+vt 1.1981 -0.0002
+vt 1.1981 1.0015
+vt 1.1949 1.0089
+vt 1.5117 0.0586
+vt -0.3152 1.0089
+vt -0.6320 0.0586
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.9487 -0.3162
+vn 1.0000 0.0000 0.0000
+vn -0.2936 0.9069 -0.3023
+vn 0.2936 0.9069 -0.3023
+vn 0.1518 -0.9377 0.3126
+vn -0.1518 -0.9377 0.3126
+vn 0.0000 -0.9487 0.3162
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst31_Cube.000_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst31_Cube.000_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 1/155/11 2/156/11 5/157/11 4/158/11
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst32.obj b/advtrains/advtrains/models/advtrains_dtrack_vst32.obj
new file mode 100644
index 0000000..297d46b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst32.obj
@@ -0,0 +1,372 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst32_Cube.028
+v 0.753760 -0.166667 -0.500000
+v 0.753760 -0.166667 0.500000
+v 0.753760 0.166667 0.500000
+v -0.753760 -0.166667 -0.500000
+v -0.753760 -0.166667 0.500000
+v -0.753760 0.166667 0.500000
+v 0.329165 0.025292 0.171599
+v 0.329165 0.189353 0.171599
+v 0.329165 -0.089107 -0.171599
+v 0.329165 0.074954 -0.171599
+v 0.462280 0.025292 0.171599
+v 0.462280 0.189353 0.171599
+v 0.462280 -0.089107 -0.171599
+v 0.462280 0.074954 -0.171599
+v 0.412289 0.206667 0.500000
+v 0.412289 -0.126667 -0.500000
+v 0.560528 -0.126667 -0.500000
+v 0.560528 0.206667 0.500000
+v 0.474055 0.226667 0.500000
+v 0.474055 -0.106667 -0.500000
+v 0.498762 -0.106667 -0.500000
+v 0.498762 0.226667 0.500000
+v 0.474055 0.276667 0.500000
+v 0.474055 -0.056667 -0.500000
+v 0.498762 -0.056667 -0.500000
+v 0.498762 0.276667 0.500000
+v 0.529645 -0.051667 -0.500000
+v 0.529645 0.281667 0.500000
+v 0.443172 0.281667 0.500000
+v 0.443172 -0.051667 -0.500000
+v 0.529645 -0.026667 -0.500000
+v 0.529645 0.306667 0.500000
+v 0.443172 0.306667 0.500000
+v 0.443172 -0.026667 -0.500000
+v 0.741194 0.135000 0.435000
+v -0.741194 0.135000 0.435000
+v -0.741194 0.095000 0.315000
+v 0.741194 0.095000 0.315000
+v 0.741193 0.185000 0.435000
+v -0.741194 0.185000 0.435000
+v -0.741194 0.145000 0.315000
+v 0.741194 0.145000 0.315000
+v -0.011733 3.045853 0.500000
+v -0.011732 2.712519 -0.500001
+v -0.011733 3.067481 0.500000
+v -0.011732 2.734147 -0.500000
+v 0.011732 2.712519 -0.500000
+v 0.011732 3.045853 0.500000
+v 0.011732 2.734147 -0.500000
+v 0.011732 3.067481 0.500000
+v -0.412289 -0.126667 -0.500000
+v -0.412289 0.206667 0.500000
+v -0.560528 0.206667 0.500000
+v -0.560528 -0.126667 -0.500000
+v -0.474055 -0.106667 -0.500000
+v -0.474055 0.226667 0.500000
+v -0.498762 0.226667 0.500000
+v -0.498762 -0.106667 -0.500000
+v -0.474055 -0.056667 -0.500000
+v -0.474055 0.276667 0.500000
+v -0.498762 0.276667 0.500000
+v -0.498762 -0.056667 -0.500000
+v -0.529645 0.281667 0.500000
+v -0.529645 -0.051667 -0.500000
+v -0.443172 -0.051667 -0.500000
+v -0.443172 0.281667 0.500000
+v -0.529645 0.306667 0.500000
+v -0.529645 -0.026667 -0.500000
+v -0.443172 -0.026667 -0.500000
+v -0.443172 0.306667 0.500000
+v -0.741194 -0.155000 -0.435000
+v 0.741194 -0.155000 -0.435000
+v 0.741194 -0.115000 -0.315000
+v -0.741194 -0.115000 -0.315000
+v -0.741193 -0.105000 -0.435000
+v 0.741194 -0.105000 -0.435000
+v 0.741194 -0.065000 -0.315000
+v -0.741194 -0.065000 -0.315000
+v 0.741194 0.052621 0.187862
+v -0.741194 0.052621 0.187862
+v -0.741194 0.012621 0.067862
+v 0.741194 0.012621 0.067862
+v 0.741193 0.102621 0.187862
+v -0.741194 0.102621 0.187862
+v -0.741194 0.062621 0.067862
+v 0.741194 0.062621 0.067862
+v -0.741194 -0.072621 -0.187862
+v 0.741194 -0.072621 -0.187862
+v 0.741194 -0.032621 -0.067862
+v -0.741194 -0.032621 -0.067862
+v -0.741193 -0.022621 -0.187862
+v 0.741194 -0.022621 -0.187862
+v 0.741194 0.017379 -0.067862
+v -0.741194 0.017379 -0.067862
+v -0.329165 0.025293 0.171599
+v -0.329165 0.189353 0.171599
+v -0.329165 -0.089107 -0.171599
+v -0.329165 0.074954 -0.171599
+v -0.462280 0.025293 0.171599
+v -0.462280 0.189353 0.171599
+v -0.462280 -0.089107 -0.171599
+v -0.462280 0.074954 -0.171599
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.500000 -0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2169 -0.0660
+vt -0.3162 -0.0660
+vt -0.3162 -0.4050
+vt 1.2169 -0.4050
+vt -0.3102 0.3256
+vt 1.2229 0.3256
+vt 1.2229 0.6646
+vt -0.3102 0.6646
+vt 1.2169 1.0060
+vt 1.5385 0.0412
+vt -0.3162 1.0060
+vt -0.6378 0.0412
+vt -0.3132 1.0050
+vt -0.3132 -0.0119
+vt 1.2199 -0.0119
+vt 1.2199 1.0050
+vt -0.3075 0.6587
+vt 0.7095 0.6587
+vt 0.7095 0.9977
+vt -0.3075 0.9977
+vt 1.2229 1.0022
+vt -0.3102 1.0022
+vt -0.3102 0.6632
+vt 1.2229 0.6632
+vt 0.7067 0.6635
+vt -0.3102 0.6635
+vt -0.3102 0.3245
+vt 0.7067 0.3245
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.9487 -0.3162
+vn 1.0000 0.0000 0.0000
+vn -0.2936 0.9069 -0.3023
+vn 0.2936 0.9069 -0.3023
+vn 0.1518 -0.9377 0.3126
+vn -0.1518 -0.9377 0.3126
+vn 0.0000 -0.9487 0.3162
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst32_Cube.028_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst32_Cube.028_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 4/155/2 1/156/2 104/157/2 106/158/2
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
+f 104/163/11 103/164/11 105/165/11 106/166/11
+f 5/167/1 4/168/1 106/169/1 105/170/1
+f 2/171/3 5/172/3 105/173/3 103/174/3
+f 1/175/5 2/176/5 103/177/5 104/178/5
diff --git a/advtrains/advtrains/models/advtrains_dtrack_vst33.obj b/advtrains/advtrains/models/advtrains_dtrack_vst33.obj
new file mode 100644
index 0000000..8cb5f04
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_dtrack_vst33.obj
@@ -0,0 +1,388 @@
+# Blender v2.78 (sub 0) OBJ File: 'rail_redo.blend'
+# www.blender.org
+o dtrack_vst33_Cube.030
+v 0.753760 0.166667 -0.500000
+v 0.753760 0.166667 0.500000
+v 0.753760 0.500000 0.500000
+v -0.753760 0.166667 -0.500000
+v -0.753760 0.166667 0.500000
+v -0.753760 0.500000 0.500000
+v 0.329165 0.358626 0.171599
+v 0.329165 0.522686 0.171599
+v 0.329165 0.244227 -0.171599
+v 0.329165 0.408287 -0.171599
+v 0.462280 0.358626 0.171599
+v 0.462280 0.522686 0.171599
+v 0.462280 0.244227 -0.171599
+v 0.462280 0.408287 -0.171599
+v 0.412289 0.540000 0.500000
+v 0.412289 0.206667 -0.500000
+v 0.560528 0.206667 -0.500000
+v 0.560528 0.540000 0.500000
+v 0.474055 0.560000 0.500000
+v 0.474055 0.226667 -0.500000
+v 0.498762 0.226667 -0.500000
+v 0.498762 0.560000 0.500000
+v 0.474055 0.610000 0.500000
+v 0.474055 0.276667 -0.500000
+v 0.498762 0.276667 -0.500000
+v 0.498762 0.610000 0.500000
+v 0.529645 0.281667 -0.500000
+v 0.529645 0.615000 0.500000
+v 0.443172 0.615000 0.500000
+v 0.443172 0.281667 -0.500000
+v 0.529645 0.306667 -0.500000
+v 0.529645 0.640000 0.500000
+v 0.443172 0.640000 0.500000
+v 0.443172 0.306667 -0.500000
+v 0.741194 0.468333 0.435000
+v -0.741194 0.468333 0.435000
+v -0.741194 0.428333 0.315000
+v 0.741194 0.428333 0.315000
+v 0.741193 0.518333 0.435000
+v -0.741194 0.518333 0.435000
+v -0.741194 0.478333 0.315000
+v 0.741194 0.478333 0.315000
+v -0.011733 3.379186 0.500000
+v -0.011732 3.045852 -0.500001
+v -0.011733 3.400814 0.500000
+v -0.011732 3.067481 -0.500000
+v 0.011732 3.045853 -0.500000
+v 0.011732 3.379186 0.500000
+v 0.011732 3.067481 -0.500000
+v 0.011732 3.400814 0.500000
+v -0.412289 0.206667 -0.500000
+v -0.412289 0.540000 0.500000
+v -0.560528 0.540000 0.500000
+v -0.560528 0.206667 -0.500000
+v -0.474055 0.226667 -0.500000
+v -0.474055 0.560000 0.500000
+v -0.498762 0.560000 0.500000
+v -0.498762 0.226667 -0.500000
+v -0.474055 0.276667 -0.500000
+v -0.474055 0.610000 0.500000
+v -0.498762 0.610000 0.500000
+v -0.498762 0.276667 -0.500000
+v -0.529645 0.615000 0.500000
+v -0.529645 0.281667 -0.500000
+v -0.443172 0.281667 -0.500000
+v -0.443172 0.615000 0.500000
+v -0.529645 0.640000 0.500000
+v -0.529645 0.306667 -0.500000
+v -0.443172 0.306667 -0.500000
+v -0.443172 0.640000 0.500000
+v -0.741194 0.178333 -0.435000
+v 0.741194 0.178333 -0.435000
+v 0.741194 0.218333 -0.315000
+v -0.741194 0.218333 -0.315000
+v -0.741193 0.228333 -0.435000
+v 0.741194 0.228333 -0.435000
+v 0.741194 0.268333 -0.315000
+v -0.741194 0.268333 -0.315000
+v 0.741194 0.385954 0.187862
+v -0.741194 0.385954 0.187862
+v -0.741194 0.345954 0.067862
+v 0.741194 0.345954 0.067862
+v 0.741193 0.435954 0.187862
+v -0.741194 0.435954 0.187862
+v -0.741194 0.395954 0.067862
+v 0.741194 0.395954 0.067862
+v -0.741194 0.260713 -0.187862
+v 0.741194 0.260713 -0.187862
+v 0.741194 0.300713 -0.067862
+v -0.741194 0.300713 -0.067862
+v -0.741193 0.310713 -0.187862
+v 0.741194 0.310713 -0.187862
+v 0.741194 0.350713 -0.067862
+v -0.741194 0.350713 -0.067862
+v -0.329165 0.358626 0.171599
+v -0.329165 0.522687 0.171599
+v -0.329165 0.244227 -0.171599
+v -0.329165 0.408287 -0.171599
+v -0.462280 0.358626 0.171599
+v -0.462280 0.522686 0.171599
+v -0.462280 0.244227 -0.171599
+v -0.462280 0.408287 -0.171599
+v 0.753760 -0.166667 0.500000
+v 0.753760 -0.166667 -0.500000
+v -0.753760 -0.166667 0.500000
+v -0.753760 -0.166667 -0.500000
+v 0.753760 -0.500000 0.500000
+v 0.753760 -0.500000 -0.500000
+v -0.753760 -0.500000 0.500000
+v -0.753760 -0.500000 -0.500000
+vt 0.7427 0.1169
+vt 0.7427 0.3317
+vt 0.6400 0.3317
+vt 0.6400 0.1169
+vt 0.8260 0.3317
+vt 0.8260 0.4343
+vt 0.7427 0.4343
+vt 0.8260 0.1169
+vt 0.7427 0.0142
+vt 0.8260 0.0142
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.6554 0.3627
+vt 0.6690 0.3627
+vt 0.6690 0.9885
+vt 0.6554 0.9885
+vt 0.6972 0.9885
+vt 0.6837 0.9885
+vt 0.6837 0.3627
+vt 0.6972 0.3627
+vt 0.7119 0.3627
+vt 0.7119 0.9885
+vt 0.5691 0.2971
+vt 0.5691 0.9229
+vt 0.5378 0.9229
+vt 0.5378 0.2971
+vt 0.3413 0.2971
+vt 0.3819 0.2971
+vt 0.3819 0.9229
+vt 0.3413 0.9229
+vt 0.4291 0.9855
+vt 0.4678 0.9730
+vt 0.4833 0.9730
+vt 0.5219 0.9855
+vt 0.6097 0.9229
+vt 0.6097 0.2971
+vt 0.4678 0.2470
+vt 0.4291 0.2345
+vt 0.5219 0.2345
+vt 0.4833 0.2470
+vt 0.4833 0.2783
+vt 0.4678 0.2783
+vt 0.4132 0.2971
+vt 0.4132 0.9229
+vt 0.4678 0.9417
+vt 0.4833 0.9417
+vt 0.5182 0.9229
+vt 0.5182 0.2971
+vt 0.4328 0.2971
+vt 0.4328 0.9229
+vt 0.5026 0.9229
+vt 0.5026 0.2971
+vt 0.4485 0.2971
+vt 0.4485 0.9229
+vt 0.5026 0.2814
+vt 0.4485 0.2814
+vt 0.4485 0.9386
+vt 0.5026 0.9386
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.9588 0.9625
+vt 0.8837 0.9625
+vt 0.8837 0.0348
+vt 0.9588 0.0348
+vt 0.9901 0.9625
+vt 0.9901 0.0348
+vt 0.9588 0.0035
+vt 0.8837 0.0035
+vt 0.8524 0.0348
+vt 0.8524 0.9625
+vt 0.9588 0.9938
+vt 0.8837 0.9938
+vt 0.7427 0.1169
+vt 0.6400 0.1169
+vt 0.6400 0.3317
+vt 0.7427 0.3317
+vt 0.7427 0.4343
+vt 0.8260 0.4343
+vt 0.8260 0.3317
+vt 0.8260 0.1169
+vt 0.8260 0.0142
+vt 0.7427 0.0142
+vt 1.2190 -0.0648
+vt -0.3252 -0.0648
+vt -0.3252 -0.4063
+vt 1.2190 -0.4063
+vt 1.2222 1.0112
+vt -0.3220 1.0112
+vt -0.3220 0.6697
+vt 1.2222 0.6697
+vt 1.2190 1.0149
+vt 1.5430 0.0432
+vt -0.3252 1.0149
+vt -0.6491 0.0432
+vt -0.3220 0.3283
+vt 1.2222 0.3283
+vt -0.3240 0.3223
+vt 0.7003 0.3223
+vt 0.7003 0.6637
+vt -0.3240 0.6637
+vt 1.2202 1.0043
+vt -0.3240 1.0043
+vt -0.3240 0.6629
+vt 1.2202 0.6629
+vt 0.6998 1.0039
+vt -0.3245 1.0039
+vt -0.3245 0.6625
+vt 0.6998 0.6625
+vt -0.3246 1.0127
+vt -0.3246 -0.0117
+vt 1.2196 -0.0117
+vt 1.2196 1.0127
+vt 0.7003 1.0051
+vt -0.3240 1.0051
+vt -0.3240 0.3214
+vt 1.2202 0.3214
+vt -0.3245 0.3210
+vt 0.6998 0.3210
+vn -1.0000 0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+vn -0.0000 0.0000 1.0000
+vn 0.0000 0.9487 -0.3162
+vn 1.0000 0.0000 0.0000
+vn -0.2936 0.9069 -0.3023
+vn 0.2936 0.9069 -0.3023
+vn 0.1518 -0.9377 0.3126
+vn -0.1518 -0.9377 0.3126
+vn 0.0000 -0.9487 0.3162
+vn 0.0000 -1.0000 0.0000
+g dtrack_vst33_Cube.030_SlopeRailMaterial
+s off
+f 8/1/1 10/2/1 9/3/1 7/4/1
+f 10/2/2 14/5/2 13/6/2 9/7/2
+f 12/8/3 8/1/3 7/9/3 11/10/3
+f 12/8/4 14/5/4 10/2/4 8/1/4
+f 22/11/5 21/12/5 25/13/5 26/14/5
+f 15/15/6 19/16/6 20/17/6 16/18/6
+f 16/19/2 20/20/2 21/21/2 17/22/2
+f 17/23/7 21/12/7 22/11/7 18/24/7
+f 19/25/3 15/26/3 18/27/3 22/28/3
+f 26/29/3 23/30/3 19/25/3 22/28/3
+f 19/16/1 23/31/1 24/32/1 20/17/1
+f 21/21/2 20/20/2 24/33/2 25/34/2
+f 26/14/8 25/13/8 27/35/8 28/36/8
+f 24/32/9 23/31/9 29/37/9 30/38/9
+f 28/36/5 27/35/5 31/39/5 32/40/5
+f 30/38/1 29/37/1 33/41/1 34/42/1
+f 31/39/4 34/42/4 33/41/4 32/40/4
+f 23/30/3 26/29/3 28/43/3 32/40/3 33/41/3 29/44/3
+f 24/33/2 30/45/2 34/42/2 31/39/2 27/46/2 25/34/2
+f 39/47/4 42/48/4 41/49/4 40/50/4
+f 35/51/3 39/47/3 40/50/3 36/52/3
+f 36/53/1 40/50/1 41/49/1 37/54/1
+f 37/55/2 41/49/2 42/48/2 38/56/2
+f 39/47/5 35/57/5 38/58/5 42/48/5
+f 43/59/1 45/60/1 46/61/1 44/62/1
+f 47/63/5 49/64/5 50/65/5 48/66/5
+f 43/67/10 44/68/10 47/63/10 48/66/10
+f 45/60/4 50/65/4 49/64/4 46/61/4
+f 58/69/1 57/70/1 61/71/1 62/72/1
+f 51/73/7 55/74/7 56/75/7 52/76/7
+f 52/77/3 56/78/3 57/79/3 53/80/3
+f 53/81/6 57/70/6 58/69/6 54/82/6
+f 55/83/2 51/84/2 54/85/2 58/86/2
+f 62/87/2 59/88/2 55/83/2 58/86/2
+f 55/74/5 59/89/5 60/90/5 56/75/5
+f 57/79/3 56/78/3 60/91/3 61/92/3
+f 62/72/9 61/71/9 63/93/9 64/94/9
+f 60/90/8 59/89/8 65/95/8 66/96/8
+f 64/94/1 63/93/1 67/97/1 68/98/1
+f 66/96/5 65/95/5 69/99/5 70/100/5
+f 67/97/4 70/100/4 69/99/4 68/98/4
+f 59/88/2 62/87/2 64/101/2 68/98/2 69/99/2 65/102/2
+f 60/91/3 66/103/3 70/100/3 67/97/3 63/104/3 61/92/3
+f 75/105/4 78/106/4 77/107/4 76/108/4
+f 71/109/2 75/105/2 76/108/2 72/110/2
+f 72/111/5 76/108/5 77/107/5 73/112/5
+f 73/113/3 77/107/3 78/106/3 74/114/3
+f 75/105/1 71/115/1 74/116/1 78/106/1
+f 83/117/4 86/118/4 85/119/4 84/120/4
+f 79/121/3 83/117/3 84/120/3 80/122/3
+f 80/123/1 84/120/1 85/119/1 81/124/1
+f 81/125/2 85/119/2 86/118/2 82/126/2
+f 83/117/5 79/127/5 82/128/5 86/118/5
+f 91/129/4 94/130/4 93/131/4 92/132/4
+f 87/133/2 91/129/2 92/132/2 88/134/2
+f 88/135/5 92/132/5 93/131/5 89/136/5
+f 89/137/3 93/131/3 94/130/3 90/138/3
+f 91/129/1 87/139/1 90/140/1 94/130/1
+f 96/141/5 95/142/5 97/143/5 98/144/5
+f 98/144/2 97/145/2 101/146/2 102/147/2
+f 100/148/3 99/149/3 95/150/3 96/141/3
+f 100/148/4 96/141/4 98/144/4 102/147/4
+g dtrack_vst33_Cube.030_SlopeGravelMaterial
+f 3/151/3 6/152/3 5/153/3 2/154/3
+f 4/155/2 1/156/2 104/157/2 106/158/2
+f 1/159/5 3/151/5 2/160/5
+f 6/152/1 4/161/1 5/162/1
+f 4/161/4 6/152/4 3/151/4 1/159/4
+f 106/158/2 104/157/2 108/163/2 110/164/2
+f 5/165/1 4/166/1 106/167/1 105/168/1
+f 2/169/3 5/170/3 105/171/3 103/172/3
+f 1/173/5 2/174/5 103/175/5 104/176/5
+f 108/177/11 107/178/11 109/179/11 110/180/11
+f 105/168/1 106/167/1 110/181/1 109/182/1
+f 103/172/3 105/171/3 109/183/3 107/184/3
+f 104/176/5 103/175/5 107/185/5 108/186/5
diff --git a/advtrains/advtrains/models/advtrains_modernwagon.b3d b/advtrains/advtrains/models/advtrains_modernwagon.b3d
new file mode 100644
index 0000000..aacddca
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_modernwagon.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_platform_diag.b3d b/advtrains/advtrains/models/advtrains_platform_diag.b3d
new file mode 100644
index 0000000..9464e63
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_platform_diag.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_platform_diag_low.b3d b/advtrains/advtrains/models/advtrains_platform_diag_low.b3d
new file mode 100644
index 0000000..5a8054b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_platform_diag_low.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off.b3d
new file mode 100644
index 0000000..3d231dd
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off_30.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off_30.b3d
new file mode 100644
index 0000000..da258e1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off_45.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off_45.b3d
new file mode 100644
index 0000000..338224a
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_off_60.b3d b/advtrains/advtrains/models/advtrains_retrosignal_off_60.b3d
new file mode 100644
index 0000000..c560ca1
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_off_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on.b3d
new file mode 100644
index 0000000..3d19439
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on_30.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on_30.b3d
new file mode 100644
index 0000000..98f8a92
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on_45.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on_45.b3d
new file mode 100644
index 0000000..414e121
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_retrosignal_on_60.b3d b/advtrains/advtrains/models/advtrains_retrosignal_on_60.b3d
new file mode 100644
index 0000000..a51529a
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_retrosignal_on_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal.b3d b/advtrains/advtrains/models/advtrains_signal.b3d
new file mode 100644
index 0000000..7f69560
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_30.b3d b/advtrains/advtrains/models/advtrains_signal_30.b3d
new file mode 100644
index 0000000..0b949a7
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_30.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_45.b3d b/advtrains/advtrains/models/advtrains_signal_45.b3d
new file mode 100644
index 0000000..ccaebf4
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_45.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_60.b3d b/advtrains/advtrains/models/advtrains_signal_60.b3d
new file mode 100644
index 0000000..cf41e6d
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_60.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_wall_l.b3d b/advtrains/advtrains/models/advtrains_signal_wall_l.b3d
new file mode 100644
index 0000000..b1bcbcf
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_wall_l.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_wall_r.b3d b/advtrains/advtrains/models/advtrains_signal_wall_r.b3d
new file mode 100644
index 0000000..cf26389
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_wall_r.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_signal_wall_t.b3d b/advtrains/advtrains/models/advtrains_signal_wall_t.b3d
new file mode 100644
index 0000000..30e77f6
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_signal_wall_t.b3d
Binary files differ
diff --git a/advtrains/advtrains/models/advtrains_track_cr.b3d b/advtrains/advtrains/models/advtrains_track_cr.b3d
new file mode 100644
index 0000000..b0f5e4b
--- /dev/null
+++ b/advtrains/advtrains/models/advtrains_track_cr.b3d