aboutsummaryrefslogtreecommitdiff
path: root/advtrains_train_track/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains_train_track/init.lua')
-rwxr-xr-xadvtrains_train_track/init.lua1109
1 files changed, 172 insertions, 937 deletions
diff --git a/advtrains_train_track/init.lua b/advtrains_train_track/init.lua
index 5065155..55b1367 100755
--- a/advtrains_train_track/init.lua
+++ b/advtrains_train_track/init.lua
@@ -1,937 +1,172 @@
--- Default tracks for advtrains
--- (c) orwell96 and contributors
-
-local default_boxen = {
- ["st"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2},
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- },
-
- ["cr"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.6875, -0.3750, 0.5000},
- {-0.3750, -0.5000, -1.000, 1.000, -0.3750, 0.000}
- }
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.7500, -0.3750, 0.8750},
- {-0.3750, -0.5000, 0.8750, 0.2500, -0.3750, 1.188},
- {0.7500, -0.5000, 0.2500, 1.063, -0.3750, 0.8750}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.125, 0.5000, -0.3750, 0.6875},
- {-0.8750, -0.5000, -0.9375, -0.5000, -0.3750, 0.06250},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.8125, -0.5000, -0.5000, 1.188, -0.3750, 0.5000},
- {-0.1875, -0.5000, 0.5000, 0.8750, -0.3125, 0.8750},
- {-0.2500, -0.5000, -0.9375, 0.3125, -0.3125, -0.5000}
- }
- }
- },
- },
-
- ["swlst"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000},
- {-0.3125, -0.5000, -1.000, 0.9375, -0.3125, -0.06250}
- }
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.1875, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.8125, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- },
-
- ["swrst"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000},
- {-0.8125, -0.5000, -1.000, 0.4375, -0.3125, -0.06250}
- }
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.1875, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.5000, -0.5000, 0.5000, 0.5000, -0.3750, 0.8750},
- {-0.8125, -0.5000, -0.8750, 0.5000, -0.3750, -0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- },
-}
-
-default_boxen["swlcr"] = default_boxen["swlst"]
-default_boxen["swrcr"] = default_boxen["swrst"]
-
---flat
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Track"),
- formats={},
-
- get_additional_definiton = function(def, preset, suffix, rotation)
- if default_boxen[suffix] ~= nil and default_boxen[suffix][rotation] ~= nil then
- return default_boxen[suffix][rotation]
- else
- return {}
- end
- end,
-}, advtrains.ap.t_30deg_flat)
-
-minetest.register_craft({
- output = 'advtrains:dtrack_placer 50',
- recipe = {
- {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
- {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
- {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
- },
-})
-
-local y3_boxen = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.8750, -0.5000, -1.125, 0.8750, -0.3750, 0.4375}
- }
- }
- },
-
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625},
- {0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000},
- }
- }
- },
-
- --UX FIXME: - 3way - have to place straight route before l and r or the
- --nodebox overlaps too much and can't place the straight track node.
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.1250, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-1.1250, -0.5000, -0.9375, -0.5000, -0.3750, 0.5000}
- }
- }
- },
-
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- --{-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000},
- {-0.875, -0.5000, -0.5, 1.0, -0.3750, 0.5},
- --{-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625},
- {-0.4375, -0.5000, -0.8750, 0.5625, -0.3750, -0.5000},
- --{0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000},
- {-0.2500, -0.5000, -0.2500, 1.0000, -0.3750, 0.8125},
- }
- }
- },
-}
-
-
-local function y3_turnouts_addef(def, preset, suffix, rotation)
- return y3_boxen[rotation] or {}
-end
--- y-turnout
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_sy",
- texture_prefix="advtrains_dtrack_sy",
- models_prefix="advtrains_dtrack_sy",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Y-turnout"),
- formats = {},
- get_additional_definiton = y3_turnouts_addef,
-}, advtrains.ap.t_yturnout)
-minetest.register_craft({
- output = 'advtrains:dtrack_sy_placer 2',
- recipe = {
- {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''},
- {'', 'advtrains:dtrack_placer', ''},
- },
-})
---3-way turnout
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_s3",
- texture_prefix="advtrains_dtrack_s3",
- models_prefix="advtrains_dtrack_s3",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("3-way turnout"),
- formats = {},
- get_additional_definiton = y3_turnouts_addef,
-}, advtrains.ap.t_s3way)
-minetest.register_craft({
- output = 'advtrains:dtrack_s3_placer 1',
- recipe = {
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''},
- {'', '', ''},
- },
-})
-
--- Diamond Crossings
-
-local perp_boxen = {
- [""] = {}, --default size
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.8125, -0.5000, -0.8125, 0.8125, -0.3750, 0.8125}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
- }
- }
- },
-}
-
--- perpendicular
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_xing",
- texture_prefix="advtrains_dtrack_xing",
- models_prefix="advtrains_dtrack_xing",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Perpendicular Diamond Crossing Track"),
- formats = {},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return perp_boxen[rotation] or {}
- end
-}, advtrains.ap.t_perpcrossing)
-
-minetest.register_craft({
- output = 'advtrains:dtrack_xing_placer 3',
- recipe = {
- {'', 'advtrains:dtrack_placer', ''},
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''}
- }
-})
-
-local ninety_plus_boxen = {
- ["30l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["30r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000},
- {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500},
- {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000},
- {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000}
- }
- }
- },
- ["45l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["45r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["60l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- ["60r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
- {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
- {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
- {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
- }
- }
- },
-}
-
--- 90plusx
--- When you face east and param2=0, then this set of rails has a rail at 90
--- degrees to the viewer, plus another rail crossing at 30, 45 or 60 degrees.
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_xing90plusx",
- texture_prefix="advtrains_dtrack_xing4590",
- models_prefix="advtrains_dtrack_xing90plusx",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("90+Angle Diamond Crossing Track"),
- formats = {},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return ninety_plus_boxen[suffix] or {}
- end,
-}, advtrains.ap.t_90plusx_crossing)
-minetest.register_craft({
- output = 'advtrains:dtrack_xing90plusx_placer 2',
- recipe = {
- {'advtrains:dtrack_placer', '', ''},
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- {'', '', 'advtrains:dtrack_placer'}
- }
-})
-
--- Deprecate any rails using the old name scheme
-minetest.register_lbm({
- label = "Upgrade legacy 4590 rails",
- name = "advtrains_train_track:replace_legacy_4590",
- nodenames = {"advtrains:dtrack_xing4590_st"},
- run_at_every_load = true,
- action = function(pos, node)
- minetest.log("actionPos!: " .. pos.x .. "," .. pos.y .. "," .. pos.z)
- minetest.log("node!: " .. node.name .. "," .. node.param1 .. "," .. node.param2)
- advtrains.ndb.swap_node(pos,
- {
- name="advtrains:dtrack_xing90plusx_45l",
- param1=node.param1,
- param2=node.param2,
- })
- end
-})
--- This will replace any items left in the inventory
-minetest.register_alias("advtrains:dtrack_xing4590_placer", "advtrains:dtrack_xing90plusx_placer")
-
-local diagonal_boxen = {
- ["30r45l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000},
- {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500},
- {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000},
- {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000}
- }
- }
- },
- ["60l30l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- ["60l60r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
- }
- }
- },
- ["60r30r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
- {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
- {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
- {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
- }
- }
- },
- ["30l45r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["60l45r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- ["60r45l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
- {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
- {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
- {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
- }
- }
- },
-}
-
--- Diagonal
--- This set of rail crossings is named based on the angle of each intersecting
--- direction when facing east and param2=0. Rails with l/r swapped are mirror
--- images. For example, 30r45l is the mirror image of 30l45r.
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_xingdiag",
- texture_prefix="advtrains_dtrack_xingdiag",
- models_prefix="advtrains_dtrack_xingdiag",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Diagonal Diamond Crossing Track"),
- formats = {},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return diagonal_boxen[suffix] or {}
- end,
-}, advtrains.ap.t_diagonalcrossing)
-minetest.register_craft({
- output = 'advtrains:dtrack_xingdiag_placer 2',
- recipe = {
- {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''},
- {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'}
- }
-})
----- Not included: very shallow crossings like (30/60)+45.
----- At an angle of only 18.4 degrees, the models would not
----- translate well to a block game.
--- END crossings
-
---slopes
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- second_texture="default_gravel.png",
- description=attrans("Track"),
- formats={vst1={true, false, true}, vst2={true, false, true}, vst31={true}, vst32={true}, vst33={true}},
-}, advtrains.ap.t_30deg_slope)
-
-minetest.register_craft({
- type = "shapeless",
- output = 'advtrains:dtrack_slopeplacer 2',
- recipe = {
- "advtrains:dtrack_placer",
- "advtrains:dtrack_placer",
- "default:gravel",
- },
-})
-
-
---bumpers
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_bumper",
- texture_prefix="advtrains_dtrack_bumper",
- models_prefix="advtrains_dtrack_bumper",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_rail.png",
- --bumpers still use the old texture until the models are redone.
- description=attrans("Bumper"),
- formats={},
-}, advtrains.ap.t_30deg_straightonly)
-minetest.register_craft({
- output = 'advtrains:dtrack_bumper_placer 2',
- recipe = {
- {'group:wood', 'dye:red'},
- {'default:steel_ingot', 'default:steel_ingot'},
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- },
-})
---legacy bumpers
-for _,rot in ipairs({"", "_30", "_45", "_60"}) do
- minetest.register_alias("advtrains:dtrack_bumper"..rot, "advtrains:dtrack_bumper_st"..rot)
-end
--- atc track
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_atc",
- texture_prefix="advtrains_dtrack_atc",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_atc.png",
- description=attrans("ATC controller"),
- formats={},
- get_additional_definiton = advtrains.atc_function
-}, advtrains.trackpresets.t_30deg_straightonly)
-
-
--- Tracks for loading and unloading trains
--- Copyright (C) 2017 Gabriel PĂ©rez-Cerezo <gabriel@gpcf.eu>
-
-local function get_far_node(pos)
- local node = minetest.get_node(pos)
- if node.name == "ignore" then
- minetest.get_voxel_manip():read_from_map(pos, pos)
- node = minetest.get_node(pos)
- end
- return node
-end
-
-
-local function show_fc_formspec(pos,player)
- local pname = player:get_player_name()
- if minetest.is_protected(pos,pname) then
- minetest.chat_send_player(pname, "Position is protected!")
- return
- end
-
- local meta = minetest.get_meta(pos)
- local fc = meta:get_string("fc") or ""
-
- local form = 'formspec_version[4]'..
- 'size[10,5]'..
- 'label[0.5,0.4;Advtrains Loading/Unloading Track]'..
- 'label[0.5,1.1;Set the code to match against the wagon\'s freight code]'..
- 'label[0.5,1.6;A blank field matches all wagons (default)]'..
- 'label[0.5,2.1;Use code # to disable the track section]'..
- 'field[0.5,3;5.5,1;fc;FC;'..minetest.formspec_escape(fc)..']'..
- 'button[6.5,3;3,1;save;Submit]'
- minetest.show_formspec(pname, "at_load_unload_"..advtrains.encode_pos(pos), form)
-end
-
-minetest.register_on_player_receive_fields(function(player, formname, fields)
- local pname = player:get_player_name()
- local pe = string.match(formname, "^at_load_unload_(............)$")
- local pos = advtrains.decode_pos(pe)
- if pos then
- if minetest.is_protected(pos, pname) then
- minetest.chat_send_player(pname, "Position is protected!")
- return
- end
-
- if fields.save then
- minetest.get_meta(pos):set_string("fc",tostring(fields.fc))
- minetest.chat_send_player(pname,"Freight code set: "..tostring(fields.fc))
- show_fc_formspec(pos,player)
- end
- end
-end)
-
-
-local function train_load(pos, train_id, unload)
- local train=advtrains.trains[train_id]
- local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z})
- if not string.match(below.name, "chest") then
- atprint("this is not a chest! at "..minetest.pos_to_string(pos))
- return
- end
-
- local node_fc = minetest.get_meta(pos):get_string("fc") or ""
- if node_fc == "#" then
- --track section is disabled
- return
- end
-
- local inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}})
- if inv and train.velocity < 2 then
- for k, v in ipairs(train.trainparts) do
- local i=minetest.get_inventory({type="detached", name="advtrains_wgn_"..v})
- if i and i:get_list("box") then
-
- local wagon_data = advtrains.wagons[v]
- local wagon_fc
- if wagon_data.fc then
- if not wagon_data.fcind then wagon_data.fcind = 1 end
- wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or ""
- end
-
- if node_fc == "" or wagon_fc == node_fc then
- if not unload then
- for _, item in ipairs(inv:get_list("main")) do
- if i:get_list("box") and i:room_for_item("box", item) then
- i:add_item("box", item)
- inv:remove_item("main", item)
- end
- end
- else
- for _, item in ipairs(i:get_list("box")) do
- if inv:get_list("main") and inv:room_for_item("main", item) then
- i:remove_item("box", item)
- inv:add_item("main", item)
- end
- end
- end
- end
- end
- end
- end
-end
-
-
-
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_unload",
- texture_prefix="advtrains_dtrack_unload",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_unload.png",
- description=attrans("Unloading Track"),
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.ndb.clear(pos)
- end,
- on_rightclick = function(pos, node, player)
- show_fc_formspec(pos, player)
- end,
- advtrains = {
- on_train_enter = function(pos, train_id)
- train_load(pos, train_id, true)
- end,
- },
- }
- end
- }, advtrains.trackpresets.t_30deg_straightonly)
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_load",
- texture_prefix="advtrains_dtrack_load",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_load.png",
- description=attrans("Loading Track"),
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.ndb.clear(pos)
- end,
- on_rightclick = function(pos, node, player)
- show_fc_formspec(pos, player)
- end,
- advtrains = {
- on_train_enter = function(pos, train_id)
- train_load(pos, train_id, false)
- end,
- },
- }
- end
- }, advtrains.trackpresets.t_30deg_straightonly)
-
--- mod-dependent crafts
-local loader_core = "default:mese_crystal" --fallback
-if minetest.get_modpath("basic_materials") then
- loader_core = "basic_materials:ic"
-elseif minetest.get_modpath("technic") then
- loader_core = "technic:control_logic_unit"
-end
---print("Loader Core: "..loader_core)
-
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_load_placer',
- recipe = {
- "advtrains:dtrack_placer",
- loader_core,
- "default:chest"
- },
-})
-loader_core = nil --nil the crafting variable
-
---craft between load/unload tracks
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_unload_placer',
- recipe = {
- "advtrains:dtrack_load_placer",
- },
-})
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_load_placer',
- recipe = {
- "advtrains:dtrack_unload_placer",
- },
-})
-
-
-if mesecon then
- advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_detector_off",
- texture_prefix="advtrains_dtrack_detector",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_detector_off.png",
- description=attrans("Detector Rail"),
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- mesecons = {
- receptor = {
- state = mesecon.state.off,
- rules = advtrains.meseconrules
- }
- },
- advtrains = {
- on_updated_from_nodedb = function(pos, node)
- mesecon.receptor_off(pos, advtrains.meseconrules)
- end,
- on_train_enter=function(pos, train_id)
- advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=advtrains.ndb.get_node(pos).param2})
- if advtrains.is_node_loaded(pos) then
- mesecon.receptor_on(pos, advtrains.meseconrules)
- end
- end
- }
- }
- end
- }, advtrains.ap.t_30deg_straightonly)
- advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_detector_on",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_detector_on.png",
- description="Detector(on)(you hacker you)",
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- mesecons = {
- receptor = {
- state = mesecon.state.on,
- rules = advtrains.meseconrules
- }
- },
- advtrains = {
- on_updated_from_nodedb = function(pos, node)
- mesecon.receptor_on(pos, advtrains.meseconrules)
- end,
- on_train_leave=function(pos, train_id)
- advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=advtrains.ndb.get_node(pos).param2})
- if advtrains.is_node_loaded(pos) then
- mesecon.receptor_off(pos, advtrains.meseconrules)
- end
- end
- }
- }
- end
- }, advtrains.ap.t_30deg_straightonly_noplacer)
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_detector_off_placer',
- recipe = {
- "advtrains:dtrack_placer",
- "mesecons:wire_00000000_off"
- },
-})
-end
---TODO legacy
---I know lbms are better for this purpose
-for name,rep in pairs({swl_st="swlst", swr_st="swrst", swl_cr="swlcr", swr_cr="swrcr", }) do
- minetest.register_abm({
- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_"..name},
- interval = 1.0, -- Operation interval in seconds
- chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep, param2=node.param2}) end,
- })
- minetest.register_abm({
- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_"..name.."_45"},
- interval = 1.0, -- Operation interval in seconds
- chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep.."_45", param2=node.param2}) end,
- })
-end
-
-if advtrains.register_replacement_lbms then
-minetest.register_lbm({
- name = "advtrains:ramp_replacement_1",
--- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_vert1"},
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst1", param2=(node.param2+2)%4}) end,
-})
-minetest.register_lbm({
- name = "advtrains:ramp_replacement_1",
--- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_vert2"},
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst2", param2=(node.param2+2)%4}) end,
-})
- minetest.register_abm({
- name = "advtrains:st_rep_1",
- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_st"},
- interval=1,
- chance=1,
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st", param2=node.param2}) end,
- })
- minetest.register_lbm({
- name = "advtrains:st_rep_1",
- -- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_st_45"},
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st_45", param2=node.param2}) end,
- })
-end
+-- advtrains_train_track
+-- rewritten to work with advtrains 2.5 track system
+
+local function conns(c1, c2, r1, r2) return {{c=c1, y=r1}, {c=c2, y=r2}} end
+local function conns3(c1, c2, c3, r1, r2, r3) return {{c=c1, y=r1}, {c=c2, y=r2}, {c=c3, y=r3}} end
+
+
+local common_def = {
+ drawtype = "mesh",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2},
+ },
+
+ mesh_suffix = ".b3d",
+ tiles = { "advtrains_dtrack_shared.png" },
+
+ groups = {
+ advtrains_track=1,
+ advtrains_track_default=1,
+ dig_immediate=2,
+ --not_in_creative_inventory=1,
+ },
+
+ can_dig = advtrains.track_can_dig_callback,
+ after_dig_node = advtrains.track_update_callback,
+ after_place_node = advtrains.track_update_callback,
+
+ drop = "advtrains:dtrack_placer"
+}
+
+-- Normal tracks, straight and curved
+advtrains.register_node_4rot("advtrains:dtrack_st",
+ advtrains.merge_tables(common_def, {
+ description=attrans("Track Straight"),
+ mesh_prefix="advtrains_dtrack_st",
+ at_conns = conns(0,8),
+ advtrains = {
+ trackworker_next_var = "advtrains:dtrack_cr",
+ track_place_group = "advtrains:dtrack",
+ track_place_single = true,
+ },
+ })
+)
+
+advtrains.register_node_4rot("advtrains:dtrack_cr",
+ advtrains.merge_tables(common_def, {
+ description=attrans("Track Curve"),
+ mesh_prefix="advtrains_dtrack_cr",
+ at_conns = conns(0,7),
+ advtrains = {
+ trackworker_next_var = "advtrains:dtrack_swlst",
+ track_place_group = "advtrains:dtrack",
+ },
+ })
+)
+
+-- simple turnouts left and right
+
+local stm_left = {
+ st = "advtrains:dtrack_swlst",
+ cr = "advtrains:dtrack_swlcr",
+}
+
+advtrains.register_node_4rot("advtrains:dtrack_swlst",
+ advtrains.merge_tables(common_def, {
+ description=attrans("Track Turnout Left Straight"),
+ mesh_prefix="advtrains_dtrack_swlst",
+ at_conns = conns3(0,8,7),
+ at_conn_map = {2,1,1},
+ on_rightclick = advtrains.state_node_on_rightclick_callback,
+ advtrains = {
+ node_state = "st",
+ node_next_state = "cr",
+ node_state_map = stm_left,
+ trackworker_next_var = "advtrains:dtrack_swrst"
+ },
+ })
+)
+
+advtrains.register_node_4rot("advtrains:dtrack_swlcr",
+ advtrains.merge_tables(common_def, {
+ description=attrans("Track Turnout Left Curve"),
+ mesh_prefix="advtrains_dtrack_swlcr",
+ at_conns = conns3(0,8,7), -- note: conns must stay identical
+ at_conn_map = {3,1,1}, -- now points to curve branch
+ on_rightclick = advtrains.state_node_on_rightclick_callback,
+ advtrains = {
+ node_state = "cr",
+ node_next_state = "st",
+ node_state_map = stm_left,
+ trackworker_next_var = "advtrains:dtrack_swrcr"
+ },
+ })
+)
+
+local stm_right = {
+ st = "advtrains:dtrack_swrst",
+ cr = "advtrains:dtrack_swrcr",
+}
+
+advtrains.register_node_4rot("advtrains:dtrack_swrst",
+ advtrains.merge_tables(common_def, {
+ description=attrans("Track Turnout Right Straight"),
+ mesh_prefix="advtrains_dtrack_swrst",
+ at_conns = conns3(0,8,9),
+ at_conn_map = {2,1,1},
+ on_rightclick = advtrains.state_node_on_rightclick_callback,
+ advtrains = {
+ node_state = "st",
+ node_next_state = "cr",
+ node_state_map = stm_right,
+ trackworker_next_var = "advtrains:dtrack_st"
+ },
+ })
+)
+
+advtrains.register_node_4rot("advtrains:dtrack_swrcr",
+ advtrains.merge_tables(common_def, {
+ description=attrans("Track Turnout Right Curve"),
+ mesh_prefix="advtrains_dtrack_swrcr",
+ at_conns = conns3(0,8,9), -- note: conns must stay identical
+ at_conn_map = {3,1,1}, -- now points to curve branch
+ on_rightclick = advtrains.state_node_on_rightclick_callback,
+ advtrains = {
+ node_state = "cr",
+ node_next_state = "st",
+ node_state_map = stm_right,
+ trackworker_next_var = "advtrains:dtrack_st"
+ },
+ })
+)
+
+-- register placer item
+minetest.register_craftitem(":advtrains:dtrack_placer", {
+ description = attrans("Track"),
+ inventory_image = "advtrains_dtrack_placer.png",
+ wield_image = "advtrains_dtrack_placer.png",
+ groups={advtrains_trackplacer=1, digtron_on_place=1},
+ liquids_pointable = false,
+ on_place = function(itemstack, placer, pointed_thing)
+ local name = placer:get_player_name()
+ if not name then
+ return itemstack, false
+ end
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.above
+ local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0})
+ if not advtrains.check_track_protection(pos, name) then
+ return itemstack, false
+ end
+ if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to then
+ local s = minetest.registered_nodes[minetest.get_node(upos).name] and minetest.registered_nodes[minetest.get_node(upos).name].walkable
+ if s then
+-- minetest.chat_send_all(nnprefix)
+ local yaw = placer:get_look_horizontal()
+ advtrains.trackplacer.place_track(pos, "advtrains:dtrack", name, yaw)
+ if not advtrains.is_creative(name) then
+ itemstack:take_item()
+ end
+ end
+ end
+ end
+ return itemstack, true
+ end,
+})
+
+
+--TODO restore mesecons! \ No newline at end of file